0510Python基礎-動態參數-名稱空間
1、昨日內容回顧
函數:避免重復代碼,增強可讀性。
特點:以功能為導向。
def 函數名():
函數體
函數的返回值:return
1,函數中遇到return結束函數。
2,return將函數內部的值返回給函數的執行者。
return None
return None None
return 單個值
return 多個值 返回的是元組。
函數的參數。
實參:
位置參數。按順序一一對應。
關鍵字參數。可以不按照順序但是也必須一一對應。
混合傳參:關鍵字參數永遠在位置參數後面。
形參:
位置參數:按順序一一對應。
默認參數:默認參數在位置參數的後面。
動態參數。
2、動態參數 *args,**kwargs
用戶傳入到函數中的實參數量不定時,或者是為了以後拓展,此時要用到動態參數*args,**kwargs(萬能參數。)
*args接收的是所有的位置參數;**kwargs接收的是所有的關鍵字參數。
位置參數,*args,默認參數, **kwargs
def func1(*args, **kwargs):
print(args)
print(kwargs)
# func1(1, 2, 3, 4)
# func1(x=4, y=5, z=6)
func1(1, 2, 3, x=4, y=5, z=6)
def func3(a):
pass
func3(11)
位置參數,默認參數
def func2(a, b, sex=‘男‘):
print(a)
print(b)
print(sex)
func2(1, 2, ‘女‘)
# 位置參數,*args,默認參數
def func2(a, b, *args, sex=‘男‘):
print(a)
print(b)
print(args)
print(sex)
func2(1, 2, 5,6,7,8,9,sex=‘女‘)
位置參數,*args,默認參數, **kwargs
def func2(a, b, *args, sex=‘男‘,age=20, **kwargs):
print(a)
print(b)
print(args)
print(sex)
print(age)
print(kwargs)
func2(1, 2, 5, 6, 7, 8, 9, x=6, y=5, name=‘alex‘)
def sum1(*args):
ret = 0
for i in args:
ret += i
return ret
print(sum1(1, 2, 3,))
def func3(*args,**kwargs): # 函數的定義 *用意是聚合。
print(args) # (1,2,3,11,21,32)
print(kwargs)
# *的魔性用法
l1 = [1, 2, 3]
l2 = [11, 21, 32]
s1 = ‘fjskalgf‘
s2 = ‘fjskrrrf‘
tu1 = (1, 2, 3)
tu2 = (11, 22, 33)
func3(*l1, *tu1, *tu2)
func3(1,2,3,1,2,3,11,22,33)
dic ={‘name‘: ‘alex‘}
dic1 ={‘age‘: 1000}
func3(*l1, **dic, **dic1) # func3(name=‘alex‘,age=1000)
在函數的執行時,*的用意是打撒。
def func3(*args,**kwargs):
l = []
for i in args: # ([1, 2, 3], [11, 21, 32])
l.extend(i)
args = tuple(l)
print(args)
print(kwargs)
l1 = [1, 2, 3]
l2 = [11, 21, 32]
func3(l1,l2)
3、名稱空間,作用域,作用域鏈,加載順序等。
當程序運行時,代碼從上至下一次讀取,遇到變量與值,
他會在內存中開辟一個空間,存放變量與值的內存地址的對應關系。
這樣存儲變量與值得對應關系的空間叫做名稱空間(命名空間)。
當解釋器遇到函數時,他會將函數名存儲在內存中,但是對於函數體莫不關心。
當函數執行時,他會通過函數名找到函數體,然後將函數體裏面的變量等對應關系存放在一個臨時開辟的空間中,隨著函數的結束,臨時的空間關閉,
這樣的空間叫做臨時名稱空間。
name = ‘alex‘
age = 1000
def func1():
a = 2
b = 3
func1()
內置名稱空間:
len() print() input() list
list
name
print(666)
名稱空間:
內置名稱空間
全局名稱空間
局部名稱空間
加載順序:內置名稱空間 ---> 全局名稱空間(程序運行時) ---->局部名稱空間(函數執行時)
作用域:
全局作用域:內置名稱空間 全局名稱空間
局部作用域:局部名稱空間
取值順序(單項):局部名稱空間(函數執行時) ---> 全局名稱空間 ---> 內置名稱空間
L local
E eclose
G global
B Built-in
sum = 666
name = ‘老男孩‘
def func1():
# sum = 555
print(sum)
func1()
sum = 666
print(sum)
sum = 666 # global
def func1():
sum = 555 # eclose
print(sum)
def inner():
pass
sum = 111 # local
# print(sum)
inner()
func1()
4、函數的嵌套,判斷一下代碼執行結果
print(111)
def func1():
name = ‘alex‘
print(name)
def inner():
a = 2
print(a)
inner()
print(333)
func1()
print(444)
print(111)
def func1():
name = ‘alex‘
print(name)
def inner():
a = 2
print(a)
print(444)
inner()
print(555)
func1()
111 alex 444 2 555
def func1():
a = 666
print(666)
def func2():
name = ‘taibai‘
print(name)
func1()
print(333)
func2()
print(555)
5、global,nonlocal。
global
def func1():
global name
name = ‘alex‘
func1()
print(name)
name = ‘老男孩‘
def func1():
global name
name = ‘alex‘
func1()
print(name)
在全局名稱空間裏得到局部名稱空間的變量
1,return
2,global
1,在局部作用域中聲明一個全局變量。
2,在局部作用域中,更改一個全局變量。
補充:
對於可變的數據類型,函數中如果對其進行操作,改變全局不用引用global.
l1 = [1, 2, 3]
def func1():
l1.append(666)
func1()
print(l1)
nonlocal
1,不能改變一個全局變量。
在局部作用域中,對父級作用域(或者更外層作用域非全局作用域)的變量進行引用和修改,
並且引用的哪層,從那層及以下此變量全部發生改變。
name = "老男孩"
def func1():
nonlocal name
print(name)
func1()
name = "老男孩"
def func1():
name = ‘alex‘
print(name) # 1, alex
def inner():
nonlocal name
name = ‘老男孩‘
print(name) # 2 老男孩
inner()
print(name) # 3,alex 老男孩
func1()
0510Python基礎-動態參數-名稱空間