SIS的聯鎖和DCS的聯鎖動作的區別
阿新 • • 發佈:2021-11-24
在 Python 中,使用了 yield
的函式被稱為生成器 (generator)。
跟普通函式不同的是,生成器是一個返回迭代器的函式,只能用於迭代操作,更簡單的理解生成器就是一個迭代器。
在呼叫生成器執行的過程中,每次遇到 yield
時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值,並在下一次執行 next()
方法時從當前位置繼續執行。
呼叫一個生成器函式,返回的是一個迭代器物件。
例項:斐波那契數列
斐波那契數列是一個簡單的遞迴,除第一個和第二個數外,任意一個數可由前兩個數相加得到。
方法1:簡單輸出斐波那契數列的前 N 個數
def fab(max): n, a, b = 0, 0, 1 for n in range(max): print(b) a, b = b, a+b n = n+1 fab(5)
輸出:
1
1
2
3
5
使用 print 列印導致該函式可複用性較差,因為 fab 函式返回 None,其他函式無法呼叫。
方法2:通過列表返回
def fab(max):
n, a, b = 0, 0, 1
L = []
for n in range(max):
L.append(b)
a, b = b, a+b
n = n+1
return L
for i in fab(5):
print(i)
輸出:
1
1
2
3
5
返回 list 能滿足複用性要求,但該函式在執行中佔用的記憶體會隨著引數 max 的增大而增大。
如果要控制記憶體,不要用 List 來儲存中間結果,而是通過 iterable
來迭代。
方法3:通過 iterable 物件來迭代
利用 iterable 把 fab 函式改寫為一個 iterable 的 class。
class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def __next__(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a+self.b self.n = self.n + 1 return r raise StopIteration() for n in Fab(5): print(n)
輸出:
1
1
2
3
5
Fab 類通過 __next()__
不斷返回數列的下一個數,記憶體佔用始終為常數。
但是 class 改寫的版本,程式碼比較繁瑣。
既想保持程式碼的簡潔,又想獲得 iterable 的效果,使用 yield
。
方法4:yield
def fab(max):
n, a, b = 0, 0, 1
for n in range(max):
yield b
a, b = b, a+b
n += 1
for n in fab(5):
print(n)
輸出:
1
1
2
3
5
僅把第一種方法的 print(b)
改為 yield b
,即保持了程式碼的簡潔性又獲得了 iterable 的效果。