基礎規則:
函數代碼塊以def
關鍵詞開頭,後接函數標識符名稱和圓括號()
。
def 函數名(參數列表):
函數體
任何傳入參數和自變量必須放在圓括號中間,圓括號之間可以用於定義參數(可多個,但儘量不要多於四個)。
函數的第一行語句可以選擇性地使用文檔字符串——用於存放函數說明。
函數內容以冒號起始,並且縮進。
return [表達式]
結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回 None。
def area(width, height):
return width * height
w = int(input("請輸入寬"))
h = int(input("請輸入高"))
print("面積是 =", area(w, h))
函數調用
定義函數,指定函數所包含的參數和代碼塊結構,通過另一個函數進行調用執行。
def zhengyuting(str):
print(str)
return
zhengyuting("Expecto Patronum!") #調用函數
zhengyuting("Ridiculous!") #再次調用函數
參數傳遞
zyt=[1,2,3,4,5] #[1,2,3,4,5]的類型爲List
zyt="zhnegyuting" #"zhnegyuting" 的類型爲String,zyt沒有類型,它是一個變量,是一個對象的引用(一個指針),可以指向各種類型
參數
調用函數時可以使用的參數類型:
①必需參數:以正確的順序傳入函數,調用時的數量和聲明時的一致,調用函數時必須傳入參數,否則報錯。
②關鍵字參數
函數調用使用關鍵字參數來確定傳入的參數值,使用關鍵字參數允許與聲明時的不一致(Python解釋器能夠用參數名匹配參數值)
def zhengyuting(str):
print(str)
return
zhengyuting(str = "Expecto Patronum!") #使用參數名進行函數調用
③默認參數
調用函數時,沒有傳遞參數,則使用默認參數。
④不定長參數
一個函數能處理比當初聲明時更多的參數。
使用一個星號即*
以元組形式導入。(單獨出現星號 * 後的參數必須用關鍵字傳入。)
使用兩個星號即**
的參數會以字典的形式導入。
def f(a,b,*,c):
return a+b+c
f(1,2,3) # 報錯
f(1,2,c=3) # 正常
def zhengyuting(one,*thetuple): #使用星號*的參數以元組形式導入,以存放所有未命名變量參數
print(one)
print(thetuple)
zhengyuting(1,2,3,4)
如果在函數調用時沒有指定參數,它就是一個空元組,可以不向函數傳遞未命名的變量。
對象
可更改對象(可變類型):list,dict
(類比:整容)
不可更改對象(不可變類型):string,tuples,numbers
(類比:換人)
可更改表示它本身沒有改變,只是它內部的一部分值被改變。
不可更改的對象在被修改時,實際上已經是新的對象。
可變類型在參數傳遞時,函數外部的參數也會受到影響,而不可變類型則不會受到影響。
#可變類型
def zhengyuting(zytlist):
zytlist.append([1,2,3])
print("inner",zytlist)
return
zytlist=[4,5,6]
zhengyuting(zytlist)
print("outer",zytlist)
#不可變類型
def zhengyuting(a):
a = 3
b = 1
zhengyuting(b)
print(b)
匿名函數
lambda 可以創建匿名函數。
匿名即不再使用 def 語句這樣標準的形式定義一個函數。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數。雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率。
語法格式:
lambda [arg1 [,arg2,.....argn]]:expression