一. 动态传参
形参:
1. 位置参数
2. 默认值
3. 动态传参
1 *args: 动态接受位置参数
2 **kwargs: 动态接收关键字参数
顺序: 位置,*args, 默认值,**kwargs
*,**:
def func(*args,**kwargs): 无敌传参
pass
*,** 在形参位置: 聚合
在实参位置: 打散
实参:
1. 位置参数
2. 关键字参数
3. 混合参数
1 # def fun(a,b): #位置参数 2 # print(a,b) 3 # fun(1,2) 4 5 # def fun(a,b): #关键字参数 6 # print(a,b) 7 # fun(b=2,a=2) 8 9 # def fun(a,b,c):#混合参数 10 # print(a,b,c) 11 # fun(1,c=3,b=2) 12 13 # def chi(*args): 14 # print(args) 15 # # chi(args = 123) X X X 16 # chi() 17 # chi('10','11','12','13') 18 # 19 # def func(*args): 20 # print(args) 21 # func('111111111111111') 22 23 # def func(**kwargs): 24 # print(kwargs) 25 # func(a = 1,b = 2) 26 27 # def func(**kwargs): 28 # print(kwargs) 29 # func(abc= 123,hui = 6) 30 31 32 # def func(*args,**kwargs): 33 # print(args,kwargs) 34 # func('a','b',a = 1,b = 2) 35 # ------------------------------------------------- 36 37 # 动态传参 38 # *表示动态传参,可以接受所有的位置参数 39 # 传参的时候自动的把实参打包成元组 交给形参 40 41 # def chi(*args): 42 # print(args) 43 # chi() 44 # # chi(good_food = '胡辣汤') #关键字参数 # 一个星'*'不能穿关键字参数 45 # chi(1,2,3,4,5,6,7,8,9,0)#接受所有的位置参数 46 # ------------------------------------------------------------ 47 # ** 表示接收关键字的动态传参 48 #接收到的内容放在字典里 49 # def chi(**food): 50 # print(food) 51 # chi(good_food = '哈哈',junk_food='呵呵',drink = '吼吼') 52 # 顺序 位置>*args>默认值参数>**kwargs 53 # -------------------------- 54 # lst = [1,2,3,4,5,6,7,8,9] 55 # def chi(*food): 56 # print(food) 57 # chi(*lst)#把一个列表或者元组或者字符串.打散成参数. 传递给形参 58 59 60 # dic={'a':1,'b':2,'c':3} 61 # def da(**kwargs):#动/态传参,接收关键字参数 62 # print(kwargs) 63 # da(张无忌= dic['a']) 64 # da(**dic)#把字典打算成关键字参数 65 66 #*,**:在参数:聚合, 实参:打散
二. 名称空间和作用域
名称空间: 保存名字用的
变量,函数,类
1. 内置名称空间:python自己,print,input,len
2. 全局名称空间: 你写的代码从上到下
3. 全局名称空间: 函数,类,方法,其他模块,对象
作用域
全局作用域
内置+全局
局部作用域
局部名称空间
从局部找全局可以,但是从全局找局部是不可以的
globals() 查看全局作用域中的名字
locals() 查看当前作用域中的名字
1 #在我们程序运行的时候, 首先 加载的并不是我们的代码 2 # 先加载的是内置的一些东西 3 4 #先加载print等其他 5 # a = 10 6 # def chi(): 7 # a = 20 8 # print(a) 9 # print(a) 10 # chi() 11 # print(a) 12 13 # def chi(): 14 # p = 30 15 # print(locals())#{'p': 30} locals()可以查看当前局部作用域中的内容 16 # print(p) 17 # chi() 18 # print(locals())#查看当前作用域中的名字 19 # print(globals()) 20 # a = 10 #全局/ 21 # b = 20 22 # print(globals())#查看全局作用域中(内置+全局)的内容
三. 函数的嵌套(难点)
每一层都会产生独自的名称空间
1 # 一个套一个 2 # def outer(): 3 # print('我是outer') 4 # #在函数内部声明的函数,只能在函数内部访问 5 # def inner(): 6 # print('我是inner') 7 # inner() 8 # print('我是outer_end') 9 # outer() 10 11 # def fun2(): 12 # print(222) 13 # def fun3(): 14 # print(666) 15 # print(444) 16 # fun3() 17 # print(888) 18 # print(333) 19 # fun2() 20 # print(555)
四.nonlocal global
global: 在局部引入全局的内容, 可以生化一个变量为全局变量
noblocal: 在局部, 引入上一层名称空间中的变量,如果没有,继续上一层.......上...上一层,没有报错
1 # a = 10 2 # def func(): 3 # a = 20#并没有改变全局变量,创建了一个自己的变量 4 # #全局变量在局部,可以用,但是,不能改 5 # a = a+10 6 # print(a) 7 # func() 8 # print(a) 9 10 # a = 10 11 # def func(): 12 # global a #从全局把变量引进来 13 # a = a+10 14 # print(a) 15 # func() 16 # print(a) 17 18 # def func(): 19 # global a #可以创建(升华)一个局部变量为全局变量 20 # a = 30 21 # func() 22 # print(a) 23 24 # nonlocal 在局部, 引入上一层名称空间中的名字. 如果上一层没有, 继续上一层 ..... 25 # def outer(): 26 # a = 10 27 # def inner(): 28 # nonlocal a 29 # a = 20 30 # print(a) 31 # print(a) # 10 32 # inner() # 20 33 # print(a) # 20 34 # outer() 35 36 # *** 37 a = 1 38 def fun_1(): 39 a = 2 40 def fun_2(): 41 nonlocal a 42 a = 3 43 def fun_3(): 44 a = 4 45 print(a) 46 print(a) 47 fun_3() 48 print(a) 49 print(a) 50 fun_2() 51 print(a) 52 print(a) 53 fun_1() 54 print(a) 55 # 1234331
补充:
一.形参的接收顺序
1 位置>*args>默认参数>**kwargs
二.
命名空间:我们的变量在储存的时候就是储存在这片空间中
全局命名空间: 我们直接在py文件中,函数外声明的变量都属于全局命名空间
局部命名空间: 在函数中声明的变量会放在局部命名空间
内置命名空间: 存放python解释器为我们提供的名字,list,tuple,str,int这些都是内置命名空间
三.
全局作用域: 全局命名空间 + 内置命名空间
局部作用域: 局部命名空间
四.名称空间的加载顺序,取值顺序
加载顺序:1内置命名空间 2全局命名空间 3局部命名空间(函数被执行的时候)
取值顺序: 1局部命名空间 2全局命名空间 3内置命名空间
五:
global表示不再使用局部作用域的内容了,而改用全局作用域中的变量
nonlocal表示在局部作用域中,调用父级命名空间中的变量