Python基礎入門(5)- 函數的定義與使用
- 2021 年 12 月 13 日
- 筆記
- Python基礎入門, 測試開發 - python
定義函數
- 函數的定義
- 函數的分類
- 函數的創建方法
- 函數的返回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'}]