一、動態參數(不定長參數)def func(*args):


形參: 3種 動態參數
args元組,他包含了你所有的位置參數.
*args 動態參數,不定長參數
**kwargs 他包含了關鍵字動態參數

themeleaf src取動態參數_themeleaf src取動態參數

 

*rarge用法
def func(*args):
    print(args,type(args))
func(1,2,'alex',3,4,5,6,8,4,7,2)

結果

themeleaf src取動態參數_作用域_02

 

*args按位置對應不能放到,其他形參位置前邊


def func(*args,a,b,c):
    print(a)
    print(b)
    print(c)
    print(args,type(args))
func(1,2,'alex',3,4,)

結果

themeleaf src取動態參數_themeleaf src取動態參數_03

正確用法

def func(a,b,c,*args):
    print(a)
    print(b)
    print(c)
    print(args,type(args))
func(1,2,'alex')

 結果

themeleaf src取動態參數_themeleaf src取動態參數_04

位置參數,*args,默認參數,**kwargs

def func(a,b,c,sex = '男',*args):
    print(a)
    print(b)
    print(c)
    print(sex)
    print(args,type(args))
func(1,2,'alex','wusir','ritian '

結果

sex='男’被wusir覆蓋 

themeleaf src取動態參數_命名空間_05

def func(a,b,c,*args,sex = '男'):
    print(a)
    print(b)
    print(c)
    print(sex)
    print(args,type(args))
func(1,2,'alex','wusir','ritian ',sex='女')

結果

themeleaf src取動態參數_作用域_06

**kwargs的用法

def func(**kwargs):
    print(kwargs)
func(a = 1,b = 4,c = 3,d = 2)

 結果

 

themeleaf src取動態參數_themeleaf src取動態參數_07

def func(a,b,c,*args,sex = '男',**kwargs):
    print(a)
    print(b)
    print(c)
    print(sex)
    print(args,type(args))
    print(kwargs)
func(1,2,'alex','wusir','ritian ',sex = '女',name = 'taibai',age = 21)

結果 

themeleaf src取動態參數_名稱空間_08

*args,**kwargs萬能參數

def func2(*args,**kwargs):
    #萬能參數
    print(args)
    print(kwargs)
func2(1,2,3,5,name='alex',age=56)

 

結果

themeleaf src取動態參數_作用域_09

 

 

 *rags加法計算器

def my_sum(*args):
    count = 0
    for i in args:
        count += i
    return count
print(my_sum(1,2,3,6,78))
print(sum([1,2,3]))

 

結果

themeleaf src取動態參數_作用域_10


*魔法運算:打散

def func2(*args,**kwargs):
    print(args)
    #(1,2,3)
l1 = [1,2,3,]
l2 = [1,2,3,2,3,100,2]
func2(*l2,*l1)


結果

themeleaf src取動態參數_命名空間_11

 

 

 

def func3(*args,**kwargs):
    print(args)
    print(kwargs)
dic = {'name':'alex','age':12}
dic2 = {'name':'jin','age':22}
func3(**{'name1':'alex','age1':12},**{'name2':'jin','age2':22},name3 = 'wusir')


結果 

themeleaf src取動態參數_名稱空間_12

 

 

def func3(*args,**kwargs):
    print(args)
    print(kwargs)
dic = {'name':'alex','age':12}
dic2 = {'name':'jin','age':22}
func3(**{'name1':'alex','age1':12},**{'name2':'jin','age2':22},name3 = 'wusir')


 結果

themeleaf src取動態參數_themeleaf src取動態參數_13

 

 二、名稱空間

名稱空間:

等執行到函數調用的時候,Python解釋器會再開闢一塊內存來儲存這個函數裏面的內容,這個時候,才關注函數裏面有哪些變量,而函數中的變量回儲存在新開闢出來的內存中,函數中的變量只能在函數內部使用,並且會隨着函數執行完畢,這塊內存中的所有內容也會被清空。我們給這個‘存放名字與值的關係’的空間起了一個名字-------命名空間。

全局名稱空間:代碼在運行伊始,創建的存儲“變量名與值的關係”的空間叫做

局部名稱空間:在函數的運行中開闢的臨時的空間
內置名稱空間:內置命名空間中存放了python解釋器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法。
name = 1
def func():
    n = 2
    print(666)
print(n)

 

結果:因為n不在全局名稱空間,所以找不到。

themeleaf src取動態參數_名稱空間_14

 

加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)

取值順序:

  在局部調用:局部命名空間->全局命名空間->內置命名空間

  在全局調用:全局命名空間->內置命名空間

綜上所述,在找尋變量時,從小範圍,一層一層到大範圍去找尋。

 

加載順序:
內置名稱空間 ---> 全局名稱空間 ----> 局部名稱空間(執行函數時)
取值順序:
先從局部名稱空間找----> 全局名稱空間找----->內置名稱空間找

 

name = 'wusir'
def func():
    name = 'alex'
    print(name)
func()

 

結果:

 

themeleaf src取動態參數_命名空間_15

 

def len(x):
    return x

print(len([1,2,3]))

 

結果

themeleaf src取動態參數_命名空間_16

 

作用域的角度:
全局作用域  全局名稱空間,內置名稱空間
局部作用域  局部名稱空間,


'wusir'
def func():
    name = 'alex'
    # print(name)
    print(globals())
    print(locals())
func()

print(globals())
print(locals())


 

 結果

themeleaf src取動態參數_命名空間_17

 

 


三 函數的嵌套 


#局部找全局的函數名可以找到
def fun1():
    print(111)
def fun2():
    print(222)
    fun1()
fun2()
print(111)

 

 結果:

 

themeleaf src取動態參數_作用域_18


def fun2():
    print(222)
    def fun3():
        print(666)
    print(444)
    fun3()
    print(888)
print(333)
fun2()
print(555)

結果 

themeleaf src取動態參數_themeleaf src取動態參數_19

四 global(翻譯:全球)全局變量與nonlocal(翻譯:外地)

作用域

作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。

全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效

局部作用域:局部名稱空間,只能在局部範圍生效

globals和locals方法

在全局調用

print(globals())
print(locals())

 

在局部調用

themeleaf src取動態參數_名稱空間_20

def func():
    a = 12
    b = 20
    print(locals())
    print(globals())

func()

 

global關鍵字,nonlocal關鍵字。

global:

  1,聲明一個全局變量。

  2,在局部作用域想要對全局作用域的全局變量進行修改時,需要用到 global(限於字符串,數字)。

 ps:對可變數據類型(list,dict,set)可以直接引用不用通過global。


themeleaf src取動態參數_作用域_21

def func():
    global a
    a = 3
func()
print(a)


count = 1
def search():
    global count
    count = 2
search()
print(count)

themeleaf src取動態參數_名稱空間_22

 

 

themeleaf src取動態參數_作用域_23

global 1,聲明一個全局變量
        #引用全局變量,並改變
def func():
    global a
    a = 2
    print(a)
func()
print(a)

themeleaf src取動態參數_命名空間_24

 

結果: 

themeleaf src取動態參數_名稱空間_25

 

l1 = [1,2,3]
def func():
    l1.append(444)
func()
print(l1)

 結果

themeleaf src取動態參數_themeleaf src取動態參數_26

 

nonlocal:

 

  1,不能修改全局變量。

 

  2,在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進行引用和修改,並且引用的哪層,從那層及以下此變量全部發生改變。

 nonlocal的用法:

themeleaf src取動態參數_作用域_27

a = 1
def func():
    nonlocal a
    a = 2
    print(a)
func()

themeleaf src取動態參數_themeleaf src取動態參數_28

  

結果:報錯

themeleaf src取動態參數_themeleaf src取動態參數_29

 

themeleaf src取動態參數_命名空間_30

父級函數
def func():
    name = 'wusir'
    def inner():
        nonlocal name
        name = 'taibai'
        print(name)
    print(name)
    inner()
    print(name)
func()

themeleaf src取動態參數_作用域_31

 

結果:

themeleaf src取動態參數_命名空間_32

 

themeleaf src取動態參數_作用域_33

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)
add_b()
10 30 30 42

themeleaf src取動態參數_命名空間_34

 

 結果:

themeleaf src取動態參數_作用域_35