Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略
Python語言學習:復雜函數(yield/)使用方法、案例應用之詳細攻略
?
?
目錄
yield
1、生成斐波那契數列
@property
其他函數
?
?
yield
? ? ? ? 帶有 yield 的函數在 Python 中被稱之為 generator(生成器)。
yield的作用:就是把一個函數變成一個 generator,帶有 yield 的函數不再是一個普通函數,Python 解釋器會將其視為一個 generator,調用 fab(5) 不會執行 fab 函數,而是返回一個 iterable 對象!在 for 循環執行時,每次循環都會執行 fab 函數內部的代碼,執行到 yield b 時,fab 函數就返回一個迭代值,下次迭代時,代碼從 yield b 的下一條語句繼續執行,而函數的本地變量看起來和上次中斷執行前是完全一樣的,于是函數繼續執行,直到再次遇到 yield。
? ? ? ? yield是一個關鍵詞,類似return, 不同之處在于,yield返回的是一個生成器。為了精通 yield ,你必須要理解:當你調用這個函數的時候,函數內部的代碼并不立馬執行 ,這個函數只是返回一個生成器對象,這有點蹊蹺不是嗎。 ?那么,函數內的代碼什么時候執行呢?當你使用for進行迭代的時候. ?現在到了關鍵點了! ?第一次迭代中你的函數會執行,從開始到達 yield 關鍵字,然后返回 yield 后的值作為第一次迭代的返回值. 然后,每次執行這個函數都會繼續執行你在函數內部定義的那個循環的下一次,再返回那個值,直到沒有可以返回的。 ?如果生成器內部沒有定義 yield 關鍵字,那么這個生成器被認為成空的。這種情況可能因為是循環進行沒了,或者是沒有滿足 if/else 條件。
1、生成斐波那契數列
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # 使用 yieldprint(b, '- T2、print輸出代替yield的用法') a, b = b, a + b n = n + 1for n in fab(5): print(n)''' 輸出結果: 1 1 - T2、print輸出代替yield的用法 1 1 - T2、print輸出代替yield的用法 2 2 - T2、print輸出代替yield的用法 3 3 - T2、print輸出代替yield的用法 5 5 - T2、print輸出代替yield的用法'''?
@property
@property的作用:@property廣泛應用在類的定義中,既能檢查參數,又可以用類似屬性這樣簡單的方式來訪問類的變量。Python內置的@property裝飾器就是負責把一個方法變成屬性調用的,可以讓調用者寫出簡短的代碼,同時保證對參數進行必要的檢查,這樣,程序運行時就減少了出錯的可能性。
1、@property的實現比較復雜,我們先考察如何使用。把一個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又創建了另一個裝飾器@score.setter,負責把一個setter方法變成屬性賦值,于是,我們就擁有一個可控的屬性操作。
class Student(object):@propertydef score(self):return self._score@score.setterdef score(self, value):if not isinstance(value, int):raise ValueError('score must be an integer!')if value < 0 or value > 100:raise ValueError('score must between 0 ~ 100!')self._score = value>>> s = Student() >>> s.score = 60 # OK,實際轉化為s.set_score(60) >>> s.score # OK,實際轉化為s.get_score() 60 >>> s.score = 9999 Traceback (most recent call last):... ValueError: score must between 0 ~ 100!2、神奇的@property,我們在對實例屬性操作的時候,就知道該屬性很可能不是直接暴露的,而是通過getter和setter方法來實現的。還可以定義只讀屬性,只定義getter方法,不定義setter方法就是一個只讀屬性。
? ? ?下邊的birth是可讀寫屬性,而age就是一個只讀屬性,因為age可以根據birth和當前時間計算出來。
參考文章
廖雪峰的官方網站——使用@property
?
其他函數
后期更新……
?
?
?
?
?
參考文章
Python yield 使用淺析
總結
以上是生活随笔為你收集整理的Python语言学习:复杂函数(yield/@property)使用方法、案例应用之详细攻略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ML之LiRDNNEL:基于skflow
- 下一篇: ML之RFXGBoost:基于RF/XG