函數(shù)參數(shù)--動態(tài)傳參
gloabal, nonlocal關鍵字
- 函數(shù)參數(shù)--動態(tài)傳參
- 動態(tài)接收位置參數(shù)
?先我們先回顧一下位置參數(shù), 位置參數(shù), 按照位置進行傳參锌杀。
def chi(quality_food, junk_food):
print("我要吃", quality_food, junk_food)
chi("?大?米飯", "?小?米飯")
結果:
我要吃 ('?大?米飯', '?小?米飯')
# "?大?米飯"傳遞給quality_food "?小?米飯"傳遞給junk_food
現(xiàn)在問題來了. 我想吃任意的食物. 數(shù)量是任意的, 食物也是任意的. 這時我們就要?用到 動態(tài)參數(shù)了.
在參數(shù)位置編寫*表?示接收任意內容
def chi(*food):
print("我要吃", food)
chi("?大?米飯", "?小?米飯")
結果:
我要吃 ('?大?米飯', '?小?米飯')
# 多個參數(shù)傳遞進去. 收到的內容是元組tuple
動態(tài)接收參數(shù)的時候要注意: 動態(tài)參數(shù)必須在位置參數(shù)后?
def chi(*food,a,b):
print("我要吃",food,a,b)
chi("大米","小米","紅燒肉","茄子")
這時程序運?行行會報錯. 因為前?面?zhèn)鬟f進去的所有位置參數(shù)都被*food接收了了. a和b永遠接收 不到參數(shù)
Traceback (most recent call last):
File"/Users/sylar/PycharmProjects/oldboy/fun.py", line 95, in <module> chi("?大?米飯", "?小?米飯", "?黃?瓜", "茄?子")
TypeError: chi() missing 2 required keyword-only arguments: 'a' and 'b'
所以必須改寫成以下代碼:
def chi(*food, a, b):
print("我要吃", food, a, b)
chi("?大?米飯", "?小?米飯", a="?黃?瓜", b="茄?子") # 必須?用關鍵字參數(shù)來指定
這個時候a和b就有值了了, 但是這樣寫呢位置參數(shù)就不能?用了了. 所以. 我們要先寫位置參數(shù), 然后再?動態(tài)參數(shù).
def chi(a, b, *food):
print("我要吃", a, b, food)
chi("?大?米飯", "?小?米飯", "饅頭", "?面條")
# 前兩個參數(shù)用位置參數(shù)來接收, 后面的參數(shù)?動態(tài)參數(shù)接收.
那默認值參數(shù)呢?
def chi(a, b, c='饅頭', *food):
print(a, b, c, food)
chi("?蕉", "菠蘿") # ?蕉 菠蘿 饅頭 (). 默認值?生效
chi("香蕉", "菠蘿", "葫蘆娃") # 香蕉 菠蘿 葫蘆娃 () 默認值不不?生效
chi("?蕉", "菠蘿", "葫蘆娃", "口罩") # 香蕉 菠蘿 葫蘆娃 ('?罩',) 默認值不生效
發(fā)現(xiàn)默認值參數(shù)寫在動態(tài)參數(shù)前面. 默認值只有一種情況可能會生效.
def chi(a, b, *food, c="娃哈哈"):
print(a, b, food, c)
chi("?蕉", "菠蘿") # 香蕉 菠蘿 () 娃哈哈 默認值?生效
chi("香蕉", "菠蘿", "葫蘆娃") # 香蕉 菠蘿 ('葫蘆娃',) 娃哈哈 默認值?生效
chi("香蕉", "菠蘿", "葫蘆娃", "口罩") # 香蕉 菠蘿 ('葫蘆娃', '口罩') 娃哈哈 認值?生效
這個時候我們發(fā)現(xiàn)所有的默認值都?生效了. 這個時候如果不給出關鍵字傳參. 那么你的默認值是永遠都生效的.
順序: 位置參數(shù), 動態(tài)參數(shù)*, 默認值參
- 動態(tài)接收關鍵字參數(shù)
在python中可以動態(tài)的位置參數(shù), 但是這種情況只能接收位置參數(shù)?法接收關鍵字參數(shù).
在python中使?*來接收動態(tài)關鍵字參數(shù)
def func(**kwargs):
print(kwargs)
func(a=1, b=2, c=3)
func(a=1, b=2)
結果:
{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2}
這個時候接收的是一個dict
- 順序的問題, 在函數(shù)調用的時候, 如果先給出關鍵字參數(shù), 則整個參數(shù)列表會報錯.
def func(a, b, c, d):
print(a, b, c, d)
# 關鍵字參數(shù)必須在位置參數(shù)后?面, 否則參數(shù)會混亂
func(1, 2, c=3, 4)
- 所以關鍵字參數(shù)必須在位置參數(shù)后面. 由于實參是這個順序. 所以形參接收的時候也是這個順序. 也就是說位置參數(shù)必須在關鍵字參數(shù)前面. 動態(tài)接收關鍵字參數(shù)也要在后?.
最終順序(*):
位置參數(shù) > *args > 默認值參數(shù) > **kwargs
這四種參數(shù)可以任意的進?行行使?用. 如果想接收所有的參數(shù):
def func(*args, **kwargs):
print(args, kwargs)
func("麻花藤","?馬暈",wtf="胡辣湯")
動態(tài)參數(shù)的另?一種傳參?方式:
def fun(*args):
print(args)
lst = [1, 4, 7]
fun(lst[0], lst[1], lst[2])
fun(*lst) # 可以使?用*把?一個列列表按順序打散
s = "?臣妾做不不到"
fun(*s) # 字符串串也可以打散, (可迭代對象)
在實參位置上給一個序列,列表,可迭代對象前面加個*表示把這個序列列按順序打散.
在形參的位置上的* 表示把接收到的參數(shù)組合成一個元組 如果是?個字典, 那么也可以打散. 不過需要用兩個*
def fun(**kwargs):
print(kwargs)
dic = {'a':1, 'b':2}
fun(**dic)
- 函數(shù)的注釋:
def chi(food, drink):
"""
這?里里是函數(shù)的注釋
:param:param food: 參數(shù)food是什什么意思 :param:param drink: 參數(shù)drink是什什么意思
:return:return: 返回的是什么東東
"""
print(food, drink)
return "very good"
- 關鍵字global和nonlocal
- ?先我們寫這樣?個代碼, 首先在全局聲明?一個變量, 然后再局部調?用這個變量, 并改變這 個變量的值
a = 100
def func():
global a # 加了了個global表示不不再局部創(chuàng)建這個變量量了了. 而是直接使用全局的a
a = 28
print(a)
func()
print(a)
global表示. 不再使用局部作?域中的內容了. ?改用全局作用域中的變量
nonlocal 表?在局部作用域中, 調?用父級命名空間中的變量
a = 10
def func1():
a = 20
def func2():
nonlocal a
a = 30
print(a)
func2()
print(a)
func1()
結果:
加了nonlocal
30
30
不加nonlocal
30
20