1. 程式人生 > >python3生成器

python3生成器

__next__ 列表推導式 不能 循環 python3 none *** 報錯 []

一、生成器函數

1.yield關鍵字

定義:含義yield關鍵字的函數,是生成器函數

作用:返回值,不終止函數,若yield後無值,則返回None

用法:與return關鍵字不能共存,必須在函數內部

2.調用函數

調用生成器函數返回的是生成器

3.常用方法

1)__next__()

格式:生成器.__next__()

作用:執行生成器函數內部代碼,遇到yeild關鍵字停止,並返回值,若沒有yield作為結尾,會報錯

# 生成器函數
def generator():
    print(1)
    yield a
    print(2)
    yield
c g = generator() # g是生成器 print(g) ret = g.__next__() # 執行生成器函數內部代碼直到遇到yield print(ret)

2)for循環

作用:執行生成器內部代碼,結尾不是yield關鍵字,不會報錯

# 生成器函數
def generator():
    print(1)
    yield a
    print(2)
    yield c


g = generator()     # g是生成器
for i in g:
    print(i)

3)send()

格式:send(傳遞的數據)

作用:執行下面的代碼,給上一個yield位置傳遞數據

註意:不能在初始或最後使用send()方法

def generator():
    print(1)
    count = yield a
    print(count)
    print(2)
    yield c


g = generator()     # g是生成器
ret1 = g.__next__()
print(>>>{}.format(ret1))     # str格式輸出 format
# g.__next__()
ret2 = g.send(a123) print(***%s % ret2) # 格式化輸出

4)yield from

作用:簡化代碼

格式:yield from 可叠代對象

def generator():
    # for i in range(10):
    #     yield i
    yield from range(10)    # 和for循環的作用一樣


g = generator()
for i in g:
    print(i)    

二、生成器表達式

1.格式:生成器 = (為True操作 for i in 可叠代對象 if 條件)

2.分類

遍歷

篩選

# 遍歷,1-10
g = (i for i in range(1, 11))
for i in g:
    print(i)
# 篩選
g = (i**2 for i in range(10) if i > 5)
for i in g:
    print(i)

三、推導式

1.列表推導式

# 遍歷,1-10
li1 = [i for i in range(1, 11)]
print(li1)

# 篩選
li2 = [i**2 for i in range(10) if i > 5]
print(li2)

列表推導式和生成器表達式的區別:

1)格式:列表推導式[],生成器表達式()

2)內存消耗:生成器表達式消耗內存少

2.字典推導式

# 把value值變成大寫
dic = {k1: v1, k2: v2, k3: v3}
dic1 = {k: dic[k].upper() for k in dic}
print(dic1)
# 篩選
dic2 = {k: dic[k] for k in dic if dic[k] == v3}
print(dic2)

3.集合推導式

# 遍歷
set1 = {-1, 1, -2, 2}
set2 = {i**2 for i in set1}     # 集合,去重
print(set2)

# 篩選
set3 = {i*i for i in set1 if i == 2}
print(set3)

python3生成器