python 生成器

1、生成器函數

1.yield關鍵字函數

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

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

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

2.調用函數協程

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

3.經常使用方法blog

1)__next__()內存

格式:生成器.__next__()generator

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

# 生成器函數
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)       # 格式化輸出

 

# 預激協程,求平均值


def init(func):
    def inner(*args, **kwargs):
        g = func(*args, **kwargs)
        next(g)     # g.__next__() 同樣
        return g
    return inner


@init
def average():
    total = 0
    count = 0
    average = None
    while True:
        term = yield average
        total += term
        count += 1
        average = total/count


av = average()
av1 = av.send(10)
av2 = av.send(20)
av3 = av.send(30)
print(av3)

 

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)    

 

2、生成器表達式

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)

 

3、推導式

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)

 4、總結

1.生成器的本質是迭代器

2.yield關鍵字

做用:返回值

3.調用生成器函數得到的值是生成器

4.生成器函數的方法:

__next__(),執行生成器函數內部代碼,直到遇到yield

for循環

send(),取值,傳遞數據給上一個yield位置

yield from,可迭代,返回值,不是總體

5.生成器表達式,獲取的是生成器

6.生成器取值,next方法,for循環,數據類型的強轉(生成器->list),send

7.一個生成器裏的值,只能取一次,並且不找它要的時候,它是不會取的

 

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))
print(list(g2))
相關文章
相關標籤/搜索