函數

由若干語句組成的語句塊、函數名稱、參數列表構成,它是python中組織代碼的最小單元,通常按照代碼的功能劃分,將其封裝成一個個的功能函數。

Python中的函數定義函數的語法如下:
def 函數名(參數列表):
函數體(代碼塊)
[return 返回值]

函數的作用:
結構化編程對代碼的最基本的封裝,一般按照功能組織一段代碼
封裝的目的爲了複用,減少冗餘代碼
代碼更加簡潔美觀、可讀易懂

參數:

  • 位置參數:按照形參定義的順序依次傳入實參
  • 關鍵字參數:使用形參的名字來傳入實參(key=value),如果使用了形參名字,那麼傳參順序就可和形參的定義順序不同
  • 形參的默認值定義語法爲在形參後跟上一個值
  • 可變參數:一個形參可以匹配任意個實參。注意可變參數是對形參而言的,實參沒有可變參數。
    可變參數分爲“位置可變參數”和“關鍵字可變參數”
    (位置可變參數的語法如下:
    在形參前使用*表示該形參是可變參數,可以接收多個實參
    收集到的多個實參被自動封裝爲一個tuple元祖
    關鍵字可變參數的語法如下:
    關鍵字可變形參的名字前使用必須使用兩個星號 符號,表示該形參可以接收多個關鍵字參數
    收集到的多個實參名稱和值被自動封裝爲一個字典。)
  • keyword-only參數的概念:
    如果在一個星號參數後,或者一個位置可變參數後,出現的普通參數,實際上該參數已經不是普通的參數了,而是keyword-only參數。給keyword-only形參傳參時,只能通過關鍵字參數傳遞,否則拋語法異常。

參數列表參數的一般順序是:
普通參數、缺省參數(缺省參數不能寫在普通參數前面)、可變位置參數、keyword-only參數(可帶缺省值)、可變關鍵字參數

返回值:
結束函數調用、並返回“返回值”。
Python規定所有的函數都必須要有返回值,如果沒有顯式的定義return語句,那麼python就會隱式的調用return None。一個函數可以存在多個return語句,但是隻有最前面的一條可以被執行。
函數不能使用return語句同時返回多個值,如果return後面跟的是多個返回值,那麼python會隱式的將這多個返回值封裝成一個元祖,作爲一個返回值返回給調用者。

作用域:
函數嵌套:
在一個函數中定義另外一個函數,這就是函數嵌套,在函數嵌套中,函數是有可見範圍的,這就是作用域的概念,內部函數不能在外部直接調用,否則會拋NameError異常,因爲內層函數對外部而言是不可見的。
全局作用域:在整個程序運行環境中都可見,全局作用域中的變量稱爲全局變量。
局部作用域(本地作用域):僅在函數、類的內部可見,外部不可見,局部作用域中的變量稱爲局部變量,局部變量的使用範圍不能超過其所在的局部作用域。
在函數的嵌套結構中:
外層函數的局部作用域中的局部變量對內層函數而言是可見的。
如果內層函數的局部作用域中定義了一個和外層函數作用域中同名的局部變量的話,內層函數中的局部變量並不會覆蓋外層函數中的同名局部變量,因爲它們是不同作用域中的變量,作用域相互隔離,不會相互干擾。

自由變量:如果內層函數中引用了外層函數中的某個局部變量,那麼這個變量就稱爲自由變量。
閉包:內層函數引用到了外層函數的自由變量,就形成了閉包。

global關鍵字將函數內的變量聲明爲全局作用域中定義的變量,前提條件是全局作用域中必須要事先有該變量的定義,否則會拋NameError異常。
nonlocal關鍵字將變量標記爲不在本地作用域定義,而在上級的某一級局部作用域中定義,但不能是全局作用域中定義。

    python會把函數的所有位置形參的默認值封裝成一個元組賦值給__defaults__屬性。
    函數的所有keyword-only形參的默認值封裝成一個字典賦值給__kwdefaults__屬性。

迭代函數:
函數遞歸的定義如下:
函數直接或者間接地調用自身就是遞歸
遞歸需要有邊界條件、遞歸前進段、遞歸返回段
遞歸一定要有邊界條件,否則就會出現無限遞歸的情況,導致棧溢出的嚴重後果。
當邊界條件不滿足的時候,遞歸前進
當邊界條件滿足的時候,遞歸返回遞歸存在的意義就是循環,單個函數本身不會循環,但是函數調用函數自身就形成了循環,邊界條件就相當於退出循環的條件。將上一次的計算結果直接作爲函數的形參傳入,實現數據的接棒。遞歸和傳統的循環結構相比,性能普遍低下,並且遞歸是有深度限制的。

遞歸存在的意義就是循環,單個函數本身不會循環,但是函數調用函數自身就形成了循環,邊界條件就相當於退出循環的條件。將上一次的計算結果直接作爲函數的形參傳入,實現數據的接棒。遞歸和傳統的循環結構相比,性能普遍低下,並且遞歸是有深度限制的。
匿名函數:
lambda表達式的語法格式如下:
lambda 參數列表:表達式

語法解釋如下:
使用lambda關鍵字來定義匿名函數,參數列表不需要小括號,使用冒號來分隔參數列表和表達式
不需要使用return關鍵字,表達式的值就是匿名函數的返回值
lambda表達式(匿名函數)只能寫在一行上,被稱爲單行函數
lambda表達式的常規使用如下:
print((lambda :0)())
print((lambda x, y=3: x + y)(5))
print((lambda x, y=3: x + y)(5, 6))
print((lambda x, , y=30: x + y)(5))
print((lambda x,
, y=30: x + y)(5, y=10))
print((lambda args: (x for x in args))(range(5)))
print((lambda args: [x+1 for x in args])(range(5)))
print((lambda args: {x+2 for x in args})(range(5)))

生成器函數:
使用yield關鍵字創建一個生成器函數
生成器函數總結:
包括yield語句的生成器函數生成生成器對象時,生成器函數的函數體不會立即執行
next(generator)會從函數的當前位置向後執行到之後碰到的第一個yield語句,會彈出yield表達式的返回值,並暫停函數執行
再次調用next函數,和上一條一樣的處理過程
沒有多餘的yield語句能夠被執行,繼續調用next函數,會拋出StopIteration異常
yield from iterable
等價於:
for item in iterable:yield item形式的語法糖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章