day 10 函式的進階

楊洪濤發表於2018-12-10
動態傳參 (重點)  *    **
形參
 * args在形參位置, *表示不定引數–接受的是位置引數
  接受到的位置引數的動態傳參:  都是元組
形參的順序:
位置  *args 預設值  **kwargs   以後寫引數,可以隨意的進行搭配
def chi(zhushi, cai, fushi, tang, tiandian):
    print(zhushi,cai,fushi,tang,tiandian)
 
 
chi(“大碗大米飯”, “火爆大頭菜”, “把子肉”, “蕃茄雞蛋湯”, “烤地瓜”)
chi(“小碗大米飯”, “火爆大頭菜”) # 引數不夠
 
形參的順序(重點):
  位置  *args  預設值  **kwargs
以後寫引數. 可以隨意的進行搭配, 但是, 順序不能串
**kwargs在形參表示動態傳參–關鍵字引數,關鍵字動態傳參接收到的是字典
**在形參表示動態傳參-關鍵字引數
關鍵字動態傳參接收到的是字典
def func(**kwargs):  # 也是聚合. ** 聚合成字典
    print(kwargs)
 
# func(1,2,3,4,5,6,7) # 位置引數. 報錯
func(a=1, b=2, c=3, haha=”呵呵”, good=”not bad”)
實參
*在實參的是打散,把列表,元組,字串打散成位置引數進行傳遞
** 在形參表示動態傳參–關鍵字引數;打散,打散成關鍵字
關於*和**
    形參:   聚合
              位置引數*   ->元組
              關鍵字**   ->  字典
    實參:   打散
              列表,字串,元素   ->  *
              字典         ->**
無敵傳參
def func(*args, **kwargs): arguments引數  keyword-arguments關鍵字引數
            pass
作用域(重要)和名稱空間
名稱空間:用來存放名字(變數,函式名,類名,引入的模組)的
1.全域性名稱空間:我們在py檔案中自己寫的變數, 函式…..
2.內建名稱空間; 我們python直譯器提供好的一些內建內容  (print,input……….)
3.區域性名稱空間: 在我們執行函式的時候,會產生一個區域性名稱空間.放的是:函式內部的內容
名稱空間可能會有無數個,對於區域性名稱空間.相對是獨立的,一般互不干擾
作用域:
1.全域性作用域:  內建+全域性
2.區域性作用域:   區域性
從全域性找區域性-> 找不到
從區域性找全域性-> 可以找到
怎麼檢視全域性或區域性中的內容:
  globals  全域性作用域: 內建+全域性名稱空間
  locals  檢視當前作用域的內容
def chi():
    a = 20
    b = 30
    print(locals()) # 檢視當前作用域中的內容
    print(globals()) # alex,老男孩兒, 武sir, 全域性作用域中的內容
chi()
print(locals()) # 全域性
print(globals()) # 全域性
函式的巢狀
nonlocal和global   關鍵字(重點)
global  表示從全域性把一個變數引入區域性,後面使用的都是全域性變數
nonlocal   在區域性,尋找離他最近的外層的一個變數
如果沒有global和nonlocal  ,查詢的順序:自己,上一層,上一層,上一層
函式的互相呼叫
def func1():
    print(“我是神器的func1”)
 
def func2():
    func1()
    print(“我是神器的func2”)
 
def func3():
    print(“我是神器的func3”)
    # func5()
 
def func4():
    func3()
    print(“我是神器的func4”)
 
def func5():
    func2()
    func3()
    print(“我是神器的func5”)
 
def func6():
    func5()
    print(“我是神器的func6”)
    func3()
    func1()
 
func6()
def outer():
    def inner():
        print(“我的天哪”)
    print(“還可以這樣寫???”)
    inner()
 
outer()
 
inner() # 在全域性不能找到區域性的內容
 
def func1():
    print(“1”)
    def func2():
        print(“2”)
        def func3():
            print(“3”)
        print(“4”)
        func3()
        print(5)
    print(“6”)
    func2()
    print(“7”)
 
func1()
 
 
全域性變數一般是不能隨意的修改的
a = 10
def func():
    # 慎用.
    global a  # global 表示從全域性把一個變數引入到區域性, 後面使用的a都是全域性變數
    a += 10 # ?? a = a + 10 # 現在的a是全域性的, 你現在檢視改全域性變數
    print(“裡面的列印”,a)
func()
print(“外面的列印”, a)
 
 
a = 10
def func():
    def inner():
        # 慎用.
        global a  # global 表示從全域性把一個變數引入到區域性, 後面使用的a都是全域性變數
        a += 10 # ?? a = a + 10 # 現在的a是全域性的, 你現在檢視改全域性變數
        print(“裡面的列印”,a)
    inner()
func()
print(“外面的列印”, a)
 
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)
 
如果沒有nonlocal和global 查詢的順序: 自己, 上一層, 上一層, 上一層
 
def func0():
    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)
func0()
 
 
a = 1
def fun_1():
    a = 2
    def fun_2():
        nonlocal a
        a = 3
        def fun_3():
            a = 4
            print(a)
        print(a)
        fun_3()
        print(a)
    print(a)
    fun_2()
    print(a)
print(a)
fun_1()
print(a)
 
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()
 

相關文章