1. 程式人生 > 其它 >SIS的聯鎖和DCS的聯鎖動作的區別

SIS的聯鎖和DCS的聯鎖動作的區別

在 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 的效果。