一、动态参数:*args **kwargs
形态角度:
最终顺序:位置参数,*args,默认参数,**kwargs
# def func(*args): # print(args) # func(1,2,3,4,5,7,8,9,1,2,3,4,5,6,7,8) #*args 动态参数,万能参数 #args接受的就是实参对应的 所有位置参数,并将其放在元组中。 #形参对应顺序: #位置参数,*args,默认参数 # def func(a,b,c,d,*args,e=‘男‘): # print(a) # print(b) # print(c) # print(d) # print(args) # print(e) # func(1,2,3,4,5,6,7,e=‘女‘) #**kwargs 动态传参,他将所有的关键字参数(无意义的)放到一个字典中。 # def func(a,b,c,**kwargs): # print(kwargs) # func(1,2,r=4,b1=5,c1=6,c=7,) # def func(a,b,c,d,*args,e=‘男‘,**kwargs): # print(a) # print(b) # print(c) # print(d) # print(args) # print(e) # print(kwargs) # func(1,2,3,4,5,6,7,v=3,m=7,h=9,e=‘女‘) # 最终顺序:位置参数,*args,默认参数,**kwargs # def func1(*args,**kwargs): # pass # func1() # * 魔法运用 # def func(*args): # print(args) #(1,2,30,1,2,33.。。。。。) # l1 = [1,2,30] # l2 = [1,2,33,21,45,66] # tu = (1,2,3) # func(1,2,30,1,2,33,21,45,66) # func(*‘qweqrfdsaf‘) # func(*{‘name‘:‘alex‘,"age":12}) # func(*l1,*l2) # def func(*args): # print(args) # func(1,2,3,10,20,80) # def func(**kwargs): # print(kwargs) # # dic1 = {‘name1‘:‘alex‘,‘age1‘:46} # dic2 = {‘name‘:‘老男孩‘,‘age‘:56} # func(**dic1,**dic2) # 在函数的调用执行时, # *可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args。 # **字典,代表打散,将所有键值对放到一个kwargs字典里。 # 在函数定义时, *args,**kwargs代表的是聚合。 # def func(*args,**kwargs): # print(args) # print(kwargs) # # dic1 = {‘name1‘:‘alex‘,‘age1‘:46} # dic2 = {‘name‘:‘老男孩‘,‘age‘:56} # func(*[1,2,3,4],*‘asdfsad‘,**dic1,**dic2) # def func(*args,**kwargs): #args = (1,2,3,4) #kwargs = {‘age‘: 56, ‘name‘: ‘老男孩‘} # print(*args) # print(**kwargs) #(age = 56 ,name = 老男孩) # dic1 = {‘name1‘:‘alex‘,‘age1‘:46} # dic2 = {‘name‘:‘老男孩‘,‘age‘:56} # # func(*[1,2,3,4],*‘asdfsad‘,**dic1,**dic2) # func(**dic2)
二、名称空间(命名空间),临时名称空间,内置名称空间。
执行函数的时候,他会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值得关系。
随之函数的执行完毕,临时空间自动关闭。
全局名称空间,名称空间,命名空间,全局命名空间。
局部命名空间,临时名称空间,临时命名空间,局部名称空间。
内置名称空间,所有的内置函数等存储的空间。
加载顺序:
内置名称空间 ---》全局名称空间--》(函数执行时)局部名称空间。
取值顺序:
函数执行时:局部名称空间--》全局名称空间--》内置名称空间。
# a = 4 # b = 3 # c = [1,2,3,4] # c1 = {‘name‘:‘alex‘} # # def func1(): # name = ‘老男孩‘ # print(name) # func1() #当执行函数的时候,他会在内存中开辟一个临时名称空间,存放函数体内的所有变量与值的关系, # 随着函数的执行完毕,临时空间自动关闭。 #input(),print(),len 内置函数 # name = ‘老男孩‘ # def func1(): # name = ‘taibai‘ # print(name) # func1() # def my_len(argv): # return 666 # print(len([12,3,])) a = 2 print(a) def func1(): age = 11 print(age) func1()
三、全局作用域,局部作用域。
全局作用域:全局名称空间,内置名称空间。
局部作用域:局部名称空间
四、加载顺序与取值顺序,函数的嵌套
# 函数什么时候执行? 函数调用的时候执行。 # 代码从上至下依次执行, 调用函数:函数里面从上至下依次执行。 # print(111) # def func1(): # print(333) # # def func2(): # print(444) # # def func3(): # print(555) # func2() # # func1() # print(222) # 111 333 222 # print(111) # def func1(): # print(333) # func2() # print(666) # # def func2(): # print(444) # # def func3(): # print(555) # # func1() # print(222) # 111 333 444 666 222 # print(111) # def func1(): # print(333) # func2() # print(666) # # def func2(): # print(444) # func3() # # def func3(): # print(555) # # func1() # print(222) # 111 333 444 555 666 222 # a = 2 # b = 3 # def func1(): # c = 5 # d = 6 # print(globals()) # 全局变量放在一个字典中 # return locals() # {‘c‘: 5, ‘d‘: 6} # print(func1()) # print(globals()) # 全局名称空间:所有变量 # print(locals()) # 局部名称空间:所有变量
五、locals(),golbals(),nolocal,golbal
#global # 1,在局部空间内,声明一个全局变量 # def func1(): # global name # name = ‘老男孩‘ # print(name) # func1() # print(name) # 2,在局部空间内改变一个全局变量 # a = 4 # def func1(): # global a # a = 5 # # print(name) # func1() # print(a) #nonlocal # 1,不能修改全局变量。 # a = 4 # def func1(): # nonlocal a # a = 5 # # print(name) # func1() # print(a) #在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改, # 并且引用的哪层,从那层及以下此变量全部发生改变。 # a = 4 # def func1(): # b = 6 # def func2(): # b = 666 # print(b) #666 # func2() # print(b) # 6 # # func1() # b = 4 # def func1(): # global b # b = 6 # def func2(): # nonlocal b # b = 666 # print(b) # # func2() # print(b) # # print(b) # func1()
六、练习题
# 2、写函数,接收n个数字,求这些参数数字的和。(动态传参) ‘‘‘ def func(*args): sum = 0 for i in args: sum += i return sum print(func(2,2,3)) ‘‘‘ # 3、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么? # a=10 # b=20 # def test5(a,b): # print(a,b) # c = test5(b,a) # print(c) ‘‘‘ a = 20 b = 10 c = None ‘‘‘ # 4、读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么? # a=10 # b=20 # def test5(a,b): # a=3 # b=5 # print(a,b) # c = test5(b,a) # print(c) ‘‘‘ a = 3 b = 5 c = None ‘‘‘ # 1,有函数定义如下: # def calc(a,b,c,d=1,e=2): # return (a+b)*(c-d)+e # 请分别写出下列标号代码的输出结果,如果出错请写出Error。 # print(calc(1,2,3,4,5)) # print(calc(1,2)) # print(calc(e=4,c=5,a=2,b=3)) # print(calc(1,2,3)) # print(calc(1,2,3,e=4)) # print(calc(1,2,3,d=5,4)) ‘‘‘ 2 Error 24 8 10 Error ‘‘‘ # 2,下面代码打印的结果分别是_________,________,________. def extendList(val,list=[]): print(val) list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList(‘a‘) print(‘list1=%s‘%list1) print(‘list2=%s‘%list2) print(‘list3=%s‘%list3) ‘‘‘ [10,‘a‘] [123] [10,‘a‘] ‘‘‘