一、形參和實參
1.1 形參
在函數定義階段括號內定義的參數,稱之為形式參數,簡稱形參,本質就是變量名。
def func(x, y):
print(x)
print(y)
1.2 實參
在函數調用階段括號內傳入的參數,稱之為實際參數,簡稱實參,本質就是變量的值。
func(1, 2)
二、位置參數
2.1 位置形參
在函數定義階段,按照從左到右的順序依次定義的形參,稱之為位置形參。
def func(x, y):
print(x)
print(y)
特點:按照位置定義的形參,都必須被傳值,多一個不行,少一個也不行。
2.2 位置實參
在函數調用階段,按照從左到右的順序依次定義的實參,稱之為位置實參。
func(1, 2)
特點:按照位置為對應的形參依次傳值。
三、關鍵字實參
在調用函數時,按照key=value的形式為指定的參數傳值,稱為關鍵字實參。
func(y=2, x=1)
特點:可以打破位置的限制,但仍能為指定的形參賦值。
注意:
- 可以混用位置實參和關鍵字實參,但是位置實參必須在關鍵字實參的左邊。
- 可以混用位置實參和關鍵字實參,但不能對一個形參重復賦值。
func(x, y=2)
func(y=2, x) # SyntaxError: positional argument follows keyword argument
func(x, x=1) # NameError: name 'x' is not defined
四、默認形參
在定義階段,就已經被賦值。
def func(x, y=10):
print(x)
print(y)
func(2)
特點:在定義階段就已經被賦值,意味着在調用時可以不用為其賦值。
注意:
- 位置形參必須放在默認形參的左邊。
- 默認形參的值只在定義階段賦值一次,也就是說默認參數的值在函數定義階段就已經固定了。
m = 10
def foo(x=m):
print(x)
m = 111
foo() # 10
- 默認參數的值通常應該是不可變類型。
# 演示形參是可變類型
def register(name, hobby, hobby_list=[]):
hobby_list.append(hobby)
print(f"{name} prefer {hobby}'")
print(f"{name} prefer {hobby_list}")
register('nick', 'read')
register('tank', 'zuipao')
register('jason', 'piao')
nick prefer read'
nick prefer ['read']
tank prefer zuipao'
tank prefer ['read', 'zuipao']
jason prefer piao'
jason prefer ['read', 'zuipao', 'piao']
# 修改形參是可變類型代碼
def register(name, hobby, hobby_list=None):
if hobby_list is None:
hobby_list = []
hobby_list.append(hobby)
print(f"{name} prefer {hobby}'")
print(f"{name} prefer {hobby_list}")
register('nick', 'read')
register('tank', 'zuipao')
register('jason', 'piao')
nick prefer read'
nick prefer ['read']
tank prefer zuipao'
tank prefer ['zuipao']
jason prefer piao'
jason prefer ['piao']
五、總結
實參的應用:取決於個人習慣
形參的應用:
- 大多數情況的調用值一樣,就應該將該參數定義成位置形參
- 大多數情況的調用值一樣,就應該將該參數定義成默認形參