一、形参的第三种:动态参数(*args,**kwargs)
#一、形参的第三种:动态参数(*args,**kwargs),当实参传入的参数不止一个时,或者为了以后拓展,要用动态形参来接收更多的数据。 #*args:接收的是所有的位置参数,形成一个元祖。 #**kwargs:接收的是所有的关键字参数,形成一个字典。键:等号左边的变量。 值:等号右边的值 # def func(*args,**kwargs): # print(args) # print(kwargs) # func(1,2,3,4,3,2,1,x = 8,y = 2) #位置关系:在形参中,(位置参数 , *args , 默认参数 , **kwargs) 关键字参数必须在位置参数后面 # def func(a,*args,sex = '男',**kwargs): # print(a) # print(args) # print(sex) # print(kwargs) # func(1,4,5,6,sex = '女',x = 8 , y = 10) #*的魔性用法。 # *+list或dic/tuple,表示打散列表或字典或元祖,形成最小组成单元。 #**表示聚合,把执行函数中*打散的元素聚合起来。 #加法计算器 # def func(*args): # sum = 0 # for i in args: # sum = sum + int(i) # return sum # lis = input('请输入内容:').strip().split('+') # print(lis) # print(func(*lis)) # def func(*args,**kwargs): # print(args) #(1,3,5,3,2,9,9,9,9) # print(kwargs) #{'name': 'liujj','age':100,'cat' : 'xiaolang'} # li = [1,3,5,3,2] # li1 = [9,9,9,9] # dic = {'name': 'liujj','age':100} # dic1 = {'cat' : 'xiaolang'} # func(*li,*li1,**dic,**dic1) #(1,3,5,3,2,9,9,9,9,name = 'liujj',age = 100 ,cat = 'xiaolang') # def func(*args): # sum = 0 # for j in args: # sum = sum + int(j) # return sum # # li = input('请输入:').strip().split('+') # print(func(*li)) # def func3(*args,**kwargs): #*args 接收所有的位置参数。*打散几个它都聚合在一起。**kwargs,接收所有的关键字参数,**打散几个 # print(args) #它就聚合几个成为一个大字典。 # print(kwargs) # # l1 = [1, 2, 3] # msg = 'skskksks' # dic = {'name':'liu','age':33} # dic1 = {'1':'数字'} # func3(*l1,*msg,**dic,**dic1) #**dic,打散的结果为键 = 值 ,成为了实参里的关键字参数,然后传给**kwargs聚合起来。
二、名称空间、作用域
#名称空间,作用域 #名称空间存储的是变量与值的内存地址的关系。 # 打开解释器时,内置名称空间同时被打开,执行程序时,全局名称空间打开,遇到变量和值时,将其对应关系存入。当遇到函数时, #将函数名存到内存中,但是里面的函数体不予理会,当遇见调用函数时,返回找到函数名,开辟一个临时名称空间(局部名称空间), #函数体中,遇到变量和值时将其关系存入局部名称空间内,当函数结束后,局部名称空间关闭。 #加载顺序:内置名称空间-----》全局名称空间-----》局部名称空间 #作用域:全局作用域:内置、全局名称空间。 局部作用域:局部名称空间 #取值顺序:局部-----》全局------》内置。 L E G B 只能往后取,不能从前面找往前取。 # name = 'liujj' # print(name) # def func(): # name = 'jiasp' # print(name) # print(222) # print(333) # func() #'liujj',222,333,'jiasp' # name = 'liujj' # print(name) # def func(): # name = 'jiasp' # print(name) # def func2(): # name = 'xiaolang' # print(name) # func2() # print(222) # print(333) # func() #'liujj',222,333,'jiasp','xiaolang' # name = 'liujj' # print(name) # def func(): # name = 'jiasp' # print(name) # # def func2(): # name = 'xiaolang' # print(name) # func() # func2() # print(222) # print(333) #'liujj','xiaolang','jiasp',222,333
三、global / nonlocal
# #global: 更改全局变量。 将全局变量变成局部变量,将局部变量变成全局变量。 #在局部作用域中声明一个全局变量/ 在局部作用域中更改一个全局变量 #注意:当函数体中改的是列表(可变类型)时,不需要global/nonlocal变量,直接就会修改全局中的列表! # def func(): # global name #name本来是局部变量,但是global以后,变成了全局都可以使用的变量。 # name = 'liujj' # func() # print(name) # name = 'jiasp' # def func(): # global name #将全局变量name改进局部变量中,使其在函数中也可以打印,以下任何时候name都是局部变量里的值。 # print(name) # func() # print(name)
#nonlocal: 更改局部变量。与global用法相同,只不过global改的是全局,nonlocal改的是局部。 # 只改动父级、上一层或更高的非全局作用域函数中的变量。 # 引用哪层,以下的全部变量均被改变。 # def func(): # name = 'liujj' # print(name) # def func2(): # nonlocal name # name = 'jiasp' # print(name) # func2() # print(name) #改的必须是上一层函数体内的,如果此打印顶行则属于全局里(函数外面)的了,没法改。 # func()