Python--迭代器&生成器
为什么文件还可以使用for循环进行遍历呢?
文件对象在python中实现了迭代器协议,for循环并不知道他遍历的是一个文件对象,他只负责使用迭代器协议访问对象
In [3]: f = open('/etc/passwd') In [4]: dir(f) Out[4]: ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines']
for循环会自动调用__next__方法获取文件中的内容,与此同时,for循环也会通过结束for循环的方式自动处理StopIteration异常
生成器
python使用生成器对延迟操作提供了支持。
延迟操作是指在需要的时候才产生结果,而不是立即产生结果
python生成器方法有两种:
生成器函数:与普通函数定义类似,但是,使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间挂起函数的状态,以便下次从他离开的地方继续执行
生成器表达式,类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
生成器与函数:
python的生成器函数和常规函数在语法几乎是一模一样的,但差别在于:
1.语法上:生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
2.使用上:python的生成器自动实现了迭代器协议,由于生成器实现了迭代器协议,可以在迭代环境中使用生成器(for sum min)
3.实现上:生成器的yield语句挂起生成函数的状态,保留足够的信息,以便之后从离开的地方继续执行
使用生成器比不使用生成器代码更加清晰
Nothing is true,Nothing is fake.