第11章 函式和函式式程式設計 1

2021-05-31 22:22:27 字數 1949 閱讀 6397

11.1 什麼是函式?

11.1.2 返回值和函式型別

把過程看待成函式的語言通常對於「什麼都不返回」的函式設定了特殊的型別或者值的名字。這些函式在c中預設為"void"的返回型別,意思是沒有值返回。在python中,對應的返回物件型別是none。

當沒有顯式地返回元素或者如果返回none時,python會返回乙個none。那麼呼叫者接收的就是python返回的那個物件,且物件的型別仍然相同。如果函式返回多個物件,python把他們聚集起來並以乙個元組返回。

許多靜態型別的語言主張乙個函式的型別就是其返回值的型別。在python中,由於python是動態地確定型別而且函式能返回不同型別的值,所以沒有進行直接的型別關聯。因為過載並不是語言特性,程式設計師需要使用type()這個內建函式作為**,來處理有著不同引數型別的函式的多重宣告以模擬類c語言的函式過載。

11.2 呼叫函式

11.2.2 關鍵字引數

關鍵字引數的概念僅僅針對函式呼叫。這種觀念是讓呼叫者通過函式呼叫中引數名字來區分引數。這樣規範允許引數缺失或者不按順序,因為直譯器能通過給出的關鍵字來匹配引數的值。

當引數允許「缺失」時,也可以使用關鍵字引數。這取決於函式的預設引數。

11.2.3 預設引數

預設引數就是宣告了預設值的引數。因為給引數賦予了預設值,所以,在函式呼叫時,不向該引數傳入值也是允許的。

11.2.4 引數組

python同樣允許程式設計師執行乙個沒有顯式定義引數的函式,相應的方法是通過乙個元組(非關鍵字引數)或字典(關鍵字引數)作為引數組傳遞給函式。可以將所有引數放進乙個元組或者字典中,僅僅用這些裝有引數的容器來呼叫乙個函式,而不必顯式地將它們放在函式呼叫中。

在python中允許的函式呼叫的完整語法是:

func(positional_args, keywork_args, *tuple_grp_nonkw_args, **dict_grp_kw_args)

11.3 建立函式

11.3.1 def語句

標題行由def關鍵字,函式的名字以及引數列表(如果有的話)組成。def子句剩餘部分包括乙個雖然可選但是強烈推薦的文件字串和必須的函式體。

11.3.2 宣告與定義比較

python將這兩者(宣告與定義)視為一體,函式的子句由宣告的標題行以及隨後的定義體組成。

11.3.3 前向引用

python不允許在函式未宣告之前,對其進行引用或者呼叫。

11.3.4 函式屬性

函式屬性是python另外乙個使用了句點屬性標識並擁有命名空間的領域。區別於c#,函式是有屬性的。

>>> def foo():

... pass

... 

>>> foo._doc_ = "the doc of foo~~~"

>>> foo.version = 1.1

>>> help(foo)

help on function foo in module __main__:

foo()

>>> `foo._doc_`

"'the doc of foo~~~'"

>>> `foo.version`

'1.1'

>>> 

注意我們是如何在函式宣告外定義乙個文件字串。然而我們仍然可以就像平常一樣,在執行時刻訪問它。然而你不能在函式宣告時訪問屬性。

11.3.5 內部/內嵌函式

在函式體內置立另外乙個函式(物件)是完全合法的,這種函式叫做內部/內嵌函式。

內部函式的整個函式體都在外部函式的作用域之內。除了在外部函式體內,任何地方都不能對其進行呼叫。

另外乙個函式體內置立函式物件的方式是lambda。如果內部函式的定義包含了在外部函式裡定義的物件的引用(這個物件甚至可以是在外部函式之外),內部函式會變成被稱為閉包(closure)的特別之物。

>>> def foo():

... def nest_foo():

... pass

... pass

... 

第11章 函式和函式式程式設計 2

11.3.6 函式 與方法 裝飾器 裝飾器是在函式呼叫之上的修飾。這些修飾僅是當宣告乙個函式或者方法的時候,才會應用的額外呼叫。裝飾器的語法以 開頭,接著是裝飾器函式的名字和可選的引數。緊跟著裝飾器宣告的是被修飾的函式和裝飾函式的可選引數。decorator dec opt args def fun...

第11章 函式和函式式程式設計 6

11.9 遞迴 如果乙個新的呼叫能在相同過程中較早的呼叫結束之前開始,那麼該過程就是遞迴。def factorial num if num 1 return num else return num factorial num 1 factorial 20 2432902008176640000l f...

第11章 函式

1 把相關的語句組合在一起,並且賦予相應的名稱,用這種方法來給程式分塊,這種形式的組合就是函式,函式也叫例程或者過程。程式總是從 main 函式開始啟動。函式由函式名 引數 返回值型別以及一組包含操作語句的語句塊組成。函式可以支援過載,程式就是由函式組成。2 形參是函式定義時在形參表中定義的,並且由...