天天看點

day 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()