# def eat(*food): # print(food) # eat('大米饭','小米饭')保存的形式是元组 # def func(**kwargs): # print(kwargs) # func(山刀='面',老家='早饭')#保存形式是字典 #接收任参数 # def func(*args,**kwargs): # print(args,kwargs) # func('马化腾','那云',wtf = '胡辣汤')
1. 函数参数--动态传参
2. 名称空间, 局部名称空间, 全局名称空间, 作⽤用域, 加载顺序.
3. 函数的嵌套
4. gloabal, nonlocal关键字
动态猜数
*args **kwargs
位置关系
位置参数>*args>默认值参数>**kwargs
二 命名空间
在python解释器开始执⾏行行之后, 就会在内存中开辟⼀一个空间, 每当遇到⼀一个变量量的时候, 就
把变量量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内
存, 表⽰示这个函数存在了了, ⾄至于函数内部的变量量和逻辑, 解释器是不关⼼心的. 也就是说⼀一开始
的时候函数只是加载进来, 仅此⽽而已, 只有当函数被调⽤用和访问的时候, 解释器才会根据函数
内部声明的变量量来进⾏行行开辟变量量的内部空间. 随着函数执⾏行行完毕, 这些函数内部变量量占⽤用的空
间也会随着函数执⾏行行完毕⽽而被清空.
def fun():
a = 10
print(a)
fun()
print(a) # a不不存在了了已经..
我们给存放名字和值的关系的空间起⼀一个名字叫: 命名空间. 我们的变量量在存储的时候就
是存储在这片空间中的.
命名空间分类:
1. 全局命名空间--> 我们直接在py⽂文件中, 函数外声明的变量量都属于全局命名空间
2. 局部命名空间--> 在函数中声明的变量量会放在局部命名空间
3. 内置命名空间--> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内
置命名空间
加载顺序:
1. 内置命名空间
2. 全局命名空间
3. 局部命名空间(函数被执⾏行行的时候)
取值顺序:
1. 局部命名空间
2. 全局命名空间
3. 内置命名空间
a = 10
def func():
a = 20
print(a)
func() # 20
作⽤用域: 作⽤用域就是作⽤用范围, 按照⽣生效范围来看分为 全局作⽤用域和局部作⽤用域
全局作⽤用域: 包含内置命名空间和全局命名空间. 在整个⽂文件的任何位置都可以使⽤用(遵循
从上到下逐⾏行行执⾏行行). 局部作⽤用域: 在函数内部可以使⽤用.
作⽤用域命名空间:
1. 全局作⽤用域: 全局命名空间 + 内置命名空间
2. 局部作⽤用域: 局部命名空间
我们可以通过globals()函数来查看全局作⽤用域中的内容, 也可以通过locals()来查看局部作
⽤用域中的变量量和函数信息
a = 10
def func():
a = 40
b = 20
def abc():
print("哈哈")
print(a, b) # 这⾥里里使⽤用的是局部作⽤用域
print(globals()) # 打印全局作⽤用域中的内容
print(locals()) # 打印局部作⽤用域中的内容
func()
函数的嵌套看括号
1. 只要遇⻅见了了()就是函数的调⽤用. 如果没有()就不是函数的调⽤用
2. 函数的执⾏行行顺序
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)
关键字
global 全局变量
nanlocal 局部变量
# a = 100 # def func(): # global a # a = 8 # print(a) # func() # print(a) a = 10 def func1(): a = 20 def fun2(): nonlocal a a = 30 print(a) fun2() print(a) func1()