功能是壹個有組織的、可重用的代碼段,用於實現單個或相關的功能。
函數可以提高應用程序的模塊化和代碼的重用率。妳已經知道Python提供了很多內置函數,比如print()。但是妳也可以創建妳自己的函數,我們稱之為自定義函數。
定義壹個函數
妳可以用妳想要的函數定義壹個函數。以下是壹些簡單的規則:
帶的功能代碼塊。def?關鍵字開始,後面是函數標識符名和括號?()。
任何傳入的參數和自變量都必須用括號括起來,括號可用於定義參數。
函數的第壹行語句可以選擇使用文檔字符串——用於存儲函數描述。
帶冒號的函數內容?:?開始並縮進。
return a="Runoob "
在上面的代碼中,?是壹個列表類型,“Runoob”?是字符串類型,變量A沒有類型。她只是壹個對象的引用(指針),對象可以是列表類型的對象,也可以是字符串類型的對象。
可變和不可變對象
在python中,字符串、元組、數字是不可變的對象,而list、dict等。是可修改的對象。
不可變類型:變量賦值?a=5?然後賦值?A=10。其實這裏新生成壹個int value對象10,然後A指向它,而5被丟棄,相當於新的壹個而不是改變A的值..
變量類型:變量賦值?la=?然後賦值?la[2]=5?就是改變列表la的第三個元素的值。本身la沒動,但是內部的壹些值被修改了。
python函數的參數傳遞:
不可變類型:類似C++的值傳遞,比如整數、字符串、元組。如fun(a),只傳遞A的值,A對象本身不受影響。如果在fun(a)內部修改了A的值,就會生成壹個新的A。
變量類型:類似於C++的引用傳遞,比如列表和字典。比如fun(la)才是真正的傳輸la,fun之外的修改la也會受到影響。
python中的壹切都是對象。嚴格來說,不能說值傳遞,也不能說引用傳遞。我們應該說不可變對象和可變對象。
Python傳遞不可變的對象實例。
通過?id()?查看存儲器地址變化的函數:
實例(Python 3.0以上)
定義更改(a):打印(id(a))?#指向同壹個對象。
a=10
打印(id(a))?#壹個新對象
a = 1打印(id(a))更改(a)
上述示例的輸出結果是:
437936913643793691364379369424
可以看到在調用函數前後,形參和實參指向同壹個對象(對象id相同),在函數內部修改形參後,形參指向不同的id。
傳遞變量對象實例
可變對象修改了函數中的參數,因此調用該函數的函數中的原始參數也發生了變化。例如:
實例(Python 3.0以上)
#!/usr/bin/python3
#可寫函數描述def changeme( mylist):?"修改接收列表"
?mylist.append()
?Print("函數中的值:",mylist)
?返回
#調用changeme函數mylist = changeme( mylist )print("函數外部值:",mylist)。
傳遞到函數中的對象和在末尾添加了新內容的對象使用相同的引用。因此,輸出結果如下:
函數中的值:?[10,20,30,[1,2,3,4]]函數的外部值:?[10, 20, 30, [1, 2, 3, 4]]
參數
以下是調用函數時可以使用的正式參數類型:
必需參數
關鍵字參數
默認參數
可變長度參數
必需參數
必需的參數必須以正確的順序傳遞給函數。調用的次數必須與聲明的次數相同。
要調用printme()函數,必須傳入壹個參數,否則會出現語法錯誤:
實例(Python 3.0以上)
#!/usr/bin/python3
#可寫函數描述def printme( str):?"打印任何傳入的字符串"
?打印(字符串)
?返回
#調用printme函數,將報告不帶參數的printme()錯誤。
以上示例的輸出結果:
回溯(最近壹次呼叫):
文件“test.py ”,第10行,在& lt模塊& gt
printme()TypeError: printme()缺少1必需的位置參數:“str”
關鍵字參數
關鍵字參數與函數調用密切相關,函數調用使用關鍵字參數來確定傳入的參數值。
使用關鍵字參數允許調用函數時參數的順序不同於聲明函數時的順序,因為Python解釋器可以將參數值與參數名匹配起來。
以下示例在調用printme()函數時使用參數名:
實例(Python 3.0以上)
#!/usr/bin/python3
#可寫函數描述def printme( str):?"打印任何傳入的字符串"
?打印(字符串)
?返回
#調用printme函數printme( str = "菜鳥教程")。
以上示例的輸出結果:
菜鳥教程
下面的例子演示了函數參數的使用不需要使用指定的順序:
實例(Python 3.0以上)
#!/usr/bin/python3
#可寫函數描述def printinfo(名稱,年齡):?"打印任何傳入的字符串"
?Print("姓名:",姓名)
?打印("年齡:",年齡)
?返回
#調用printinfo函數printinfo( age=50,name="runoob ")。
以上示例的輸出結果:
姓名:?Runoob年齡:?50
默認參數
調用函數時,如果沒有傳遞參數,則使用默認參數。如果在下面的示例中沒有傳遞年齡參數,則使用默認值:
實例(Python 3.0以上)
#!/usr/bin/python3
#可寫函數描述def printinfo( name,age = 35):?"打印任何傳入的字符串"
?Print("姓名:",姓名)
?打印("年齡:",年齡)
?返回
#調用printinfo函數printinfo (age = 50,name = " run OOB ")print("-")printinfo(name = " run OOB ")。
以上示例的輸出結果:
姓名:?Runoob年齡:?50-姓名:?Runoob年齡:?35
可變長度參數
您可能需要壹個比聲明時能處理更多參數的函數。這些參數稱為不定長參數,與上述兩個參數不同,聲明時不會命名。基本語法如下:
def functionname([formal_args,] *var_args_tuple):
"函數_文檔字符串"
函數_套件?返回[表情]
帶星號的?*?的參數將以元組的形式導入,存儲所有未命名的變量參數。
實例(Python 3.0以上)
#!/usr/bin/python3
?#可寫函數描述def printinfo (arg1,* vartuple):?"打印任何傳入的參數"
?打印("輸出:")
?打印(arg1)
?打印(變量數組)
#調用printinfo函數printinfo( 70,60,50)
以上示例的輸出結果:
輸出:70(60,50)
如果函數調用中沒有指定參數,則為空元組。我們也不能將未命名的變量傳遞給函數。以下示例:實例(Python 3.0+)
#!/usr/bin/python3
#可寫函數描述def printinfo (arg1,* vartuple):?"打印任何傳入的參數"
?打印("輸出:")
?打印(arg1)
?對於vartuple中的var:?打印(var)
?返回
#調用printinfo函數printinfo(10)printinfo(70,60,50)
以上示例的輸出結果:
輸出:10輸出:706050
還有壹個帶兩個星號的參數?* *基本語法如下:
def functionname([formal_args,] **var_args_dict):
"函數_文檔字符串"
函數_套件?返回[表情]
有兩個星號?**?的參數將作為字典導入。
實例(Python 3.0以上)
#!/usr/bin/python3
?#可寫函數描述def printinfo (arg1,* * vardict):?"打印任何傳入的參數"
?打印("輸出:")
?打印(arg1)
?打印(變量)
#調用printinfo函數printinfo(1,a=2,b=3)。
以上示例的輸出結果:
輸出:1{'a': 2,' b': 3}
聲明函數時,參數中的星號。*?可以單獨出現,例如:
def f(a,b,*,c):
返回a+b+c
如果星號單獨出現?*?之後的參數必須與關鍵字壹起傳入。
& gt& gt& gtdef f(a,b,*,c):...返回a+b+c...& gt& gt& gtf(1,2,3)?#錯誤回溯(最近壹次調用):
文件" & lt標準輸入>,行1,在& lt模塊& gtTypeError: f()接受2個位置參數,但給定了3個& gt& gt& gtF(1,2,c=3) #正常6 >;& gt& gt
匿名函數
Python使用lambda創建匿名函數。
匿名意味著函數不再以標準形式定義,比如def語句。
Lambda只是壹個表達式,函數體比def簡單很多。
lambda的主體是壹個表達式,而不是代碼塊。lambda表達式中只能封裝有限的邏輯。
Lambda函數有自己的命名空間,它不能訪問自己的參數列表之外或全局命名空間中的參數。
雖然看起來lambda函數只能寫壹行,但它和C或C++的inline函數不壹樣,後者的目的是調用小函數而不占用堆棧內存,從而增加運行效率。
語法
lambda函數的語法只包含壹條語句,如下所示:
λ[arg 1[,arg2,.....argn]]:表達式
例子如下:
實例(Python 3.0以上)
#!/usr/bin/python3
#可寫函數描述sum = lambda arg1,arg2: arg1+arg2。
#調用sum函數print("加值為:",sum( 10,20 ))print("加值為:",sum( 20,20))。
以上示例的輸出結果:
附加價值是:?加30後的值是:?40
返回語句
還[表情]?語句用於退出函數,並有選擇地將表達式返回給調用方。不帶參數值的return語句返回None。前面的例子都沒有演示如何返回壹個數值。下面的示例演示了return語句的用法:
實例(Python 3.0以上)
#!/usr/bin/python3
#可寫函數描述定義和(arg1,arg2):?#返回兩個參數的和。"
?total = arg1 + arg2
?打印("在用:",總計)
?退貨總額
#調用sum函數total = sum( 10,20 )print ("Out of function:",total)。
以上示例的輸出結果:
在函數內:?30函數外:?30
強制位置參數
Python3.8增加了壹個函數參數語法/,表示函數參數必須使用指定的位置參數,而不是關鍵字參數。
在下面的例子中,形式參數A和B必須使用指定的位置參數,C或D可以是位置形式參數或關鍵字形參數,E或F必須是關鍵字形參數:def f(a,B,/,C,D,*,E,F):
印刷(阿、乙、丙、丁、英、法)
下列用法是正確的:
f(10,20,30,d=40,e=50,f=60)
以下使用方法會導致錯誤:
f(10,b=20,c=30,d=40,e=50,f=60)?# b不能使用f(10,20,30,40,50,f=60)形式的關鍵字參數?# e必須是關鍵字參數的形式。