PYTHON-函數的定義與調用,返回值,和參數



函數基礎
'''
1. 什么是函數
具備某一功能的工具->函數
事先准備工具的過程--->函數的定義
遇到應用場景,拿來就用---->函數的調用

函數分類兩大類:
1. 內置函數
2. 自定義函數

2. 為何要用函數
1. 代碼冗余
2. 可讀性差
3. 可擴展性差

一 為何要用函數之不用函數的問題
#1、代碼的組織結構不清晰,可讀性差
#2、遇到重復的功能只能重復編寫實現代碼,代碼冗余
#3、功能需要擴展時,需要找出所有實現該功能的地方修改之,無法統一管理且維護難度極大

3. 如何用函數
原則:必須先定義,再調用

定義函數的語法:
def 函數名(參數1,參數2,...):
"""文檔注釋"""
code1
code2
code3
....
return 返回值
調用函數的語法:
函數名(值1,值2,...)
'''

函數的使用應該分為兩個明確的階段:先定義后調用
1. 定義階段:只檢測語法,不執行函數體代碼
2. 調用階段:會觸發函數體代碼的執行

二 函數使用的原則:先定義,再調用
三 函數在定義階段都干了哪些事?
#只檢測語法,不執行代碼
也就說,語法錯誤在函數定義階段就會檢測出來,而代碼的邏輯錯誤只有在執行時才會知道

函數的定義與調用形式
一:定義函數三種形式
1、有參:需要根據外部傳進來的參數,才能執行相應的邏輯,比如統計長度,求最大值最小值
2、無參:應用場景僅僅只是執行一些操作,比如與用戶交互,打印
3、空函數:設計代碼結構
'''
# 有參函數
def func(x):
pass
func(1)
# 無參函數
def bar():
pass
bar()
# 空函數
def shopping():
pass
'''

二:函數調用的三種形式
函數的調用:函數名加括號
1 先找到名字
2 根據名字調用代碼

register() # 1,語句形式(單純的語句操作,沒有返回值)

def max2(x,y):
if x > y:
return x
else:
return y
res=max2(10,20)*12 # 2,表達式(可以+-*/)

res=max2(max2(10,20),30) # 3,將函數的調用當作參數傳給另外一個函數
print(res)


函數的返回值return
注意點:
1. 函數的返回值沒有類型限制
2. 函數的返回值沒有個數限制

return返回值的三個功能
2.1 返回多個值: 多個返回值用逗號分隔開,返回的是元組形式
def func():
print('from func')
return 1,1.1,'hello',[1,2,3]
res=func()
print(res,type(res))
2.2 返回1個值: 返回的就是該值本身
def func():
return 123
res=func()
print(res,type(res))
2.3 返回0個值或者干脆沒有return: 返回None
def func():
# return
pass
res=func()
print(res)

return除了有返回值的功能,還有結束函數執行的的功能
函數內可以有多個return,但只要執行一次,整個函數就立即結束,並且將return后的值返回
def func():
print(1)
return
print(2)
return
print(3)
func()


函數參數的使用!!!!!

函數的參數
一 形參與實參
#形參即變量名,實參即變量值,函數調用時,將值綁定到變量名上,函數調用結束,解除綁定

一: 函數的參數分為兩大類:
形式參數(形參): 在定義函數階段,括號內定義的參數/變量名 稱為形參
實際參數(實參): 在調用函數階段,括號內傳入的值/變量值 稱為實參
ps: 在調用函數階段會將實參(值)的值綁定給形參(變量名),\
這種綁定關系只在調用函數時生效,在函數執行完畢后就會解除綁定

二: 細分:
1. 位置\參數:
1.1 位置形參: 在定義階段,按照從左到右的順序依次定義的形參稱之為位置形參
特點: 但凡時按照位置定義的形參,必須被傳值,多一個不行少一個也不行
1.2 位置實參: 在調用階段,按照從左到右的順序依次傳入的值稱之為位置實參
特點:與形參一一對應
def func(x,y,z):
print(x,y,z)
func(2,1,4)

2. 關鍵字實參: 在調用階段,按照key=value的形式定義的實參稱之為關鍵字實參
特點: 可以完全打亂順序,但仍然能為指定的形參傳值(總結:指名道姓地為指定的形參傳值)
實參的形式可以是位置實參與關鍵字實參混合使用,但是必須遵循原則
1.位置實參必須放在關鍵字實參的前面
2.不能對同一個形參重復傳值
func(1,z=3,y=2)
func(z=3,1,y=2) #錯誤
func(1,z=3,x=2,y=3) #錯誤

3. 默認形參:在定義階段,就已經為形參賦值,該形參稱之為默認參數
特點
1. 定義階段就已經有值意味着調用階段可以不用傳值
2. 位置形參必須放到默認形參的前面
3. 默認形參的值只在定義時賦值一次,定義階段之后的改動不會影響該值
4. 默認形參的值通常應該是不可變類型
def func(x,z=100,y): # 位置形參必須放到默認形參的前面
print(x,y,z)

m=10
def func(x,y,z=m):
#z=10
print(x,y,z)
m=100 # 默認形參的值只在定義時賦值一次,定義階段之后的改動不會影響該值
func(1,2)

def add_hobby(name,x,hobbies=[]): # 默認形參的值通常應該是不可變類型
hobbies.append(x)
print('%s 的愛好有 %s' %(name,hobbies))

add_hobby('egon練習','read',[])
add_hobby('wxx','eat',[])
add_hobby('alex','piao',[])

正確的做法
def add_hobby(name,x,hobbies=None):
if hobbies is None:
hobbies=[]
hobbies.append(x)
print('%s 的愛好有 %s' %(name,hobbies))

add_hobby('egon練習','read',)
add_hobby('wxx','eat',)
add_hobby('alex','piao')

4. 可變長參數:
可變長實參:指的是在調用階段,實參值個數是不固定的,
實參無非兩種形式(位置,關鍵字實參),
對應着形參也必須有兩種解決方案來分別接收溢出位置實參或者關鍵字實參
*--->溢出的位置實參
**--->溢出的關鍵字實參

4.1 *的用法
在形參前加*:*會將溢出的位置實參存成元組的形式,然后賦值給*后的形參名
def func(x,y,*z): #z=(3,4,5)
print(x,y,z)
func(1,2,3,4,5)

在實參前加*:但凡碰到實參中帶*的,先將實參打散成位置實參再與形參做對應
func(*[1,2,3,4,5]) #func(1,2,3,4,5)
func(*[1,2,3]) #func(1,2,3)
func(1111,2222,*[1,2,3,4,5]) #func(1111,2222,1,2,3,4,5)

4.2 **的用法
在形參前加**:**會將溢出的關鍵字實參存成字典的形式,然后賦值給**后的形參名
def func(x,y,**z): #z={'c':3,'b':2,'a':1}
print(x,y,z)
func(1,y=2,a=1,b=2,c=3)

在實參前加**:但凡碰到實參中帶**的,先將實參打散成關鍵字實參再與形參做對應
def func(x,y,z):
print(x,y,z)
func(1,**{'y':2,'z':3}) #func(1,z=3,y=2)
func(1,**{'a':2,'y':333,'z':3}) #func(1,a=2,y=333,z=3) # a錯誤,位置形參必須被傳值

def func(x,y,**z):
print(x,y,z)
func(**{'y':1,'x':2,'a':1111,'b':2222}) #func(y=1,x=2,a=1111,b=2222)

形參中:*args,**kwargs
def func(x,*args):
print(x)
print(args)

def func(x,**kwargs):
print(x)
print(kwargs)

*與**的應用:見練習

四種形參的順序:位置形參---默認形參---*args---**kwargs


命名關鍵字參數: 在定義函數時,*與**之間參數稱之為命名關鍵字參數
特點:
在調用函數時,命名關鍵字參數必須按照key=value的形式傳值





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM