1. 函数参数--动态传参
之前我们说过了传参, 如果我们需要给一个函数传参, 而参数又是不确定的. 或者我给一个 函数传很多参数, 我的形参就要写很多, 很麻烦, 怎么办呢. 我们可以考虑使用动态参数.
形参的第三种: 动态参数
动态参数分成两种:
1. 动态接收位置参数
def chi(*food): #在形参这里把传过来的参数进行聚合,聚合成元组 print(food) chi("小白菜") chi("小白菜","咸鸭蛋") chi("爆米花","咸鸭蛋","辣白菜") chi("小米粥","花生米","咸鸭蛋","辣白菜")
2. 动态接收关键字参数
def func(**kwargs): # ** 聚合返回字典 print(kwargs) func(1, 2, 3, "呵呵") # 报错 TypeError: func() takes 0 positional arguments but 4 were given func(a = 1, b = 2, c = 3,haha = "呵呵")
最终顺序(*):
位置参数 > *args > 默认值参数 > **kwargs
无敌传参
def func(*args, **kwargs): #arguments参数 keyword-arguments关键字参数 pass
2. 作用域和名称空间
名称空间
用来存放名字(变量, 函数名, 类名, 引入的模块名)的
def fun(): a = 10 print(a) fun() print(a) # a不存在了已经..
1. 全局命名空间--> 我们直接在py⽂文件中, 函数外声明的变量量都属于全局命名空间
2. 局部命名空间--> 在函数中声明的变量量会放在局部命名空间
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内 置命名空间
名称空间可能会有无数个, 局部名称空间而言. 相对是独立的.一般互不干扰
a = 10 def func(): a = 20 print(a) func() #20
3.作用域:
1. 全局作用域: 内置+全局
2. 局部作用域: 局部
globals() 查看全局作用域
locals() 查看当前作用域
def chi(): a = 20 b = 30 print(locals()) # 打印局部作用域中的内容 print(globals()) # 打印全局作用域中的内容 chi()
4.函数的嵌套
在函数中声明函数
在内部函数中使用变量的时候, 查找顺序: 先找自己 -> 上一层 -> 上一层..全局 -> 内置
只要遇见了()就是函数的调用. 如果没有()就不是函数的调用
def fun2(): print(222) def fun3(): print(666) print(444) fun3() print(888) print(33) fun2() print(555)
nonlocal和global关键字(重点)
global: 在局部引入全局变量
nonlocal: 在局部...内层函数引入外层离他最近的那个变量.
a = 100 def func(): global a # 加了了个global表示不不再局部创建这个变量量了了. ⽽而是直接使⽤用全局的a a = 28 print(a) func() print(a)
global表示. 不再使⽤局部作用域中的内容了. 而改用全局作用域中的变量
nonlocal 表⽰示在局部作⽤用域中, 调⽤用父级命名空间中的变量.
a = 10 def func1(): a = 20 def func2(): nonlocal a a = 30 print(a) #30 func2() print(a)#30 func1()