1.什麼是函數:
可重複使用的,用來實作單一,或相關聯功能的代碼段。
函數分為内置函數和自定義函數,這裡先講自定義函數
2.如何定義函數:
#文法
def 函數名(參數1,參數2,參數3,...):
'''注釋'''
函數體
return 傳回的值
注:函數必須先定義才能使用,定義階段不執行代碼隻檢測文法.意思就是文法錯誤在定義階段就會檢測出來,代碼的邏輯錯誤隻有在執行時才會提示.
3.定義函數的三種形式
無參:用于執行一些列印等操作,不需要參數傳進去
有參:需要根據傳進去的參數進行運算
空函數:用于設計代碼結構
# 1.無參函數
# def foo():
# print('from foo')
# foo()
# # 2.有參函數
# def bar():
# print(x,y)
# bar(1,2)
# # 3,空函數
# def func():
# pass
4.函數調用
函數調用就是函數名加個()即可
4.1調用函數的三種形式:
# 1.語句形式
# def foo():
# print('from foo')
# foo()
#
# 2.表達式形式
# def foo(x,y):
# res = x+y
# return res
# res = foo(1,2)
# 3.可以當做參數傳給另外一個函數
# def max2(x,y):
# if x>y:
# return x
# else:
# return y
# res = max2(max2(1,2),3)
# print(res)
4.2函數的傳回值
1.傳回值沒有類型限制
2.傳回值沒有個數限制
注:傳回多個值的結果就是傳回一個元組,0個值傳回為None
return是函數結束的标準,可以有多個return但隻執行一次
# def f1():
# print('111')
# return 1
# print('222')
# return 2
# print('333')
# return 3
#def f1()
#隻執行 print('111')
4.3函數的參數
函數的參數分為形參和實參.形參即為變量名,實參為變量值,在函數調用時,把值綁定到變量名上,在函數調用結束後,解除綁定
形參與實參的具體分類(重點)
1.位置參數
1.1位置形參
在定義函數階段按照從左到右的順序定義的形參. 注:按位置定義的形參必須被傳值,多一個不行,少一個也不行
# def foo(x,y)
# print(x,y)
#
# foo(1,2) #正确
# foo(1,2,3) #錯誤
1.2位置實參
在調用函數階段按照從左到右的順序依次傳入的值.
2.關鍵字參數
關鍵字實參:在調用函數階段,按照key=value的形式指名道姓的為指定值傳值
注:可以完全打亂順序,仍可以為指定的形參傳值
可以混合使用位置實參和關鍵字實參,但必須注意(1)位置實參必須放在關鍵字實參前面(2)不能對一個形參重複指派
def foo(name,age):
print(name,age)
foo('zfj',18)
foo(age=18,name='egon')
# foo(name='zfj',18)#報錯
# foo('zfj', age=18)
3.預設參數
指的是在定義階段就已經為某個形參指派了,該形參稱之為有預設值的形參
注意:1.在定義階段就已經被指派,意味着在調用階段就可以直接使用,預設參數
2.位置形參應該放到預設形參前面
3.預設參數的值,通常應該為不可變類型
def foo(x,y=2):
print(x,y)
foo(1)#1,2
foo(1,3)#1,3
4.可變長度參數
站在實參的角度,參數長度可變指的是在調用函數時,傳入的實參的值個數不固定
4.1在形參中帶“*”:會将調用函數時溢出的位置實參儲存為元組的形式,然後指派給*後的變量
def foo(x,y,*z):
print(x,y,z)
foo(1,2,3,4,5)#1 2 (3, 4, 5)
4.2在形參中帶“**”:會将調用函數時溢出的關鍵字實參儲存成字典的形式,然後指派給**後的變量名
def foo(x,y,**z):
print(x,y,z)
foo(1,2,a=1,b=2)#1 2 {'a': 1, 'b': 2}
4.3在實參中帶“*”:在傳值前先被打散成位置實參,然後再進行指派
def foo(x,y,*z):
print(x,y,z)
foo(1,*[2,3,4,5,6])#1 2 (3, 4, 5, 6)
4.4在實參中帶“**”:在傳值前先被打散成關鍵字實參,然後再進行指派
def foo(x,y,z):
print(x,y,z)
foo(1,**{'y':2,'z':1})#1 2 1
5.命名關鍵字參數
放到*與**之間的參數稱為命名關鍵字參數。函數的調用者可以傳入任意不受限制的關鍵字參數
注意:命名關鍵字參數必須按照key = value的形式傳值
補充:
在形參中帶*與**的,*後的變量名應該為args,**後應該是kwargs
# 當我們想要将傳給一個函數的參數格式原封不動地轉嫁給其内部的一個函數,應該使用下面這種格式
def bar(x,y,z):
print(x,y,z)
def wrapper(*args,**kwargs):
bar(*args,**kwargs)
wrapper(1,2,z=3) #雖然調用的是wrapper,但是要遵循的卻是bar的參數标準
焚膏油以繼晷,恒兀兀以窮年。