今天主要的学习内容
1. 函数参数--动态传参
2. 名称空间, 局部名称空间, 全局名称空间, 作?域, 加载顺序.
3. 函数的嵌套
4. gloabal, nonlocal关键字
一 .动态传参 * **
动态传参分为两种:
1 .动态接受位置参数
我自己的理解是将你输入的输入全部赋值给你的变量参数 如:
def func(*content): pass func(1,2,3,4,5,6,7)
就是上面的将1-7全部给content,最后输入的全部放到一个tuple中
注意: 动态接收参数的时候要注意 : 动态参数必须在位置参数后面
def chi(*food, a, b): print("我要吃", food, a, b) chi("大米饭", "小米饭", "黄瓜", "茄子") # 前两个参数用位置参数来接收, 后面的参数用 动态参数接收
上面的代码是错误的, 因为*food 已经接收了所有的数据,a,b永远接收不到信息,系统报错
由此我们得出总结:
顺序 : 位置参数,动态参数* ,默认值参数
2.动态接收关键字参数
在python中我们使用**来接受动态关键字参数
def func(**kwargs): print(kwargs) func(a=1,b=2,c=3) func(a=1,b=3) 结果 : {'a': 1, 'b': 2, 'c': 3} {'a': 1, 'b': 2}
这个时候接收的是一个字典dict
最终我们得到的顺序是:
位置参数 > *args > 默认值参数 > **kwargs
这四种参数可以任意的进行使用
这里如果想要接收所有的参数 ,有一种无敌传参(自己给的名字):
def func (*args ,**kwargs):
print(*args,**kwargs)
func()这里用户输入的所有参数都可以拿到并输出
当* ,**在形参的位置 相当于把输入的东西聚合 ,聚合成元组 ,字典
当* ,**在实参位置的时候,把用户输入的东西按照顺序打散
命名空间
全局命名空间 --->我们直接在py 文件中,函数外声明的变量都属于全局命名空间
局部命名空间 --->在函数声明的变量中会放在局部命名空间
内置命名空间 --->存放在python解释器中为我们提供的名字 ,list ,tuple ,dict ,int ,str 这些都是内置命名空间
加载顺序: 内置命名空间-->全局命名空间 -->局部命名空间
取值顺序: 局部命名空间 -->全局命名空间-->内置命名空间
a=10 def func(): a=20 print(a) func() #结果为20
作用域:作用域就是作用范围 ,按照生效范围来看分为 全局作用域 和局部作用域
全局作用域: 包含了全局命名空间和内置命名空间,在整个文件的任何位置都可以使用(遵循从上到下逐个进行)
局部作用域: 在函数内部可以使用
作用域命名空间:
1. 全局作用域: 全局命名空间+ 内置命名空间 locals() 查看全局作用域内容
2. 局部作用域: 局部命名空间 globals() 查看当前作用域内容
函数的嵌套
1. 只要遇到了()就是函数的调用 ,如果没有()就不是函数的调用
2, 函数的执行顺序
def fun1(): print(111) def fun2(): print(222) fun1() fun2() print(111) # 函数的嵌套 def fun2(): print(222) def fun3(): print(666) print(444) fun3() print(888) print(33) fun2() print(555)
关键字global 和nonlocal
我们写一个代码,首先在全局声明一个变量 ,然后在局部调用这个变量,并改变这个变量的值
a=100 def func(): global a #这里的global 是把外面的a 引入进来 (用的是外面的a),但是要注意,这里将a修改后,外面的a也相应的发生了改变 a=28 print(a) func() print(a)
即 :global表示的不在用局部的内容,改用全局作用域的变量
nonlocal是调用上一级的内容 ,如果找不到,继续往上找,直到找到全局,但是找不到全局
a=10 def func(): a=20 def pp(): nonlcal a #这里的nonlcal就是调用了上一层的a=20 ,而不是a=10 print(a) pp() func()
nonlcal和global都是引入外面的内容 ,也同样是修改了外面的内容