python的生成器

1. 可迭代对象

可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象。

1
2
3
4
5
6
7
from collections import Iterable
print(isinstance([], Iterable)) #列表是可迭代对象
print(isinstance({}, Iterable)) #字典是
print(isinstance('abc', Iterable)) #字符串是
print(isinstance((x for x in range(10)), Iterable)) #生成器是可迭代对象
print(isinstance(100, Iterable)) #整数不是可迭代对象
print(isinstance((), Iterable)) #元组是
True
True
True
True
False
True

2. 迭代器

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

1
2
3
4
5
from collections import Iterator
print(isinstance((x for x in range(10)), Iterator))
print(isinstance([], Iterator))
print(isinstance({}, Iterator))
print(isinstance('abc', Iterator))
True
False
False
False

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

3. 生成器

生成器指的就是生成器对象:
生成器其实是一种特殊的迭代器。

  1. 可以由生成器表达式得到;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #(expr for iter_var in iterable) 

    L= (i +1 for i in range(10) if i %2)
    print(type(L))
    print(next(L))
    print(next(L))
    print(next(L))

    #generator 生成器

    <class 'generator'>
    2
    4
    6
  2. 可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象。

  • 函数体中包含yield语句的函数,反正生成器对象
  • 生成器对象,是延迟计算、惰性求值的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#实现计数器
def inc():
def counter():
i = 0
while True:
i += 1
yield i
c= counter() #c是生成器,可以使用next求值
return lambda : next(c)

foo = inc()

print(foo())
print(foo())
1
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#打印斐波那契数列
def fib():
x = 0
y = 1
while True:
yield y
x, y = y, x+y

foo = fib() #调用了yield的函数才是生成器
print(type(foo)) #foo是个生成器

for _ in range(5):
print(next(foo)) #打印5次 next(foo)

for _ in range(100):
next(foo) #先执行100次next(foo)
print(next(foo)) #再打印出第101次
<class 'generator'>
1
1
2
3
5
6356306993006846248183

4. 总结

关系图:

生成器
---------------- 谢谢光临 ----------------
0%