一、动态传参
动态传参用到 *args 和 **kwargs ,*号表示接收位置参数,args是参数名;**表示接收关键字参数,kwargs是参数名
def chi(*food):
print(food) #('胡辣汤', '油条', "豆浆")
print(*food) #'胡辣汤', '油条', "豆浆
chi("胡辣汤","油条","豆浆") def chi(**food):
print(food) chi(food1="胡辣汤",food2 = "油条",food3="豆浆")
#结果 {'food1': '胡辣汤', 'food2': '油条', 'food3': '豆浆'}
参数顺序: 位置参数,*args, 默认值参数,**kwargs
无敌传参:可以接收任何参数
#无敌传参示例
def func(*args, **kwargs): #可以是任何参数
pass func("位置参数",kw ="关键字参数")
注意:*号在形参位置表示聚合,在实参位置表示打散 ,字典打散用两个**
def func(*args): #形参位置 聚合
print(args)
lst = [1,2,3]
t = (22,33)
func(*lst,*t) #实参位置 将列表和元组打散了
#结果 (1, 2, 3, 22, 33) def fun(**kwargs): #形参位置,聚合
print(kwargs) dic1 = {"name":"alex","gender":"男"}
dic2 = {"age":""}
fun(**dic1,**dic2) #实参位置, 字典打散
# 结果 {'name': 'alex', 'gender': '男', 'age': '1000'} dic1 = {"name":"alex","age":""}
dic2 = {"age":""}
fun(**dic1,**dic2) #这是会报错,因为两个字典中有重复的key,一个key对应多个值
二、命名空间和作用域
在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来,
我们给存放名字和值的关系的空间起了个名字叫:命名空间。我们的变量在存储的时候就 是存储在这片空间中的。
分为内置命名空间、全局命名空间、局部命名空间
内置空间存储python解释器内置的东西,全局空间放py文件中函数外声明的变量,局部空间放函数内声明的变量
顺序:
文件加载时
先加载内置空间,再全局,最后局部(函数调用时才用到)
在取值的时
先从局部空间找,然后是全局空间,最后是内置空间
作用域
作用域就是作用范围, 按照生效范围来看分为 全局作用域和局部作用域
全局作用域: 内置空间+全局空间的变量
局部作用域:局部空间的变量
查看作用域:
globals() 查看全局作用域中的变量名字
locals() 查看当前作用域中的变量名字 (可以用在全局也可以用在局部)
三、函数的嵌套
1. 注意函数的执行顺序
2. 只要遇到了()就是函数的调用. 如果没有()就不是函数的调用
四、golbal和nonlocal关键字
golbal关键字 表示引入全局变量 arg,如果全局变量中没有arg就在局部声明这个变量为全局变量
nonlocal关键字 表示在局部 引入上一层空间的变量,如果上一层没有继续找上一层,都没有时报错。
a = 100
def func():
print(a) # 取值时可以取全局变量,逐层往上找
func() def func():
a = 28 # 想要修改时会报错,局部空间不能直接修改全局变量
print(a)
func()
--------------
a = 100
def func():
global a # 加了个global表示不在局部创建这个变量了. 而是直接使用全局的a
print(a) #
a = 28 #这时就能在局部空间修改全局变量了
print(a) #
func()
print(a) #
golbal
a = 10
def func1():
a = 20
def func2():
nonlocal a #找上一层的a a = 20
a = 30 #将a =20 修改为 a =30
print(a) #
func2()
print(a) #
func1()
nonlocal