一. 函数参数--动态传参
def chi(quality_food, junk_food): print("我要吃", quality_food, junk_food) chi("大米饭", "小米饭") # "大米饭"传递给quality_food "小米饭"传递给junk_food 按照位置传
def chi(*food): print("我要吃", food) chi("大米饭", "小米饭") 结果: 我要吃 ('大米饭', '小米饭') # 多个参数传递进去. 收到的内容是元组tuple
注意:动态接收实参的时候, 动态形参必须在位置形参后面!
否则传递进去的所有位置实参都被动态形参接收,后面的位置形参则就收不到参数.
def chi(a, b, c='馒头', *food): print(a, b, c, food) chi("香蕉", "菠萝") # 香蕉 菠萝 馒头 (). 默认值生效 chi("香蕉", "菠萝", "葫芦娃") # 香蕉 菠萝 葫芦娃 () 默认值不生效 chi("香蕉", "菠萝", "葫芦娃", "口罩") # 香蕉 菠萝 葫芦娃 ('口罩',) 默认值不生效
def chi(a, b, *food, c="娃哈哈"): print(a, b, food, c) chi("香蕉", "菠萝") # 香蕉 菠萝 () 娃哈哈 默认值生效 chi("香蕉", "菠萝", "葫芦娃") # 香蕉 菠萝 ('葫芦娃',) 娃哈哈 默认值生效 chi("香蕉", "菠萝", "葫芦娃", "口罩") # 香蕉 菠萝 ('葫芦娃', '口罩') 娃哈哈 默认值生效
那么你的默认值是永远都生效的.
注意:顺序:位置参数, 动态参数*, 默认值参数.
在python中可以动态的位置参数, 但是 * 这种情况只能接收位置参数无法接收关键字参数.
def func(a, b, c, d): print(a, b, c, d) # 关键字参数必须在位置参数后面, 否则参数会混乱 func(1, 2, c=3, 4)
所以关键字参数必须在位置参数后面. 由于实参是这个顺序. 所以形参接收的时候
也是这个顺序.也就是说位置参数必须在关键字参数前面.动态接收关键字参数也要在后面
在形参的位置上的 * 表示把接收到的参数组合成一个元组
def fun(**kwargs): print(kwargs) dic = {'a':1, 'b':2} fun(**dic)
时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部
2. 我们给存放名字和值的关系的空间起一个名字叫: 命名空间.
1> 命名空间分类:
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int
1. 内置命名空间
2.全局命名空间
3.局部命名空间(函数被执行的时候)
3> 取值顺序
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间
a = 10 def func(): a = 20 print(a) func() # 20
全局作用域: 包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用
2> 我们可以通过globals()函数来查看全局作用域中的内容, 也可以通过locals()
三. 函数的嵌套
1. 只要遇见了() 就是函数的调用. 如果没有 () 就不是函数的调用
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)
a = 1 def fun_1(): a = 2 def fun_2(): nonlocal a a = 3 def fun_3(): a = 4 print(a) print(a) fun_3() print(a) print(a) fun_2() print(a) print(a) fun_1() print(a)
*这样的程序如果能分析明白. 那么作用域, global, nonlocal就没问题了.