函數
由若干語句組成的語句塊,函數名,參數列表構成,是組織代碼的最小單元,完成一定的功能,結構化編程對代碼的最基本的封裝,封裝的目的是為了復用
函數中沒有return,隱式會返回一個none值
定義中的參數列表成為形式參數,只是一種形式表達,簡稱形參
調用時寫的參數是實際參數,是實實在在傳入的值,簡稱實參
函數的定義,只是聲明了參數,不會執行,可以進行調用,定義需要在調用前,也就是說調用時,已經被定義過了
函數是否可調用,用callable(函數名)進行檢測
參數調用時傳入的參數要和定義的個數相匹配(可變參數例外)
位置參數:按照參數定義順序傳入實參
關鍵字參數:使用形參的名字來輸入實參的方式,如果使用了形參名字,那么傳參順序就可和定義順序不同,要求位置參數必須在關鍵字參數之前,位置參數是按照位置對應傳入的
在形參前使用*表示該形參是可變參數,可以接受多個實參(包括0個),收集多個實參為一個tuple,不能進行更改
在形參前使用**符號,表示可以接收多個關鍵字參數,收集的實參名稱和值組成一個字典
如果在一個星號參數后,或者一個位置可變參數后,出現的普通參數,實際上已經不是普通參數了,而是keyword-only參數,args可以看作已經截獲了所有的位置參數,普通參數不使用關鍵字參數就不可能拿到實參
參數列表的一般順序是,普通參數,缺省參數,可變位置參數,keyword-only參數(可帶缺省值),可變關鍵字參數
參數解構:給函數提供實參的時候,可以在集合類型前使用*或者**,把集合類型的結構解開,提取出所有元素作為函數的實參,非字典類型使用*解構成位置參數,字典類型使用**解構成關鍵字參數,提取出來的元素數目要和參數的要求匹配,也要和參數的類型匹配
def fn(x, y, z=3, *arg, m=4, n, **kwargs):
匿名函數
匿名函數,即沒有名字的函數,借助lambda表達式構建匿名函數
格式:? lambda參數列表:表達式
參數列表不需要小括號,冒號是用來分割參數列表和表達式的,不需要使用return,表達式的值,就是匿名函數的返回值,lambda表達式(匿名函數)只能寫在一行上,稱為單行函數
print((lambda *args: (x for x in args))(*range(5)))
生成器
列表解析式:返回值for元素in可迭代對象if條件,使用中括號[ ],內部是for循環,if條件語句可選,返回一個新的列表
生成器表達式:返回值for元素in可迭代對象if條件,列表解析式的中括號換成小括號就行了,返回一個生成器
集合解析式:返回值for元素in可迭代對象if條件,列表解析式的中括號換成大括號{}就行了,立即返回一個集合
字典解析式:返回值for元素in可迭代對象if條件,列表解析式的中括號換成大括號{}就行了,使用key:value形式,立即返回一個字典
生成器表達式:只需將列表解析式中的[ ]換位()即可,延遲計算,惰性求值,列表解析式立即返回結果
生成器為可迭代對象,迭代器,迭代器是可迭代對象,可迭代對象不一定是迭代器
迭代器不可從頭再走,不回頭,若為列表,可進行再次迭代,可回頭
生成器表達式省內存,列表解析式返回新的列表
生成器沒有數據,內存占用少,但是使用時候,雖一個個返回數據,但合起來所占內存差不多
迭代器未必是生成器
is可用來看地址是否相同
?
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96306