Python——函數(shù)基礎(chǔ)

函數(shù)基礎(chǔ)

  • 函數(shù)就是將一些語(yǔ)句集合在一起的部件,不止一次地在程序中運(yùn)行。還能計(jì)算出一個(gè)返回值,并能夠改變作為函數(shù)輸入的參數(shù)。

編寫(xiě)函數(shù)

函數(shù)基礎(chǔ)

  • def是可執(zhí)行的代碼,Python函數(shù)時(shí)由def編寫(xiě)的,def是一個(gè)可執(zhí)行的語(yǔ)句,函數(shù)并不存在。直到Python運(yùn)行了def后才存在。
  • def創(chuàng)建了一個(gè)對(duì)象并將其賦值給某一變量名。當(dāng)Python運(yùn)行到def語(yǔ)句時(shí),將會(huì)生成一個(gè)新的函數(shù)對(duì)象并將其賦值給這個(gè)函數(shù)名。就像所有的賦值一樣,函數(shù)名變成了某一個(gè)函數(shù)的引用。
  • return將一個(gè)結(jié)果對(duì)象發(fā)送給調(diào)用者,當(dāng)函數(shù)被調(diào)用時(shí),其調(diào)用者停止運(yùn)行直到這個(gè)函數(shù)完成了工作,之后函數(shù)將控制權(quán)返回調(diào)用者,return返回值就是函數(shù)調(diào)用的結(jié)果
  • yield向調(diào)用者返回一個(gè)結(jié)果對(duì)象
    global聲明了一個(gè)模塊級(jí)的變量并被賦值,在默認(rèn)情況下,所有在一個(gè)函數(shù)中被賦值的對(duì)象,是這個(gè)函數(shù)的本地變量,并且僅在這個(gè)函數(shù)運(yùn)行的過(guò)程中存在。為了分配一個(gè)可以在整個(gè)模塊中都可以使用的變量名,函數(shù)需要在global語(yǔ)句中將它列舉出來(lái)。變量名需要關(guān)注它的作用域,并且是通過(guò)賦值語(yǔ)句將變量名綁定至作用域的
  • nonlocal聲明了將要賦值的一個(gè)封閉的函數(shù)變量。在Python3中添加的nonlocal語(yǔ)句允許一個(gè)函數(shù)來(lái)賦值一條語(yǔ)法封閉的def語(yǔ)句的作用域中已有的名稱(chēng)。允許封閉的函數(shù)作為保留狀態(tài)的地方
  • 函數(shù)時(shí)通過(guò)對(duì)象引用傳遞的,在Python中,參數(shù)通過(guò)賦值傳遞給函數(shù)。
  • 參數(shù)、返回值以及變量并不是聲明,在函數(shù)中并沒(méi)有類(lèi)型約束。可以傳遞任意類(lèi)型的參數(shù)給函數(shù)。函數(shù)也可以返回任意類(lèi)型的對(duì)象

def語(yǔ)句

格式

def將創(chuàng)建一個(gè)函數(shù)對(duì)象并將其賦值給一個(gè)變量名

def <name>(arg1,arg2,....argn):
      <statements>
  • def包含了首行并有一個(gè)代碼塊跟隨在后邊,這個(gè)代碼塊通常會(huì)縮進(jìn)。這個(gè)代碼塊就是Python函數(shù)的執(zhí)行語(yǔ)句
  • def的首行定義了函數(shù)名,賦值給了函數(shù)對(duì)象,并在括號(hào)中包含了0個(gè)或多個(gè)參數(shù)。在函數(shù)調(diào)用的時(shí)候,在首行的參數(shù)名稱(chēng)賦值給了括號(hào)中傳遞來(lái)的對(duì)象
  • 帶返回值的格式
def <name>(arg1,arg2,....argN):
  statement
return <value>
  • return語(yǔ)句可以在函數(shù)主體中任何地方出現(xiàn),表示函數(shù)調(diào)用的結(jié)束。并將結(jié)果返回至調(diào)用處。
  • 定義的函數(shù)中,如果沒(méi)有return,會(huì)默認(rèn)return null
  • 如果在函數(shù)中return多個(gè)對(duì)象,Python會(huì)將多個(gè)對(duì)象封裝為一個(gè)元組返回,其實(shí)返回的還是一個(gè)對(duì)象

def是實(shí)時(shí)執(zhí)行的

  • Python的def語(yǔ)句實(shí)際上是一個(gè)可執(zhí)行的語(yǔ)句:當(dāng)運(yùn)行時(shí),創(chuàng)建一個(gè)新的函數(shù)對(duì)象并將其賦值給一個(gè)變量名,Python中的所有語(yǔ)句都是實(shí)時(shí)運(yùn)行的,沒(méi)有獨(dú)立編譯這樣的流程。所以def語(yǔ)句可以出現(xiàn)在任一地方。還可以嵌套在其他的語(yǔ)句中
if test:
  def func():
      statement
else:
  def func()
      statment
statement
func()
  • def在運(yùn)行時(shí)簡(jiǎn)單地給一個(gè)變量名進(jìn)行賦值,Python函數(shù)在程序運(yùn)行之前并不需要全部定義。
  • 函數(shù)的函數(shù)名并不重要,可以將函數(shù)賦值給一個(gè)不同的變量名,并通過(guò)新的變量名進(jìn)行調(diào)用。
  • 函數(shù)允許任意的屬性附加到記錄信息供隨后使用
def func():....
func()
func.attr = value
示例
# 返回兩個(gè)數(shù)的計(jì)算結(jié)果
>>> def times(x,y):
...     return x*y
... 
>>> time = time(2,3)
>>> time = times(2,3)
>>> time
6
  • 函數(shù)中的參數(shù)完全取決于參數(shù)的對(duì)象類(lèi)型

用戶(hù)定義的函數(shù)屬性

用戶(hù)定義的函數(shù)具有以下屬性

  • f.doc 文檔字符串
  • f.name 函數(shù)名稱(chēng)
  • f.dict 包含函數(shù)屬性的字典
  • f.code 字節(jié)編譯的代碼
  • f.defaults 包含默認(rèn)參數(shù)的元組
  • f.globals 定義全局命名空間的字典
  • f.closure 包含與嵌套作用域相關(guān)數(shù)據(jù)的元組

Python中的多態(tài)

同樣的函數(shù),在不同的實(shí)例下執(zhí)行的結(jié)果取決于不同的實(shí)例。這種依賴(lài)行為稱(chēng)為多態(tài)。

  • 作為函數(shù),可以自動(dòng)的適用于所有類(lèi)別的對(duì)象類(lèi)型。只要對(duì)象支持所預(yù)期的接口,函數(shù)就能處理
  • Python中代碼不應(yīng)該關(guān)心特定的數(shù)據(jù)類(lèi)型。
# 尋找序列的交集
>>> def intersect(seq1,seq2):
...     res=[]
...     for x in seq1:
...             if x in seq2:
...                     res.append(x)
...     return res
... 
>>> x = [1,2,3,4,5]
>>> y = ['a',1,2,'b','c',4]
>>> resout = intersect(x,y)
>>> resout
[1, 2, 4]
  • 如果我們傳入了不支持這些接口的對(duì)象,Python將會(huì)自動(dòng)檢測(cè)出不匹配,并拋出一個(gè)異常
本地變量

在上述的代碼中res是本地變量,這個(gè)變量只是在def內(nèi)的函數(shù)中是可見(jiàn)的,并且僅在函數(shù)運(yùn)行時(shí)是存在。所有的在函數(shù)內(nèi)部進(jìn)行賦值的變量名都默認(rèn)為本地變量。

  • 參數(shù)也是通過(guò)賦值被傳入的,所以seq1和seq2是本地變量
  • for循環(huán)將元素賦值給了變量X,所以變量X是本地變量
  • 所有的本地變量都會(huì)在函數(shù)調(diào)用時(shí)出現(xiàn),并在函數(shù)退出時(shí)消失。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容