生成器 三元表示式, 推導式 表示式

2022-04-28 15:15:14 字數 3678 閱讀 3337

一, 生成器

1,生成器的本質就是迭代器

2,生成器的特點和迭代器一樣.取值方式和迭代器一樣(__next__(), send(): 給上乙個yield傳值).

3,生成器一般由生成器函式或者生成器表示式來建立

4,其實就是手寫的迭代器

#

只要函式內部包含有yield關鍵字,那麼函式名()的到的結果就是生成器,並且不會執行函式內部**

deffunc():

print('

====>first')

yield 1

print('

====>second')

yield 2

print('

====>third')

yield 3

print('

====>end')

gen= func() #

不會執行你的函式. 拿到的是生成器

print(gen) #

#函式中如果有yield 這個函式就是生成器函式. 生成器函式() 獲取的是生成器. 這個時候不執行函式

# gen.__next__() 執行函式. 執行到下乙個yield.

# gen.__next__() 繼續執行函式到下乙個yield.

yield: 相當於return 可以返回資料.

但是yield不會徹底中斷函式. 分段執行函式.

可以掛起/儲存函式的執行狀態

二, 生成器函式

1, 和普通函式沒有區別. 裡面有yield的函式就是生成器函式.

2, 生成器函式在執行的時候. 預設不會執行函式體. 返回生成器

3,通過生成器的__next__()分段執行這個函式.

4, send() 給上乙個yield傳值, 不能再開頭(沒有上乙個yield), 最後乙個yield也不可以用send()

send() 和__next__()是一樣的. 可以執行到下乙個yield, 可以給上乙個yield位置傳值

deffunc():

print("

我是第乙個段")

a = yield 123

print

(a)

print("

張三是第二段")

b = yield 456

print(b) #

??print("李四

是第三段")

c = yield 789

print

(c)

print("王二

是最後乙個段")

yield 79 #

最後收尾一定是yield

g =func()

print(g.__next__()) #

沒有上乙個yield 所以不能使用send() 開頭必須是__next__()

print(g.send("

煎餅果子"))

print(g.send("

韭菜盒子"))

print(g.send("

鍋包肉")) #

# ??

# for i in func(): # for的內部一定有__next__()

# print(i)

## print(list(func())) # 內部都有__next__()

三, 三元表示式

name=input('

姓名》: ')

res='sb'

if name == '蓋倫

'else'nb

'print(res)

四, 推導式

1. 列表推導式 [結果  for迴圈 條件篩選]

2. 字典推導式

3. 集合推導式

#

推導式: 用一句話來生成乙個列表

lst = ["

python

"+str(j) for j in range(1,16)]

print(lst)

#

100以內能被3整除的數的平方

lst = [i*i for i in range(100) if i%3==0]

print(lst)

#

[11,22,33,44] =>

lst = [11,22,33,44]

dic = #

字典推導式就一行

print(dic)

#

集合推導式

lst = [1, 1, 4, 6,7,4,2,2]

s =

print(s)

五,生成器表示式

(結果 for迴圈 條件)

特點:1. 惰性機制

2. 只能向前

3. 節省記憶體(雞蛋)

生成器函式

deffunc():

print(111)

yield 222

yield 333g = func() #

獲取生成器

g1 = (i for i in g) #

生成器g2 = (i for i in g1) #

生成器#

g3 = (i for i in g2)

print(list(g)) #

??? [222,333] 源頭. 從源頭把資料拿走了

print(list(g1)) #

??? 這裡執行的時候. 源頭已經沒有資料

print(list(g2)) #

??? 這裡也沒有值了

重難點:

#

求和def

add(a, b):

return a +b

#生成器函式 # 0-3

deftest():

for r_i in range(4):

yield

r_i#

0,1,2,3

g = test() #

獲取生成器

for n in [2, 10]:

g = (add(n, i) for i in g) #

g = add(n, i) for i in g 所有n都為最後乙個元素 10

print(g) #

at 0x0000000001df5a40> 還是生產器

#到最後往裡面放資料就對了

print(list(g)) #

[20, 21, 22, 23] 帶資料n =10算出 n = 2不帶值

print(list(g)) #

從源頭把資料拿走了這裡沒有為空

三元表示式 推導式和生成器表示式

三元表示式是python為我們提供的一種簡化簡單的流程控制的解決方案 而且在簡化 的基礎上,還不失 的可讀性 條件成立時返回的值 if 條件 else 條件不成立時返回的值 x if x y else y 如果x y就執行x,否則執行y需求 接收兩個數字,返回較大的那個數 不採用三元表示式 def ...

三元表示式 列表推導式 生成器表示式

一 三元表示式 def max2 x,y if x y return x else return y res 條件成立時執行的表示式 if 條件 else 條件不成立時執行的表示式 x 11 y 22 res x 12 if x y else y 100 print res 二 列表推導式 1 示例...

三元表示式,生成式,生成器表示式

使用函式來寫 defmax2 x,y if x y return x else return y res max2 3,4 print res 4?使用三元表示式 x 3 y 4 res x if x y else y print res 3,4 4 函式加三元表示式 defmax2 x,y ret...