通常我们这样编码:
while True:
job = queue.get()
...
Run Code Online (Sandbox Code Playgroud)
但它是否也可以做以下事情:
for job in queue.get():
#do stuff to job
Run Code Online (Sandbox Code Playgroud)
我想要这样做的真正原因是因为我想使用python-progressbar的自动检测maxval.他们这样做for this in progressbar(that):
所以,我正在观看Raymond Hettinger的演讲,将代码转换为美丽的,惯用的Python,并且他提出了iter我从未意识到的这种形式.他的例子如下:
代替:
blocks = []
while True:
block = f.read(32)
if block == '':
break
blocks.append(block)
Run Code Online (Sandbox Code Playgroud)
使用:
blocks = []
read_block = partial(f.read, 32)
for block in iter(read_block, ''):
blocks.append(block)
Run Code Online (Sandbox Code Playgroud)
检查完文档后iter,我发现了一个类似的例子:
with open('mydata.txt') as fp:
for line in iter(fp.readline, ''):
process_line(line)
Run Code Online (Sandbox Code Playgroud)
这看起来对我很有用,但我想知道你是否Pythonistas知道这个构造的任何不涉及I/O读取循环的例子?也许在标准库中?
我可以想到非常人为的例子,如下所示:
>>> def f():
... f.count += 1
... return f.count
...
>>> f.count = 0
>>> list(iter(f,20))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …Run Code Online (Sandbox Code Playgroud) 我想从一个文件中读取一个数字列表,一次只能查询一个字符,以检查该字符是什么,无论是数字,句号,+或 - ,e还是E,还是其他一些字符. ..然后根据它执行我想要的任何操作.如何使用我已有的现有代码执行此操作?这是我尝试过的一个例子,但没有用.我是python的新手.提前致谢!
import sys
def is_float(n):
state = 0
src = ""
ch = n
if state == 0:
if ch.isdigit():
src += ch
state = 1
...
f = open("file.data", 'r')
for n in f:
sys.stdout.write("%12.8e\n" % is_float(n))
Run Code Online (Sandbox Code Playgroud)