2017-04-05 55 views
4

我想在Python中編寫一個線性同餘生成器,我找到一小段code on Wikipedia,但在理解它時遇到了一些困難。代碼如下:Python中的函數

def lcg(modulus, a, c, seed=None): 
    if seed != None: 
     lcg.previous = seed 
    random_number = (lcg.previous * a + c) % modulus 
    lcg.previous = random_number 
    return random_number/modulus 
lcg.previous = 2222 

我的問題是,什麼是「lcg.previous」?我注意到該功能已完成,lcg.previous的值被更新並存儲。它在這裏聲明爲函數lcg()的成員變量,還是實際上爲python中的所有函數設置了某種默認類型?

非常感謝!

+0

也許你可以給你提供代碼片段的參考。 – Alex

+0

我想你沒有複製所有相關的代碼,並且lcg.previous在函數定義之後直接設置爲一個起始值。 –

+0

對不起,我碰巧上傳了我編輯過的版本。感謝您的編輯。 – Xuan

回答

5

它是該函數的「成員變量」,所以每次調用該函數時(除用seed的某些東西調用該函數外),該序列都會選擇該函數的剩餘位置。

+0

+1。作爲一個註釋,通過這個,你可以模擬其他語言中常見的'static'函數變量的行爲,如C. –

+0

感謝您的解釋。 – Xuan

0

Python將lcg.previous識別爲一個新的變量聲明,並將其作爲一個成員添加到lcg中。

+0

Python沒有變量聲明。 –

+0

它的確如此,這只是暗示。行lcg(modulus, a, c, seed=None):暗含了模數a,c和種子的局部變量聲明。行lcg.previous是一個成員變量的隱含聲明。 Python只是抽象地聲明瞭引用變量下面那些堅韌不拔的部分。 – Stephan

+1

Python是語言,沒有變量聲明。變量[彈出](https://docs.python.org/3/tutorial/classes.html#instance-objects)分配給它們時。變量聲明的語言結構在Python中並不存在,就像在C,C++,Java等中一樣。Python中只有賦值。你用術語鬆散。 –

0

previous變量是lcg函數的一個屬性。在這個例子中,它被用作lcg函數的靜態變量。由於Python不需要在使用前聲明變量(或對象成員),所以可以根據需要創建它們。在這種情況下,您創建了lcg函數對象的成員previous