今天是2018年12月7日,第一次正式写或者说总结一天的学习!之前的学习内容会后续补充。今天主要学习了python中的函数动态传参,命名空间和函数嵌套调用!
1、函数的动态传参(*,**)
之前学到,参数分为形参和实参,实参分为位置参数、关键字参数、混合参数;形参与之对应是位置参数、默认参数,其中今天要介绍的就是形参总的动态传参,与他对应的是实参中的混合参数。
(1)def fruit(*args)
print(args)
print(*args)
func(“香蕉”,“苹果”,“大鸭梨”)
这里*args属于形参,主要针对传输多个位置实参;args只是个变量名,可以自己定义;“*”在函数传参作用是将多个位置实参进行聚合,聚合成元组,从打印结果中可以看出args是一个(,)形式,但再打印*args,“*”在函数内部,还具有将元组打散。
(2)def fruit(**kwargs)
print(kwargs)
print(*kwargs)
dic={"a":"香蕉","b":"苹果","c":"大鸭梨"}
func(**dic)
func(a=“香蕉”,b=“苹果”,c=“大鸭梨”)
这里**args属于形参,主要针对传输多个关键字实参;kwargs只是个变量名,可以自己定义;“**”在函数传参作用是将多个关键字实参进行聚合,聚合成字典,从打印结果中可以看出kwargs是一个{key1:value1,key1:value1....}形式,但再打印*args,“*”在函数内部,还具有将字典打散,得到key值,“**”是将字典打散。
总结:(1)“*”把列表、元组、字符串打散成位置参数进行传参;在形参位置,则是聚合成元组,并存储在变量名中;
(2)“**”把字典打散成关键字参数进行实参传输;在形参位置,将关键字参数聚合成字典,存储在变量名中;
(3)对于字典,一个“*”,打散得到的是key值。
(4)args——arguments(参数);kwargs——keywordarguments(关键字参数)
(5)此函数格式为“无敌函数”,无敌传参!其中def func(*args,**kwargs)
pass
func(.....)
(6)形参顺序——(位置参数,*args,默认值,**kwargs),这些可以四个可以任意组合,但顺序不能错!!!
2、命名空间
(1)定义:给存放名字和值的关系的空间
(2)命名空间分类:
1. 全局命名空间--> 我们直接在py文件中, 函数外声明的变量量都属于全局命名空间
2. 局部命名空间--> 在函数中声明的变量量会放在局部命名空间
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间
注:命名空间可能有很多个,因为局部空间可能有很多个!
(3)加载顺序:内置命名空间——>全局命名空间——>局部命名空间
(4)取值顺序:局部命名空间——>全局命名空间——>内置命名空间
(5)作⽤用域命名空间(用globals()和locals()查看):
1. 全局作⽤用域: 全局命名空间 + 内置命名空间
2. 局部作⽤用域: 局部命名空间
3、函数调用与嵌套
按顺序执行就可以了
4、关键字global和nonlocal
global+变量:局部引进的话,表示从全局把变量引入到局部,后面使用的都是全局变量,能对全局变量进行修改
nonlocal:在局部寻找离他最近的外层的变量,但最外层不能到全局空间。
如果没有global和nonlocal,查找循序自己一层层往外找.......