本質就是迭代器,手動寫的迭代器
生成器函式
def func():
print (123)
yield '生成器'
func() ## 執行結果 :沒有結果
'''******'''
ret = func() ## 這個過程相當於 例項化物件
'''******'''
print(ret) #生成器物件
# 想執行這個 要用next() 和迭代器一樣 或者遍歷它
next(ret) ## 123
print(next(ret)) ## 111 2 # 如果生成器中沒有yield了,再呼叫next會報錯
生成器函式的坑(1)## for迴圈中的生成器
def add(n, i):
return n+i
def test():
for i in range(4):
yield i
g = test()
for n in [1, 10, 5]:
g = (add(n, i) for i in g)
print(list(g)) # 結果是 [15, 16, 17, 18]
## 關鍵點在於生成器相當於函式,不呼叫就不執行,只有最後list(g)了,才一層一層的解開
# for迴圈3次 相當於
n = 1
g = ((n+i) for i in test())
n = 10
g = ((n+i) for i in g(此時的g是((n+i) for i in test()) ))
n = 5
g = ((n+i) for i in g(此時的g是 ((n+i) for i in ((n+i) for i in test()) )))
list(g) 的時候才 開始執行這個表示式 此時n已經是 5 了
## 最後的結果也就是迴圈幾層,取幾次5,再與g的各項相加取值
5*3+0,5*3+1,5*3+2,5*3+3
生成器的坑(2)def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g1))## list(g1)相當於在底層for迴圈,也就是next(g1),到最後一層
print(list(g2)) ## 所以當list(g2)時,for遍歷g1,next(g1)指不到東西
生成器的坑(3)v = (lambda :x for x in range(10))
print(v)
print(next(v))
print(next(v)())
## 生成器位址
## 匿名函式位址
## 1 因為 生成器是next() 一次執行一次, 上一次next執行到 x = 1 所以這次執行匿名函式返回1(生成器表示式,next一次可以理解為裡面的**走一圈)
## 生成器 next執行一次 for 迴圈 執行到底 list() 執行到底
阻塞
return 和 yield
## return 結束函式,給函式的執行者返回值
## yield 不結束函式,給next(func()) 返回值
def func():
l = [1,2,3]
yield from l
fun = func()
print (next(fun)) # 1
print (next(fun))# 2
print (next(fun))# 3,
## 取代了for迴圈,將可迭代物件中的每一項元素依次取出來
lambda x,y:x+y
不呼叫,不執行,不呼叫,不執行
## 列表推導式
l = [i for i in iterable if i...]
## 一行**實現九九乘法表
'\n'.join([' '.join([f'*='for j in range(1,i+1)]) for i in range(1,10)])
# 生成器表示式
obj = (i for i in iterable if i...)
## 取值方式
# 第一種
print(next(obj))
# 第二種
for i in obj:
print(i)
# 第三種
print (list(obj))
min
# 引數列表可以放key的
min()
max()
sorted()
# 例如 min()
dic =
print(min(dic)) # 此時返回的結果為 a
print (min(dic,key=lambda x:x)) ## 相當於將dic遍歷傳入 lambda表示式(函式)中,return 的是什麼就按照什麼比較,這個x是dic的key,所以返回的也是字典的key
zip## zip ## 將傳入的可迭代物件,按相同索引組合成乙個元組,直到其中一項到索引最後一項
def zipp(*iterable):
obj = object()
iterators = [iter(it) for it in iterable]
while iterators:
result =
for it in iterators:
em = next(it,obj)
if em is obj:
return
yield tuple(result)
a = zipp('asd','zxc','qwe')
while 1:
try:
print(next(a))
except:
break
print(list(a)) # [('a', 'z', 'q'), ('s', 'x', 'w'), ('d', 'c', 'e')]
## 返回的是迭代器物件
filter## 過濾
filter(func,lst)
lst = [,,,]
ls = filter(lambda e:e['age'] > 16,lst)
print(list(ls))
結果:[, ]
## 返回的是迭代器物件
map
# map 對映函式
lis = [1,2,3,4,5]
for i in map(lambda x:x**2,lis):
print(i)
# 1,4,9,16,25
lis1 = [1,2,3,4,5]
m1 = map(lambda x,y:x+y,lis,lis2)
for i in m1:
print(i) # 2,
4,6,8,10
## 返回的是迭代器物件
reduce
## 歸併函式
from functools import reduce
l = [1,2,3,4]
ret = reduce(lambda x,y:x*y,l)
print(ret)
## 解決階乘
# 返回的是值
python 迭代器 生成器 內建函式
迭代器是迭代取值的工具,迭代是乙個重複的過程,每一次重複都是基於上一次的結果而來的.為什麼要用迭代器呢?1.可以不依賴索引取值 2.同一時刻在記憶體中只有乙個值,不會過多的占用記憶體 如何用迭代器?可迭代的物件 但凡內建有 iter 方法的物件都是可迭代的物件,列如str,list,dict,tup...
生成器 內建函式I 12
生成器 生成器函式獲得生成器 函式 def func print 111 print 222 return 3 ret func print ret 生成器函式 def func print 111 print 222 yield 3 a 1 b 2 c a b print c yield 4 re...
python 生成器物件 常見內建函式
目錄try name except exception as e print 錯誤 else print 正常才會執行了 finally print 不管是否異常都會執行 斷言 name jason assert isinstance name,str 主動丟擲異常 raise zerodivisi...