生成器 內建函式

2022-05-15 16:15:50 字數 3879 閱讀 4623

本質就是迭代器,手動寫的迭代器

生成器函式

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...