Python函數

一、相關
函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段。

函數能提高應用的模塊性,和代碼的重複利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用戶自定義函數。

Python函數可以在類外定義。

Python函數類似Java中的方法。

二、定義一個Python函數
Python中以def開始定義函數,無需註明函數的返回值類型。
函數名後跟(),其中放入函數所需要的參數,同樣的參數不需要註明類型。
函數體以冒號開始,並且首行按規定縮進。
函數第一行可以選擇性地使用文檔字符串來進行函數說明。
可以選擇性地以return結束函數,不包含return的函數,返回值爲None。
1.函數定義通式
def 函數名(參數列表):
"函數說明"
函數體
2.定義一個hello函數
def hello():
"""一個hello函數"""
print("Hello World!!!")

hello()
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
Hello World!!!

Process finished with exit code 0
3.定義一個帶參函數
def hello(str):
"""一個hello函數"""
print(str)

str = "Hello World!!!"
hello(str)
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
Hello World!!!

Process finished with exit code 0
三、函數的調用
函數的簡單調用,我們在上面已經實現過,現在需要說明的是,函數在調用過程中,需要滿足函數的要求。比如,如果函數要求調用是需要傳入一個參數,那麼我們應當滿足這個要求,否則就會報錯

def hello(str): #要求傳入一個參數:str
"""一個hello函數"""
print(str)

str = "Hello World!!!"
hello(str) #傳入了參數
hello() #未傳入參數
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
Hello World!!!
Traceback (most recent call last):
File "E:/Workspaces/PycharmProjects/untitled/openTest.py", line 7, in <module>
hello() #未傳入參數
TypeError: hello() missing 1 required positional argument: 'str'

Process finished with exit code 1
如上運行結果所顯示的,第一次調用時傳入了參數,運行正常打印,第二次調用函數時,未傳入參數,出現報錯:hello() missing 1 required positional argument: 'str'

四、Python中參數的傳遞形式
首先我們需要知道的是,在Python中規定,對象才擁有類型,變量不用對類型。strings, tuples, 和 numbers 是不可更改的對象,而 list,dict 等則是可以修改的對象。

不可變類型(immutable):對於不可變類型變量來說,對其進行重新賦值後,並不是改變了這個變量的值,而是重新生成了一個不可改變類型對象,然後讓變量指向這個新生成的對象,原對象的值並沒有改變。Python函數傳遞不可變類型參數時,傳遞的知識值,相當於值傳遞。

可變類型(mutable):對可變類型變量來說,我們都是修改可變類型內的值,例如,我們傳入list類型後,會修改list內的某個值,但其實對於對象本身的儲存地址來說,是沒有改變的,相當於引用傳遞。

關於值傳遞和引用傳遞的相關內容請查看:我與校花同桌之間的金錢交易(又名:戲說值傳遞與引用傳遞,這還看不懂你來打我)

1.不可變類型參數傳遞
def change(a):
a += 1 # 對參數執行價1

a = 1
change(a)
print(a)
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
1

Process finished with exit code 0
執行程序後顯示,不可變類型參數的傳遞,不會影響原變量

2.可變類型參數傳遞
def change(list):
list.append(["baldwin","jack","tony"]) # 改變參數

list = ["tom","jsaon"]
print(list)
change(list)
print(list)
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
['tom', 'jsaon']
['tom', 'jsaon', ['baldwin', 'jack', 'tony']]

Process finished with exit code 0
五、傳參方式
除了通過參數傳遞方式來分類參數外,還可以通過參數要求的不同來分類參數:必需參數、關鍵字參數、默認參數、不定長參數

1.必需參數
必需參數是比較常見的,我們上面所定義的參數都是必需參數,必需參數要求我們以正確的順序傳入,不可缺失,否則報錯:hello() missing 1 required positional argument: 'str',上面有例子,這裏不再細說。

2.關鍵字參數
使用關鍵字傳參時,不再要求參數傳入順序與函數規定的參數順序相同,因爲Python解釋器會根據參數名關鍵字來自動對應參數。

def printBaldwin(name,age):
print(name+"`s age is " + age)

printBaldwin(name="Baldwin",age="18")
printBaldwin(age="19",name="Baldwin")
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
Baldwins age is 18<br/>Baldwins age is 19

Process finished with exit code 0
很明顯的,雖然第二次傳參的順序不符合函數規定順序,但是由於我們採用的是關鍵字傳參,參數仍然能夠正確地在函數中使用。

個人是比較喜歡關鍵字傳參的,這樣我們能夠清晰地看到每個參數是什麼意義,也不用擔心參數傳輸順序錯誤所導致的問題了。

3.默認參數
默認參數指的是,若是在調用函數時,沒有傳入某個參數,那麼函數會取一個默認值,這個值需要在定義函數時去註明。

def printBaldwin(name,age = "18"):
print(name+"`s age is " + age)

printBaldwin(name="Baldwin")
printBaldwin(age="20",name="Baldwin")
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
Baldwins age is 18<br/>Baldwins age is 20

Process finished with exit code 0
如上第一次調用printBaldwin函數時,並沒有傳入age的值,但是由於我們在定義printBaldwin函數時,已經規定了age參數默認值爲18,所以這種情況下我們得到了默認值18.

4.不定長參數
不定長參數在各個語言中都是很常見的,用來處理我們不知道需要具體多少個參數時候得情形。基本定義規則如下

def 方法名([formal_args,] [*var_args_tuple,][**var_args_dict] ):
"函數說明"
函數體
return [expression]
formal_args:普通函數形參

*var_args_tuple:不定長形參(元組)

**var_args_dict:不定長形參(字典)

不定長參數包括*var_args_tuple和**var_args_dict

我知道你看完基本定義規則後肯定一臉懵逼,別急,將以以下幾個例子來看:

var_args_tuple
def printBaldwin(name,age,
money):
print("普通形參 : name=",name)
print("普通形參 : age=",age)
print("不定長形參 :money=",money)

printBaldwin("Baldwin","18",1,1,1,1)
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
普通形參 : name= Baldwin
普通形參 : age= 18
不定長形參 :money= (1, 1, 1, 1)

Process finished with exit code 0
此時我們參數中的name和age就是普通形參,*money就是元組類型的不定長形參,在使用函數傳參時會先把普通形參的參數傳進去,然後再給不定長形參賦值。

當然如果定義方法時把name和age參數刪掉也是可以的,我們所有的值都會傳到*money這個不定長形參中。

var_args_dict
def printBaldwin(name,age,
money):
print("普通形參 : name=",name)
print("普通形參 : age=",age)
print("不定長形參 :money=",money)

printBaldwin("Baldwin","18",a=1,b=2,c=3)
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
普通形參 : name= Baldwin
普通形參 : age= 18
不定長形參 :money= {'a': 1, 'b': 2, 'c': 3}

Process finished with exit code 0
發現了麼?我們通過*var_args_dict傳進去參數的方式與var_args_tuple是不同的哦!而且在打印這個參數後我們可以看出**var_args_dict參數是以字典的形式存在的。

不定長參數總結
首先要明白的是,引入不定長參數的兩種方法,區別在於一個參數名之前有一個*,另一個是**。定長參數與兩種不定長參數,三者是可以混合使用的。

def printBaldwin(name,age,*wallet, **money):
print("name=",name)
print("age=",age)
print("wallet=",wallet)
print("money=",money)

printBaldwin("Baldwin","18", 1, 1, 1, a=1, b=2, c=3)
C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
name= Baldwin
age= 18
wallet= (1, 1, 1)
money= {'a': 1, 'b': 2, 'c': 3}

Process finished with exit code 0
還有一點比較重要的是,三者之間是存在順序的,定長參數最前,*args其次,**args最後

 六、匿名函數
匿名函數是一種很方便的用法,Python中使用lambda來創建匿名函數,注意,匿名函數不是說這個函數沒有名字!

lambda 只是一個表達式,函數體比 def 簡單很多。
lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
英國央行http://www.gendan5.com/decision/gbp.html lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數。
雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增加運行效率。
1.匿名函數基本通式
lambda [arg1 [,arg2,.....argn]]:expression
2.使用匿名函數來創建一個加法器
sum = lambda a ,b : a+b

print(sum(10,11))
sum作爲這個函數的函數名。

sum函數沒有方法體,不需要def來進行函數定義。

使用lambda來創建一個匿名函數。

a、b作爲匿名函數的參數。

冒號右邊說明本匿名函數的操作,加法器。

C:\Python\Python37-32\python.exe E:/Workspaces/PycharmProjects/untitled/openTest.py
21

Process finished with exit code 0
七、return
return [表達式] 語句用於退出函數,選擇性地向調用方返回一個表達式。不帶參數值的return語句返回None。有點編程基礎的同學都應該瞭解return,在此不再累述。

八、總結
1.Python中的函數類似Java中的方法,但是Python函數可以在類之外進行定義。

2.函數的不定長參數傳遞順序

3.匿名函數

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