python--动态传参,作用域,函数嵌套
一 . 动态传参(重点) * , **
* 与 **
* 在形参位置. * 表示不定参数, 接收的是位置参数 接收到的位置参数的动态传参: 都是元组 def eat(*food): # 在形参这里把传递过来的实参进行了聚合,聚合成了元组 print(food) eat("小米粥") eat("小米粥", "咸鸭蛋") eat("小米粥", "爆米花", "咸鸭蛋", "蒜茄子")
**在形参表示动态传参-关键字参数 关键字动态传参接收到的是字典 def func(**kwargs): # 也是聚合. ** 聚合成字典 print(kwargs) func(a=1, b=2, c=3, haha="呵呵", good="not bad")
无敌传参
# 无敌传参 def func(*args, **kwargs): # 参数没有限制. 随便传递 print(args) print(kwargs) func(1,2,3,4, a=3,b=5)
聚合与打散
def chi(*food): # 这里是形参 聚合 print(food) lst = ["胡萝卜", "大白菜", "大萝卜", "草", "果冻"] # 这里要输入列表或元组 chi(*lst) # 这里的*是打散 形成元组 def chi(**food): # 聚合, 聚合成字典 print(food) dic = {"主食":'面条', "副食":"土豆泥", "汤":"疙瘩汤"} # 这里要输入字典 chi(**dic, 甜点="冰激凌") # 打散. 打散成关键字, 甜点 = '冰激凌' 可加可不加 # * 与 ** 放在形参是聚合, 放在实参是打散
传参顺序
位置参数, *args, 默认值, **kwargs
二 . 作用域与名称空间
名称空间顾名思义就是装名称的,比如我定义一个a = 10,那么这个a 所在的空间就是名称空间 作用域可以理解为起作用的区域,全局作用域就是在全局都起作用的,是内置+全局名称空间, print , input 就是内置,局部作用域就是在局部起作用的区域. globals() 查看全局作用域 locals() 查看当前作用域
三 . 函数的嵌套
函数的嵌套: 在函数中声明函数
函在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置
def outer(): def inner(): print("我的天哪") print("还可以这样写???") inner() outer()
四 . nonlocal 和 global关键字
global: 在局部引入全局变量
nonlocal: 在局部..内层函数引入外层理他最近的那个变量
# 全局变量一般是不能随意的修改的 a = 10 def func(): # 慎用. global a # global 表示从全局把一个变量引入到局部, 后面使用的a都是全局变量 a += 10 # ?? a = a + 10 # 现在的a是全局的, 你现在试图改全局变量 print("里面的打印",a) func() print("外面的打印", a) # nonlocal 在局部, 寻找离他最近的外层的一个变量 a = 50 def func1(): # a = 10 # 局部 def func2(): nonlocal a # 不找全局, global找全局 a += 10 # a = a + 10 python不让这么干 print("func2", a) func2() print(a) func1() print(a)