16 生成器以及表示式

2022-07-19 07:06:17 字數 2964 閱讀 7553

目錄

二、表示式

生成器又可以叫自定義迭代器,若函式體包含yield關鍵字,再呼叫函式,並不會執行函式體**,得到的返回值即生成器物件

def func():

print('我是蒙奇d路飛')

yield 1

print('乙個要成為')

yield 2

print('海賊王的男人')

yield 3

# 呼叫階段

func() # 不會執行

g = func() # 把函式呼叫賦值給另外乙個函式

res = next(g) # 用next觸發函式體**執行,直到遇到yield停止,並將yield的返回值賦值給res

print(res) # 列印yield的返回值

res = next(g) # 再次呼叫,函式從上次暫停位置繼續執行,直到再次遇到yield停止...

print(res)

res = next(g) # 周而復始

print(res)

既然生成器物件屬於迭代器,那麼必然可以用for迴圈迭代

# 呼叫階段

for i in func():

print(i)

總結來說 只需要記住 當乙個函式體裡有yield的時候,再去呼叫函式,是不會執行裡面的**的,而是會生成乙個自定義迭代器(又叫:生成器),再用next才能觸發函式體**的執行

def weapons(name):

print('開始**')

while true:

x = yield

print('%s 開箱竟獲得了一把 %s' % (name, x))

g = weapons('湖北吳彥祖') # 拿到生成器物件

g.send(none) # 等同於next(g),讓生成器在x = yield處準備好,等待傳值

g.send('霜之哀傷') # 裡面的引數給yield,然後賦值給x,再列印,下次迴圈時又掛在yield處

g.send('火之高興') # 和上面一樣

g.send('一坨寂寞') # 樓上+1

# 執行結果

開始**

湖北吳彥祖 開箱竟獲得了一把 霜之哀傷

湖北吳彥祖 開箱竟獲得了一把 火之高興

湖北吳彥祖 開箱竟獲得了一把 一坨寂寞

def drinks():

list_a =

while true:

list_b = yield list_a

print(list_a)

a = drinks() # 獲得生成器物件

a.send(none) # 初始化生成器

a.send("百事可樂")

a.send("可口可樂")

a.send("嶗山可樂")

a.send("非常可樂")

# 執行結果

['百事可樂']

['百事可樂', '可口可樂']

['百事可樂', '可口可樂', '嶗山可樂']

['百事可樂', '可口可樂', '嶗山可樂', '非常可樂']

表示式可以讓**更加精簡,且不失可讀性。

# 需求:判斷x大於y時,返回x的值,否則返回y的值

x = 1

y = 2

if x > y:

print(x)

else:

print(y)

# 語法格式:條件成立要返回的值 if 條件 else 條件不成立返回的值

print(x if x > y else y) # 這就是三元表示式

# 需求:篩選出 帥逼人員的 名單

list1 = ['吳彥祖-帥逼', '彭于晏-帥逼', '周潤發-帥逼', 'poco-帥逼', '美國懂王-sb']

new_list = # 先定義乙個空列表

for name in list1: # for迴圈遍歷出list1的元素

if name.endswith('帥逼'): # 判斷是否以帥逼結尾

print(new_list)

# 列表生成器

new_list = [name for name in list1 if name.endswith('帥逼')]

print(new_list)

list1 = ['wyz-sg', 'pyy-sg', 'zrf-sg', 'wh-sg', 'mgdw-sb']

# 所有小寫字母變大寫

list1 = [name.upper() for name in list1]

# 所有名字去掉字尾sg

list1 = [name.strip('-sg') for name in list1]

# 案例1

keys = ['name', 'age', 'gemder']

dic =

print(dic)

# 案例2

items = [('name', 'poco'), ('age', 18), ('gender', 'male')]

res =

print(res)

keys = ['name', 'age', 'gemder']

set1 =

print(set1)

res = (i for i in range(5))

print(next(res))

print(next(res))

生成器表示式

生成器 生成器本質是迭代器,允許自定義邏輯的迭代器 迭代器和生成器區別 迭代器本身是系統內建的.重寫不了.而生成器是使用者自定義的,可以重寫迭代邏輯 生成器可以用兩種方式建立 1 生成器表示式 裡面是推導式,外面用圓括號 2 生成器函式 用def定義,裡面含有yield 1 生成器表示式 gener...

生成器 表示式

1.什麼是生成器?生成的工具。生成器是乙個 自定義 的迭代器,本質上是乙個迭代器。2.如何實現生成器但凡在函式內部定義了的yield,呼叫函式時,函式體 不會執行,會返回乙個結果,該結果就是乙個生成器。yield 每一次yield都會往生成器物件中新增乙個值。yield只能在函式內部定義 yield...

生成器表示式

把列表推導式的換成 就是生成器表示式 示例 把生一筐雞蛋變成給你乙隻老母雞,這也是生成器的特性 chicken 雞蛋 s item for item in range 10 print chicken 生成器物件記憶體位址 print next chicken 雞蛋0 print next chic...