- 迭代器代替 while 无限循环
- 问题:
- 在代码中使用 while 循环来迭代处理数据,因为它需要某个函数或者一般迭代模式中不同的测试条件。能不能用迭代 器来重写这个循环呢?
- 解决方案:
- 一个常见的 IO 操作程序可能会像下面这样:
CHUNKSIZE = 8192
def reader(s):
while True:
data = s.recv(CHUNKSIZE)
if data == "b":
break
process_data(data)
- 这种代码通常可以使用 iter() 来代替:
def reader2(s):
for chunk in iter(lambda: s.recv(CHUNKSIZE),b""):
pass
- 下面是一个例子:
import sys
f = open("password.txt")
for chunk in iter(lambda: f.read(10), " "):
n = sys.stdout.write(chunk)
-
讨论:iter 函数一个鲜为人知的特性是他接受一个可选的 callable 对象和一个标记(结尾)值作为输入参数。所以 以这种方式使用的时候,它会创建一个迭代器,这个迭代器会不断调用 callable 对象直到返回值和标记值相等为止。
-
这种特殊方法对于一些特定的会被重复调用的函数很有效果,比如涉及到I/O调用的函数。举例来说,如果想从套接字或 文件中以数据块的方式读取数据,通常要不断重复的执行read()或者recv(),并在后面紧跟一个文件结尾测试来决定 是否终止。这节中的方案使用一个简单的iter()调用就可以将两者结合起来。其中 lambda 函数参数是为了创建一个 无参的 callbale 对象,并为 recv 或者 read()方法提供了size 参数。