1. 程式人生 > >動態傳參(*args **kwargs 無敵傳參) 作用域globals locals和名稱空間 函式的巢狀 關鍵字nonlcas global

動態傳參(*args **kwargs 無敵傳參) 作用域globals locals和名稱空間 函式的巢狀 關鍵字nonlcas global

動態傳參(重點)  *, **
*, ** :
形參: 聚合

位置引數* -> 元組
關鍵字** -> 字典

實參: 打散

列表, 字串, 元素 -> *
字典 -> **
形參的順序(重點):
位置 *args(位置引數動態傳參) 預設值 **kwargs(關鍵字動態傳參)
以後寫引數. 可以隨意的進行搭配, 但是, 順序不能串

* 在形參位置. * 表示不定引數-接收的是位置引數
接收到的位置引數的動態傳參: 都是元組
def chi(*food): # 在形參這裡把傳遞過來的實參進行了聚合,聚合成了元組
print(food)
**在形參表示動態傳參-關鍵字引數

關鍵字動態傳參接收到的是字典
def func(**kwargs): # 也是聚合. ** 聚合成字典
print(kwargs)
# 無敵傳參
def func(*args, **kwargs): # 引數沒有限制. 隨便傳遞
    print(args)
    print(kwargs)
形參:
*->元組, **->字典 表示聚合
實參:
*->列表,字串,元組, **->字典 表示打散
名稱空間: 用來存放名字(變數, 函式名, 類名, 引入的模組名)的

1. 全域性名稱空間: 我們在py檔案中自己寫的變數, 函式.....
2. 內建名稱空間: 我們python直譯器提供好的一些內建內容(print, input....)
3. 區域性名稱空間: 在我們執行函式的時候.會產生一個區域性名稱空間. 放的是: 函式內部的內容(變數, 函式,類...)

名稱空間可能會有無數個, 區域性名稱空間而言. 相對是獨立的.一般互不干擾
作用域:
1. 全域性作用域: 內建+全域性 2. 區域性作用域: 區域性

globals() 檢視全域性作用域
locals() 檢視當前作用域
 
從全域性去找區域性 -> 找不到
區域性去找全域性 -> 可以找到
# print(locals()) # 全域性
# print(globals()) # 全域性
globals() 檢視全域性作用域      locals() 檢視當前作用域



函式的巢狀

在函式中宣告函式
在內部函式中使用變數的時候, 查詢順序: 先找自己 -> 上一層 -> 上一層..全域性 -> 內建
函式的巢狀:
def
func1(): print("1") def func2(): print("2") def func3(): print("3") print("4") func3() print(5) print("6") func2() print("7") func1() # 1 # 6 # 2 # 4 # 3 # 5 # 7
全域性變數一般是不能隨意的修改的
a = 10
def func():
    # 慎用.
    global a  # global 表示從全域性把一個變數引入到區域性, 後面使用的a都是全域性變數
    a += 10 # ?? a = a + 10 # 現在的a是全域性的, 你現在檢視改全域性變數
    print("裡面的列印",a)
func()
print("外面的列印", a)
# 裡面的列印 20
# 外面的列印 20

 


nonlocal 在區域性, 尋找離他最近的外層的一個變數 a
= 50 def func1(): # a = 10 # 區域性 def func2(): nonlocal a # 不找全域性, global找全域性 a += 10 # a = a + 10 python不讓這麼幹 print("func2", a) func2() print(a) func1() print(a) 這裡會報錯
從全域性去找區域性 -> 找不到
區域性去找全域性 -> 可以找到
# 如果沒有nonlocalglobal 查詢變數的順序: 自己, 上一層, 上一層, 上一層
global的用法:
當需要使用者貼吧需要登入才能發帖的時候需要改變全域性的變數
flag = False

def login():
    global flag
    uname = input("使用者名稱:")
    upwd = input("密碼:")
    if uname == "alex" and upwd == "123":
        flag = True
    else:
        flag = False

def fatie():
    if flag == True:
        print("可以發帖")
    else:
        print("滾去登入")

login()

fatie()
fatie()
fatie()
fatie()