函数的动态参数与命名空间 day9
Posted 虫洞小鳗鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的动态参数与命名空间 day9相关的知识,希望对你有一定的参考价值。
一、动态参数(不定长参数)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
结果:
:
以上是关于函数的动态参数与命名空间 day9的主要内容,如果未能解决你的问题,请参考以下文章
python(动态传参命名空间函数嵌套global和nonlocal关键字)