1. 可迭代對(duì)象
可以直接作用于for循環(huán)的對(duì)象統(tǒng)稱(chēng)為可迭代對(duì)象:Iterable婿滓。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterable對(duì)象淌哟。
from collections import Iterable
print(isinstance([], Iterable)) #列表是可迭代對(duì)象
print(isinstance({}, Iterable)) #字典是
print(isinstance('abc', Iterable)) #字符串是
print(isinstance((x for x in range(10)), Iterable)) #生成器是可迭代對(duì)象
print(isinstance(100, Iterable)) #整數(shù)不是可迭代對(duì)象
print(isinstance((), Iterable)) #元組是
True
True
True
True
False
True
2. 迭代器
可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱(chēng)為迭代器:Iterator席赂。
可以使用isinstance()判斷一個(gè)對(duì)象是否是Iterator對(duì)象。
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對(duì)象霹抛,但list谴咸、dict轮听、str雖然是Iterable,卻不是Iterator岭佳。
3. 生成器
生成器指的就是生成器對(duì)象:
生成器其實(shí)是一種特殊的迭代器血巍。
- 可以由生成器表達(dá)式得到;
#(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
- 可以使用yield關(guān)鍵字得到一個(gè)生成器函數(shù)驼唱,調(diào)用這個(gè)函數(shù)得到一個(gè)生成器對(duì)象藻茂。
- 函數(shù)體中包含yield語(yǔ)句的函數(shù),反正生成器對(duì)象
- 生成器對(duì)象玫恳,是延遲計(jì)算辨赐、惰性求值的。
#實(shí)現(xiàn)計(jì)數(shù)器
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
#打印斐波那契數(shù)列
def fib():
x = 0
y = 1
while True:
yield y
x, y = y, x+y
foo = fib() #調(diào)用了yield的函數(shù)才是生成器
print(type(foo)) #foo是個(gè)生成器
for _ in range(5):
print(next(foo)) #打印5次 next(foo)
for _ in range(100):
next(foo) #先執(zhí)行100次next(foo)
print(next(foo)) #再打印出第101次
<class 'generator'>
1
1
2
3
5
6356306993006846248183
4. 總結(jié)
關(guān)系圖:
http://qiniu.mykernel.cn/%E7%94%9F%E6%88%90%E5%99%A8.png
更多歡迎訪問(wèn):http://www.mykernel.cn/