iter函数有个特性就是接受一个callable对象和一个标记值作为输入参数。通过iter函数这个特性创建迭代器后,会不断调用callable对象直到返回值和标记值相等时终止。
iter函数的该特性用于重复调用的函数时会有很好的效果,如I/O操作等。简单来说如果需要从文件中以数据块的方式读取数据直到读取完成,一般的做法是重复的执行read()直到检测到文件结尾时终止。
本文将介绍另一种通过iter迭代器的方式来对比两种方式的差异。
常规操作import syswith open('/etc/passwd') as f_obj: while True: data = f_obj.read(10) if data == '': break n = sys.stdout.write(data)iter代替操作import syswith open('/etc/passwd') as f_obj: for chunk in iter(lambda: f_obj.read(10), ''): n = sys.stdout.write(chunk)使用一个简单的 iter() 调用就可以将两者结合起来了。 其中 lambda 函数参数是为了创建一个无参的 callable 对象,并为 recv 或 read() 方法提供了 size 参数。