Day-10 函数的进阶

一、动态传参
1、形参:
1.位置参数
2.默认参数
3.动态参数
1. *args:动态接收位置参数
2. **kwargs:动态接收关键字参数
def chi(*food):
    print("我要吃", food)
chi("大米饭", "小米饭")
结果:
我要吃 ('大米饭', '小米饭') # 多个参数传递进去. 收到的内容是元组tuple
            *, **:在形参位置:聚合
在实参位置:打散
def fun(*args):
 print(args)
lst = [1, 4, 7]
fun(lst[0], lst[1], lst[2])
fun(*lst) # 可以使用*把一个列表按顺序打散
s = "臣妾做不到"
fun(*s) # 字符串也可以打散, (可迭代对象)

顺序: 位置,*args,默认值,**kwargs
2、实参:
1.位置参数
2.关键字参数
3.混合参数

二、名称空间和作用域
名称空间:保存名字用的(变量,函数,类)
1.内置名称空间:Python自己,print,input,len
2.全局名称空间:你写的代码从上到下
3.局部名称空间:函数,类,方法,其他模块,对象
加载顺序:内置命名空间, 全局命名空间, 局部命名空间(函数被执行的时候)
取值顺序:局部命名空间, 全局命名空间, 内置命名空间

作用域:
全局作用域
内置 + 全局
局部作用域
局部名称空间
从局部找全局可以,但是从全局找局部是不可以的

globals() 查看全局作用域中的名字
locals() 查看当前作用域中的名字

三、函数的嵌套(难点)
每一层都会产生独自的名称空间
只要遇见了()就是函数的调用,如果没有()就不是函数的调用

四、 nonlocal,global
global:在局部引入全局的内容,可以升华一个变量为全局变量
nonlocal:在局部,引入上一层名称空间中的变量,如果没有,继续上一层.......
原文地址:https://www.cnblogs.com/minusone/p/9879896.html