day10函式進階
一,函式的引數:
1.動態引數:
動態位置引數:*args
動態預設值引數**kwargs
注:1.動態接收引數的時候要注意: 動態引數必須在位置引數後⾯面
2.順序: 位置引數 > *args > 預設值引數 > **kwargs
動態傳參的另一種傳參方式:
在實參位置上給一個序列,列表,可迭代物件前面加個*表示吧這個順序打散.
在形參的位置上的*表示吧接收到的引數組合成一個元組
如果是一個字典,那麼也可以打散,不過需要兩個*
def fun(*args): print(args)
列表
def fun(*args):
print(argslst = [1, 4, 7])
fun(lst[0], lst[1], lst[2])
fun(*lst) # 可以使用*把⼀一個列表按順序打散
s = "⾂妾做不到"
fun(*s) # 字串也可以打散, (可迭代物件)
字典
def fun(**kwargs):
print(kwargs)
dic = {'a':1, 'b':2}
fun(**dic)
3.函式的註釋
def chi(food, drink):
""" 這裡是函式的註釋 , 先寫一下當前這個函式是幹什麼的 , 比如我這個函式就是⼀一個吃 :param :param food: 引數 food 是什麼意思
:param :param drink: 引數 drink 是什麼意思 :
return :return: 返回的是什麼東東
"""
print(food, drink)
return "very good
二,名稱空間:
定義:給存放名字和值的關係的空間起⼀一個名字叫: 名稱空間
1.名稱空間分類:
1. 全域性名稱空間--> 我們直接在py檔案中, 函式外宣告的變數都屬於全域性名稱空間
2. 區域性名稱空間--> 在函式中宣告的變數會放在區域性名稱空間
3. 內建名稱空間--> 存放python直譯器為我們提供的名字, list, tuple, str, int這些都是內 置名稱空間
載入順序: 1. 內建名稱空間>>>>2. 全域性名稱空間>>>>3. 區域性名稱空間(函式被執行的時候)
取值順序: 1. 區域性名稱空間>>>>2. 全域性名稱空間>>>> 3. 內建名稱空間
2.作用域: 作用域就是作用範圍, 按照生效範圍來看分為 全域性作用域和區域性作用域
全域性作用域: 包含內建名稱空間和全域性名稱空間. 在整個檔案的任何位置都可以使用(遵循 從上到下逐行執行).
區域性作用域: 在函式內部可以使用.
作用域名稱空間: 1. 全域性作用域: 全域性名稱空間 + 內建名稱空間 2. 區域性作用域: 區域性名稱空間
globals()函式來檢視全域性作用域中的內容,
locals()來檢視區域性作 用域中的變數和函式資訊
a = 10
def func():
a = 40
b = 20
def abc():
print("哈哈")
print(a, b) # 這裡使用的是區域性作用域
print(globals()) # 列印全域性作用域中的內容
print(locals()) # 列印區域性作用域中的內容
func()
三,函式的巢狀
1,只要遇見()就表示函式的呼叫,如果沒有()就不是函式的呼叫
2.函式的執行順序
四關鍵字:global和nonlocal
global表示. 不再使用區域性作用域中的內容了了. 而改用全域性作用域中的變數
a=100
def func():
global a
a=28
func()
print(a)
結果為28,28
nonlocal 表示在區域性作用域中,呼叫父級名稱空間中的變數
a=10
def func1():
a=20
def func2():
nonlocal a
a=30
print(a)
func2()
print(a)
func1()
結果為 :20,30