您的位置:首页 > 编程语言 > Python开发

Python 中 生成器、迭代器、可迭代对象 的概念

2018-02-12 17:46 756 查看

生成器

在 Python 中,一边循环一边计算的机制,称为 生成器(generator)

可以通过 next() 函数获得 generator 的下一个返回值

生成器 的两种表示方法:

1、将列表生成式的 [ ] 改为 ( )

[2*x for x in range(10)] => (2*x for x in range(10))

2、使用 yield 关键字

以裴波拉切数列为例

In [1]: def fib(max):    # fib 是生成器函数
...:     n, a, b = 0, 0, 1
...:     while n < max:
...:         yield b
...:         a, b = b, a + b
...:         n = n + 1
...:     return 'done'
...:

In [2]: fib(5)          # 具体的 fib(5) 才是生成器
Out[2]: <generator object fib at 0x05098CF0>

In [3]: g = fib(5)

In [4]: next(g)
Out[4]: 1
​
In [5]: next(g)
Out[5]: 1
​
In [6]: next(g)
Out[6]: 2
​
In [7]: next(g)
Out[7]: 3

In [8]: next(g)
Out[8]: 5
​
In [9]: from inspect import isgeneratorfunction
​
In [10]: isgeneratorfunction(fib)                  # 判断是否是 generator function
Out[10]: True

In [11]: import types
​
In [12]: isinstance(fib(5), types.GeneratorType)    # 判断是否是 generator
Out[12]: True


迭代器,可迭代对象

能作用于 for 循环的都是 可迭代对象(Iterable),包括内置的 集合数据类型 和 生成器

可以被 next() 函数调用并不断返回下一个值的对象称为 迭代器(Iterator)

生成器都是 Iterator对象,但 list、dict、str 虽然是 Iterable,却不是 Iterator

可以使用 iter() 将 Iterable 转换为 Iterator

In [13]: import collections

In [14]: isinstance('abc', collections.Iterable)       # 判断是否是 Iterable
Out[14]: True
​
In [15]: isinstance('abc', collections.Iterator)       # 判断是否是 Iterator
Out[15]: False

In [16]: isinstance(iter('abc'), collections.Iterator)
Out[16]: True
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息