一、 python生成器
生成器:python中將一邊循環一邊計算的這種機制稱爲生成器。簡單的說就是爲了節約內存空間,產生了一種計算規則,在取下一個數的時候按照計算規則取出即可。生成器必定是一個迭代器。
(1) 生成器基本操作
# 創建生成器的方式一:
“”“把列表生成式的[]改爲()即可 ”“”
# 列表生成式:
a = [x * 2 for x in range(10)]
# 生成器:
b = (x * 2 for x in range(10))
print(a) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
print(b) # <generator object <genexpr> at 0x7f07650130d0>
# 創建生成器的方式二:
"""用程序生成斐波納契數列:
斐波納契數列:除第一個和第二個數外,任意一個數都可以由前兩個數相加得到:
1,1,2,3,5,8,13,21,34.......
a, b = 0, 1
a, b = b, a+b
上面的代碼即可生成斐波納契數列。
"""
def Num():
a, b = 0, 1
for i in range(5):
print(b)
a, b = b, a+b
Num() # 調用函數
"""只要將上面代碼中的print(b)更換爲yield b 即可將其作爲生成器"""
def Num():
a, b = 0, 1
for i in range(5):
yield b #yield的作用使函數停止,返回後面的值b
a, b = b, a+b
“”“函數中只要加了yield 就是一個生成器了,調用這個生成器時不能用函數的方式調用,要創建一個生成器對象來接收:即 p = Num() ”“”
# 取出每一個數:
p = Num()
next(p) # 每次只取出一個值
"""如果一次將所有的值都取出來,應該用for 循環進行,完整代碼如下"""
def Num():
a, b = 0, 1
for i in range(5):
yield b #yield的作用使函數停止,返回後面的值b
a, b = b, a+b
p = Num()
for num in p:
print(num)
# 輸出結果: 1,1,2,3,5
“”“注意: 只要創建了生成器對象不僅可以用next(p)調用,還可以用p.__next()__調用,這兩種方式是等價的。”“”
(2) send函數
def test():
i = 0
while i < 5 :
temp = yield i #這裏yield返回的值是None,所temp=None
“”“要使得temp不爲None,需要使用send函數”“”
print(temp)
t = send()
# next(t)
t.send("ceshi") # 不僅會起到next(t)的作用,而且還會將值“ceshi”賦值給temp
所以send的作用是給內部值傳參數,瞭解即可。
(3) 生成器的作用--------解決多任務
def test1():
while True:
print("--1--")
yield None # 函數停止
def test2():
while True:
print("--2--")
yield None
t1 = test1()
t2 = test2()
while True:
t1.__next__() # 這裏運行一次停止,然後執行下一句,下一句運行一次停止,繼續執行上一句,如果這樣依次交替,如果切換的足夠快,看上去就像是test1() 和 test2()同時執行一樣。
t2.__next__()
二、python迭代器
(1) 迭代器概述
簡單的說,可以被next()函數調用並不斷返回下一個值的對象稱爲迭代器(Iterator)。
可以用for循環的對象統稱爲可迭代對象Iterable。
可迭代的類型有:
1、集合數據類型: list、tuple、dict、set、str
2、生成器(generator)、帶月yield 的生成器函數
(2) 判斷是否可以迭代
“”“isinstance()判斷一個對象是否是Iterable對象”“”
from collections import Iterable
isinstance([], Iterable) # 判斷[]列表是否是可迭代對象。
判斷結果: True
(3) 創建迭代器
“”“iter()函數用來創建迭代器””“
a = [11, 22, 33, 44, 55]
b = iter(a) # 創建迭代器
next(b) # 取值
注意: 區別單詞Iterable 可迭代 Iterator 迭代器