每日3題是麥叔的面試系列專題之一,每天包括初級,中級,高級難度題目各一道。
每日3題,100天之後成為大牛!
如果有不明白的,給麥叔留言。
[Easy] 為什麼函數名字可以當做參數用?
思考30秒再往下翻...
Python中一切皆對象,函數名是函數在內存中的空間,也是一個對象
[Normal] 函數裝飾器有什麼作用?
思考30秒再往下翻...
裝飾器本質上是一個callable object,它可以在讓其他函數在不需要做任何代碼的變動的前提下增加額外的功能。裝飾器的返回值也是一個函數的對象,它經常用於有切面需求的場景。比如:插入日誌,性能測試,事務處理,緩存。權限的校驗等場景,有了裝飾器就可以抽離出大量的與函數功能本身無關的雷同代碼並發並繼續使用。
[Hard] 生成器,迭代器的區別?
思考30秒再往下翻...
迭代器是遵循迭代協議的對象。用戶可以使用 iter() 以從任何序列得到迭代器(如 list, tuple, dictionary, set 等)。另一個方法則是創建一個另一種形式的迭代器 —— generator 。要獲取下一個元素,則使用成員函數 next()(Python 2)或函數 next() function (Python 3) 。當沒有元素時,則引發 StopIteration 此例外。若要實現自己的迭代器,則只要實現 next()(Python 2)或 ()( Python 3)
生成器(Generator),只是在需要返回數據的時候使用yield語句。每次next()被調用時,生成器會返回它脫離的位置(它記憶語句最後一次執行的位置和所有的數據值)
區別:生成器能做到迭代器能做的所有事,而且因為自動創建iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節省內存。除了創建和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常。
官方介紹:https://docs.python.org/3/tutorial/classes.html#iterators
中文:https://docs.python.org/zh-cn/3/tutorial/classes.html#iterators
支持麥叔,請點在看,謝謝!