一, 生成器
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
(a)
print("
張三是第二段")
b = yield 456
print(b) #
??print("李四
是第三段")
c = yield 789
(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...