在定義函式時,*後定義的引數,如下所示,稱之為命名關鍵字引數
命名關鍵字實參必須按照key=value的形式為其傳值
def func(x,y,*,a,b): # 其中,a和b稱之為命名關鍵字引數
print(x,y)
print(a,b)
func(1,2,b=222,a=111)
示例def func(x,y,*,a=11111,b):
print(x,y)
print(a,b)
func(1,2,b=22222)
位置新參,預設形參,*args,命名關鍵字形參,**kwargs
def func(x,y=111,*args,z,**kwargs):
print(x)
print(y)
print(args)
print(z)
print(kwargs)
def func(x,y,z,a,b,c):
print(x)
print(y)
print(z)
print(a)
print(b)
print(c)
func(111,y=222,*[333,444],**)
# 111,y=222,333,444,b=555,c=666,位置不對應
func(111,*[333,444],a=222,**)
# 111,333,444,a=222,b=555,c=666
func(111,*[333,444],**,a=222,)
# 111,3333,4444,b=555,c=666,a=222
命名空間是對棧區的劃分,存放名字的地方.有了命名空間之後,就可以在棧區中存放相同的名字
存放的名字:
存放的python直譯器內建的名字
存活週期:
python直譯器啟動則產生,python直譯器關閉則銷毀
>>> print
in function print>
>>> input
in function input>
存放的名字:
只要不是函式內定義、也不是內建的,剩下的都是全域性命名空間的名字
存活週期:
python檔案執行則產生,python檔案執行完畢後銷毀
import os
x=10
if 13 > 3:
y=20
if 3 == 3:
z=30
# func=函式的記憶體位址
def func():
pass
class foo:
pass
存放的名字:
在呼叫函式時,執行函式體**過程中產生的函式內的名字
存活週期:
在呼叫函式時存活,函式呼叫完畢後則銷毀
def func(a,b):
pass
func(10,1)
func(11,12)
func(13,14)
func(15,16)#分別建立不同的區域性命名空間
內建命名空間》全域性命名空間》區域性命名空間
區域性命名空間》全域性名空間》內建命名空間
當前所在的位置向上一層一層查詢
如果當前在區域性命名空間:
區域性命名空間—>全域性命名空間->內建命名空間
input=333
def func():
# input=444
print(input)
func()
如果當前在全域性命名空間
全域性命名空間->內建命名空間
input=333
def func():
input=444
func()
print(input)
示範1:
def func():
print(x)
x=111
func()
示範2:命名空間的"巢狀"關係是以函式定義階段為準,與呼叫位置無關
x=1def func():
print(x)
def foo():
x=222
func()
foo()
示範3:函式巢狀定義
input=111
def f1():
def f2():
# input=333
print(input)
input=222
f2()
f1()
示範4:
x=111
def func():
print(x) #
x=222
func()
內建命名空間、全域性命名空間
特點:
x=111
def foo():
print(x,id(x))
def bar():
print(x,id(x))
foo()
bar()
print(x,id(x))
區域性命名空間的名字
特點:
def foo(x):
def f1():
def f2():
print(x)
# legb
# builtin
# global
def f1():
# enclosing
def f2():
# enclosing
def f3():
# local
pass
#示範1:
x=111
def func():
global x # 宣告x這個名字是全域性的名字,不要再造新的名字了
x=222
func()
print(x)
#示範2:對於不可變型別,不需要再次定義
l=[111,222]
def func():
func()
print(l)
x=0
def f1():
x=11
def f2():
nonlocal x
x=22
f2()
print('f1內的x:',x)
f1()
Python中關鍵字引數和命名關鍵字引數的區別
python中函式的引數有位置引數 預設引數 可變引數 命名關鍵字引數和關鍵字引數,這個順序也是定義函式時的必須順序。本文主要是講講命名關鍵字引數和關鍵字引數的區別 可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為乙個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數...
命名關鍵字引數
如果要限制關鍵字引數的名字,就可以用命名關鍵字引數,例如,只接收city和job作為關鍵字引數。這種方式定義的函式如下 def person name,age,city,job print name,age,city,job 和關鍵字引數 kw不同,命名關鍵字引數需要乙個特殊分隔符 後面的引數被視為...
預解釋 作用域和this關鍵字
在js 執行之前,首先會在當前作用域下將所有帶var和function關鍵字的進行提前宣告 declare 或者定義 defined 引用資料型別開闢的空間 作用域 叫做堆記憶體 預解釋的7步驟 注意 在私有作用域下,預解釋的變數和定義的形參變數都是私有變數,在函式體中,我們遇到乙個變數首先看一下是...