用户传入到函数中的实参数量不定时,或者是为了以后拓展,
此时要用到动态参数*args,**kwargs(万能参数。)
*args(接受的是所有的位置参数)
以元组的形式返回给函数调用者。
**kwargs(接收的是所有的关键字参数)
以字典的形式,返回给函数调用者。
**dict 将字典的键值对添加到kwargs字典中。
*可迭代对象(str,list,tuple,list,dict(key))每一个元素添加到args元组中。
print不能接受**kwargs的关键字参数。
# 在有多种类型的在形参接受数据的时候,位置参数必须在前面,默认参数必须在后面,关键字参数要遵循位置参数 def func2(a,b,*args,sex='男'): print(a) print(b) print(args) print(sex) func2(1,2,'f','g','s',sex='女')
def func2(a,b,*args,sex='男',age=20,**kwargs): print(a) print(b) print(args) print(sex) print(age) print(kwargs) func2(1,2,4,5,6,7,8,x=6,y=5,name='alex')
计算传参计算出数值 def sum1(*args): ret = 0 for i in args: ret += 1 return ret d = sum1(1,2,3,) print(d)
打印出args 和kwargs的格式 def func1(*args,**kwargs): print(args) print(kwargs) func1()
将列表,字典融合一个列表 def func1(*args,**kwargs): print(args) print(kwargs) l1 = [1, 2, 3] l2 = [11, 21, 32] dic = {'name':'alex','age':18} dicc = {'na':'ex','a':18} func1(*l1,*l2,**dic,**dicc)
在函数的执行时,*是用来打散,**也是打散。
def func3(*args,**kwargs): print(args) print(kwargs) l1 = [1, 2, 3] l2 = [11, 21, 32] func3(*l1,*l2)
def func3(*args,**kwargs): print(args) print(kwargs) # l1 = [1, 2, 3] # l2 = [11, 21, 32] l1 = {'name':'dddd','ddff':18} l2 = {'ne':'dd','df':1}
什么是命名空间?
命名空间就是,我们给在内存中存放变量与值得对应关系的空间,叫做命名空间。
命名空间一共分为三种:
1,全局命名空间
代码在运行开始,创建的存储,变量与值得关系,的空间叫做全局命名空间。
2,局部命名空间
在函数的运行中,开辟了临时的空间叫做局部命名空间。临时空间没有特殊的含义下,不能被全局变量引用。
3,内置命名空间
内置命名空间中存放了python解释器为我们提供的函数,例如:input,list,print,tuple......他们都是我们拿过来直接可用的内置函数。
命名空间的加载与取值顺序?
加载python文件时候,内置命名空间(程序运行前加载)——全局命名空间:从上到下加载--——局部命名空间(程序运行中,调用时候才加载)
取值顺序?
在局部调用:局部命名空间——全局命名空间——内置命名空间。
在全局调用:全局命名空间——内置命名空间。
取值顺序(单项):局部名称空间(函数执行时)——全局命名空间——内置命名空间
执行顺序:local——eclose——global——built-in
当程序运行时,代码从上至下一次读取,遇到变量与值,
他会在内存中开辟一个空间,存放变量与值的内存地址的对应关系。
这样存储变量与值得对应关系的空间叫做名称空间(命名空间)。
当解释器遇到函数时,他会将函数名存储在内存中,但是对于函数体莫不关心。
当函数执行时,他会通过函数名找到函数体,然后将函数体里面的变量等对应关系存放在一个
临时开辟的空间中,随着函数的结束,临时的空间关闭,这样的空间叫做临时名称空间。
count = 1
def func1():
print(count)
func1()
局部作用域可以对全局作用域的变量进行引用。
count = 1 # 函数内部如果有变量名与全局变量名相同且对此变量进行改变, # Python 就会将你引用的那个变量视为局部定义的变量,但是局部没定义, # 则他会报错。 # def func1(): # count1 = count + 1 # print(count) # func1() # # def func1(): # count = 3 # def inner(): # count = count + 1 # inner() # print(count) # func1()
作用域 global 和 nonlocal
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间,全局名称空间,在整个文件的任意位置都能被应用,全局有效。
局部作用域:局部名称空间,只能在局部范围内生效。
global
1声明一个全局变量。
2在局部作用域想要对全局作用域的全局变量进行修改时,需要用到golbal(限于字符串,数字)
1,定义一个global,在局部作用域中,声明一个全局变量。 2,在局部作用域中,更改一个全局变量。
3,对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global.
global:
def func1(): global name name = 'alex' func1() name = '老男孩' print(name) 1,定义一个global,在局部作用域中,声明一个全局变量。 2,在局部作用域中,更改一个全局变量。
对于可变的数据类型,函数中如果对其进行操作,改变全局不用引用global.
nolocal:
不能改变一个全局变量。
在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下变量全部发生改变。
def func1(): name = 'alex' print(name) #alex def inner(): nonlocal name name = '老男孩' print(name)#老男孩 inner() print(name) #老男孩 func1()
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()