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

python入门(十三):生成器和迭代器

2017-08-13 20:57 411 查看


1.生成器

    (1)通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

    (2)创建generator

           (一)把一个列表生成式的
[]
改成
()
,就创建了一个generator:

l = [x+1 for x in range(5)]#列表生成式
print(l)
l2 = (x+1 for x in range(5))#生成器
print(l2)

[1, 2, 3, 4, 5]

<generator object <genexpr> at 0x0391ADE0>

如果要一个一个打印出来,可以通过
next()
函数获得generator的下一个返回值,当然一般也是使用FOR
来打印

for n in l2:
print(n)


如果推算的算法比较复杂,用类似列表生成式的
for
循环无法实现的时候,还可以用函数来实现。比如,著名的斐波拉契数列(Fibonacci)除第一个和第二个数外,任意一个数都可由前两个数相加得到:1,
1, 2, 3, 5, 8, 13, 21, 34, ...

 
    (二)要把
fib
函数变成generator,只需要把
print(b)
改为
yield
b
就可以了,generator和函数的执行流程不一样。函数是顺序执行,遇到
return
语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用
next()
的时候执行,遇到
yield
语句返回,再次执行时从上次返回的
yield
语句处继续执行。

def fib(max):
n, a, b = 0, 0, 1
while n < max:
#print(b)
yield b
a, b = b, a+b
n = n + 1
data = fib(100)
for i in range(100):
print(data.__next__())



2.迭代器

我们已经知道,可以直接作用于
for
循环的数据类型有以下几种:

一类是集合数据类型,如
list
tuple
dict
set
str
等;

一类是
generator
,包括生成器和带
yield
的generator function。

这些可以直接作用于
for
循环的对象统称为可迭代对象:
Iterable


可以使用
isinstance()
判断一个对象是否是
Iterable
对象:

from collections import Iterable
print(isinstance([], Iterable))


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


可以使用
isinstance()
判断一个对象是否是
Iterator
对象:

from collections import Iterator
print(isinstance((x for x in range(10)), Iterator))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: