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']
python
文件对象具有一个名为__next__的方法,__next__方法就是迭代器协议的一部分,要么返回迭代中的下一项,要么抛出StopIteration异常。

for循环会自动调用__next__方法获取文件中的内容,与此同时,for循环也会通过结束for循环的方式自动处理StopIteration异常

生成器

python使用生成器对延迟操作提供了支持。

延迟操作是指在需要的时候才产生结果,而不是立即产生结果

python生成器方法有两种:

  1. 生成器函数:与普通函数定义类似,但是,使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间挂起函数的状态,以便下次从他离开的地方继续执行

  2. 生成器表达式,类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

生成器与函数:

python的生成器函数和常规函数在语法几乎是一模一样的,但差别在于:

1.语法上:生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值

2.使用上:python的生成器自动实现了迭代器协议,由于生成器实现了迭代器协议,可以在迭代环境中使用生成器(for sum min)

3.实现上:生成器的yield语句挂起生成函数的状态,保留足够的信息,以便之后从离开的地方继续执行

使用生成器比不使用生成器代码更加清晰

posted on 2019-01-09 15:20  ykyk_dba  阅读(141)  评论(0编辑  收藏  举报

导航