定義函式
- 函式的定義
- 函式的分類
- 函式的建立方法
- 函式的返回return
函式的定義
- 將一件事情的步驟封裝在一起並得到最終結果
- 函式名代表了這個函式要做的事情
- 函式體是實現函式功能的流程
- 函式可以幫助我們重複使用功能,通過函式名我們可以知道函式的作用
函式的分類
- 內建函式:print、id、int、max、min、type....等
- 自定義函式:def 建立函式
函式的建立方法
通過關鍵字def來建立函式,def的作用是實現python中函式的建立
函式定義過程:
def 函式名(引數列表): 函式體# coding:utf-8 def say_Hello(): print("Hello Python")函式的呼叫
函式名+()小括號執行函式
# coding:utf-8 # 定義函式 def say_Hello(): print("Hello Python") # 執行函式 say_Hello() # 執行結果:Hello Python
函式的返回return
- return-將函式結果返回的關鍵字
- return只能在函式體內使用
- return支援返回所有的python型別
- 有返回值的函式可以賦值給一個變數
- return也有退出函式的作用
# coding:utf-8 def add(a,b): c=a+b return c result=add(1,2) print(result) # 輸出結果:3
函式的引數
- 必傳引數
- 預設引數
- 不確定引數
- 引數規則
必傳引數
- 函式中定義的引數沒有預設值,在呼叫函式時如果不傳入則會報錯
- 在定義函式的時候,引數後邊沒有等號與預設值
- 在定義函式的時候,沒有預設值且必須在函式執行的時候傳遞進去的引數,且順序與引數的順序相同,就是必傳引數
# coding:utf-8 def add(a,b): c=a+b return c result=add(1,2) print(result) # 輸出結果:3
預設引數
- 在定義函式的時候,定義的引數含有預設值,通過賦值語句給他是一個預設值
- 如果預設引數在呼叫函式的時候傳遞了新的值,函式將會優先使用後傳入的值進行工作
# coding:utf-8 def add(a,b=1): c=a+b return c print(add(1)) # 輸出結果:2 print(add(1,3)) # 輸出結果:4
不確定引數-可變引數
- 沒有固定的引數名和數量(不知道要傳的引數名具體是什麼)
- *args代表:將無引數的值合併成元組
- **kwargs代表:將有引數與預設值的賦值語句合併成字典
# coding:utf-8 def test_args(*args,**kwargs): print(args,type(args)) print(kwargs,type(kwargs)) test_args(1,2,3,4,5,6,name="zhangsan",age=22,top=175) # 輸出結果: # (1, 2, 3, 4, 5, 6) <class 'tuple'> # {'name': 'zhangsan', 'age': 22, 'top': 175} <class 'dict'># coding:utf-8 #引數是變數傳遞時,需要在變數前面加上*和**來區分傳遞的是元組還是字典,否則一律按元組*args處理 def test_args(*args,**kwargs): print(args,type(args)) print(kwargs,type(kwargs)) a=('python','java') b={"name":"zhangsan","age":22,"top":175} test_args(a,b) # 輸出結果: # (('python', 'java'), {'name': 'zhangsan', 'age': 22, 'top': 175}) <class 'tuple'> # {} <class 'dict'> test_args(*a,**b) # 輸出結果: # ('python', 'java') <class 'tuple'> # {'name': 'zhangsan', 'age': 22, 'top': 175} <class 'dict'>
引數規則
- 引數的定義從左到右依次是:必傳引數、預設引數、可變元組引數、可變字典引數
- 函式的引數傳遞非常靈活
- 必傳引數與預設引數的傳參多樣化
- 傳遞的引數與函式定義時的引數順序不一致時,使用賦值語句的方式傳參
# coding:utf-8 def test(a,b=1,*args): print(a,b,args) s=(1,2) test(1,2,*s) #1 2 (1, 2) # test(a=1,b=2,*s) ''' Traceback (most recent call last): File "D:/WorkSpace/Python_Study/test01.py", line 8, in <module> test(a=1,b=2,*s) TypeError: test() got multiple values for argument 'a' ''' # 報錯原因:當我們必選引數、預設引數與可選的元組型別引數在一起的時候,如果需要採取賦值的形式傳參,則在定義函式的時候需要將可變的元組引數放在第一位,之後是必傳、預設引數;這是一個特例!!! def test2(*args,a,b=1): print(a,b,args) test2(a=1,b=2,*s) #1 2 (1, 2)# coding:utf-8 def test(a,b=1,**kwargs): print(a,b,kwargs) test(1,2,name="zhangsan") # 1 2 {'name': 'zhangsan'} test(a=1,b=2,name="zhangsan") # 1 2 {'name': 'zhangsan'} test(name="zhangsan",age=33,b=2,a=1) # 1 2 {'name': 'zhangsan', 'age': 33}
函式的引數型別
- 引數型別的定義在python3.7之後可用
- 函式不會對引數型別進行驗證,只是看的作用
- 函式的引數型別具體是什麼,還得看方法中對引數的操作
# coding:utf-8 def test(a:int,b:int=3,*args:int,**kwargs:str): print(a,b,args,kwargs) test(1,2,3,'4',name='zhangsan') # 1 2 (3, '4') {'name': 'zhangsan'}
全域性變數與區域性變數
- 全域性變數
- 區域性變數
- global
全域性變數
函式體內對全域性變數只能讀取,不能修改
# coding:utf-8 name="張三" age=22 def test(): name="李四" print(name) print(age) test() #李四 22 print(name) #張三
區域性變數
區域性變數,無法在函式體外使用
# coding:utf-8 def test(): name="李四" print(name) #報錯
global
- 將全域性變數可以在函式體內進行修改
- global只支援str,int,float,tuple,bool,None型別。
- 對於list,dict不需要global宣告即可應用自帶方法在函式體內修改。
- 不建議使用global對全域性變數進行修改
# coding:utf-8 name="張三" age=22 source={"數學":"100","英語":99,"語文":80} like=["足球","籃球","乒乓球"] drink=("雪碧","可樂") eat={"漢堡","薯條"} def test(): global name,age name="zhangsan" age=18 source["英語"]=60 like[2]="羽毛球" # drink[0]="百事" 元組不可變,報錯 eat.update("雞翅") test() print("%s,%s,%s,%s,%s,%s"%(name,age,source,like,drink,eat)) # 輸出結果:zhangsan,18,{'數學': '100', '英語': 60, '語文': 80},['足球', '籃球', '羽毛球'],('雪碧', '可樂'),{'薯條', '翅', '漢堡', '雞'}
遞迴函式
- 遞迴是一種常見的數學和程式設計概念。它意味著函式呼叫自身。這樣做的好處是可以迴圈訪問資料以達成結果,類似while和for迴圈
- 通過return返回def()自身,即可實現遞迴效果
# coding:utf-8 count=0 def test(): global count if count<=5: count +=1 return test() else: print("當前計數為:{}".format(count)) test() # 輸出結果為:當前計數為:6
匿名函式
python 使用 lambda 來建立匿名函式。
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函式。
- lambda 只是一個表示式,函式體比 def 簡單很多。
- 自帶return
- lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lambda表示式中封裝有限的邏輯進去。
- lambda 函式擁有自己的名稱空間,且不能訪問自己引數列表之外或全域性名稱空間裡的引數。
- 雖然lambda函式看起來只能寫一行,卻不等同於C或C++的行內函數,後者的目的是呼叫小函式時不佔用棧記憶體從而增加執行效率。
# coding:utf-8 f=lambda x,y:x+y print(f(1,2)) #3 user=[{"name":"zhangsan"}, {"name":"lisi"}, {"name":"wangwu"}] user.sort(key=lambda x:x["name"]) print(user) #[{'name': 'lisi'}, {'name': 'wangwu'}, {'name': 'zhangsan'}]