一、動態參數(不定長參數)def func(*args):
形參: 3種 動態參數
args元組,他包含了你所有的位置參數.
*args 動態參數,不定長參數
**kwargs 他包含了關鍵字動態參數
*rarge用法
def func(*args):
print(args,type(args))
func(1,2,'alex',3,4,5,6,8,4,7,2)
結果
*args按位置對應不能放到,其他形參位置前邊
def func(*args,a,b,c):
print(a)
print(b)
print(c)
print(args,type(args))
func(1,2,'alex',3,4,)
結果
正確用法
def func(a,b,c,*args):
print(a)
print(b)
print(c)
print(args,type(args))
func(1,2,'alex')
結果
位置參數,*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覆蓋
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='女')
結果
**kwargs的用法
def func(**kwargs):
print(kwargs)
func(a = 1,b = 4,c = 3,d = 2)
結果
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)
結果
*args,**kwargs萬能參數
def func2(*args,**kwargs):
#萬能參數
print(args)
print(kwargs)
func2(1,2,3,5,name='alex',age=56)
結果
*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]))
結果
*魔法運算:打散
def func2(*args,**kwargs):
print(args)
#(1,2,3)
l1 = [1,2,3,]
l2 = [1,2,3,2,3,100,2]
func2(*l2,*l1)
結果
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')
結果
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')
結果
二、名稱空間
名稱空間:
等執行到函數調用的時候,Python解釋器會再開闢一塊內存來儲存這個函數裏面的內容,這個時候,才關注函數裏面有哪些變量,而函數中的變量回儲存在新開闢出來的內存中,函數中的變量只能在函數內部使用,並且會隨着函數執行完畢,這塊內存中的所有內容也會被清空。我們給這個‘存放名字與值的關係’的空間起了一個名字-------命名空間。
全局名稱空間:代碼在運行伊始,創建的存儲“變量名與值的關係”的空間叫做
局部名稱空間:在函數的運行中開闢的臨時的空間
內置名稱空間:內置命名空間中存放了python解釋器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法。
name = 1
def func():
n = 2
print(666)
print(n)
結果:因為n不在全局名稱空間,所以找不到。
加載順序:內置命名空間(程序運行前加載)->全局命名空間(程序運行中:從上到下加載)->局部命名空間(程序運行中:調用時才加載)
取值順序:
在局部調用:局部命名空間->全局命名空間->內置命名空間
在全局調用:全局命名空間->內置命名空間
綜上所述,在找尋變量時,從小範圍,一層一層到大範圍去找尋。
加載順序:
內置名稱空間 ---> 全局名稱空間 ----> 局部名稱空間(執行函數時)
取值順序:
先從局部名稱空間找----> 全局名稱空間找----->內置名稱空間找
name = 'wusir'
def func():
name = 'alex'
print(name)
func()
結果:
def len(x):
return x
print(len([1,2,3]))
結果
作用域的角度:
全局作用域 全局名稱空間,內置名稱空間
局部作用域 局部名稱空間,
'wusir'
def func():
name = 'alex'
# print(name)
print(globals())
print(locals())
func()
print(globals())
print(locals())
結果
三 函數的嵌套
#局部找全局的函數名可以找到
def fun1():
print(111)
def fun2():
print(222)
fun1()
fun2()
print(111)
結果:
def fun2():
print(222)
def fun3():
print(666)
print(444)
fun3()
print(888)
print(333)
fun2()
print(555)
結果
四 global(翻譯:全球)全局變量與nonlocal(翻譯:外地)
作用域
作用域就是作用範圍,按照生效範圍可以分為全局作用域和局部作用域。
全局作用域:包含內置名稱空間、全局名稱空間,在整個文件的任意位置都能被引用、全局有效
局部作用域:局部名稱空間,只能在局部範圍內生效
globals和locals方法
在全局調用
print(globals())
print(locals())
在局部調用
def func():
a = 12
b = 20
print(locals())
print(globals())
func()
global關鍵字,nonlocal關鍵字。
global:
1,聲明一個全局變量。
2,在局部作用域想要對全局作用域的全局變量進行修改時,需要用到 global(限於字符串,數字)。
ps:對可變數據類型(list,dict,set)可以直接引用不用通過global。
def func():
global a
a = 3
func()
print(a)
count = 1
def search():
global count
count = 2
search()
print(count)
global 1,聲明一個全局變量
#引用全局變量,並改變
def func():
global a
a = 2
print(a)
func()
print(a)
結果:
l1 = [1,2,3]
def func():
l1.append(444)
func()
print(l1)
結果
nonlocal:
1,不能修改全局變量。
2,在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進行引用和修改,並且引用的哪層,從那層及以下此變量全部發生改變。
nonlocal的用法:
a = 1
def func():
nonlocal a
a = 2
print(a)
func()
結果:報錯
父級函數
def func():
name = 'wusir'
def inner():
nonlocal name
name = 'taibai'
print(name)
print(name)
inner()
print(name)
func()
結果:
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
結果:
: