本节内容:
1.动态参数
2.函数的注释
3.函数名称空间(三个空间)
4.两个作用域、全局变量和局部变量
5.函数的嵌套
函数的参数有:形参、实参、行参、位置参数、关键词参数、默认参数,今天我们来讲讲动态参数!

动态参数(*args)
形参接收顺序: 位置参数---->动态位置参数---->默认参数----->动态默认参数
View Code
关键字的形式传参(**kwargs)

1 def func(a,b,c,*args,x=1,y=1,z=1,**kwargs): 2 print(a,b,c) 3 print(args,kwargs) 4 print(x, y, z) 5 func(1,2,3,4,e=1,f=2,g=3) 6 # 1 2 3 7 # (1,2,3,4,5) 8 # 1 1 1 9 # {'e': 1, 'f': 1, 'g': 1}
那么我们只输入关键字参数,下图会输出什么呢?
最后只输出了(){‘a’:4,‘b’:5}

def func(*args,**kwargs): print(args,kwargs) # args = () kwargs = {'a':4,'b':5} func(a=4,b=5) def func(*args,**kwargs): print(args,kwargs) # args = (1,2,3) kwargs = {} func(1,2,3)
输出:
() {'a': 4, 'b': 5}
(1, 2, 3) {}

def func(*args,**kwargs): print(args,kwargs) # args = () kwargs = {} func(1,2,3,a=4,b=5)
输出:(1, 2, 3) {'a': 4, 'b': 5},args和kwargs都只接受对应自己的实参。
总结:
1.args和 kwargs 是可以更换的,但是程序员约定都用它
用途:在不明确接受参数,数量时使用*args和**kwargs
2.动态位置参数 > 动态关键字参数
形参(接收顺序): 位置 > 动态位置 > 默认参数 > 动态默认参数
实参(接收顺序): 位置 > 关键字参数
3.在实参调用的时候 *将可迭代的对象打散,字典是将键取出
在形参处出现*就是在聚合
4.在实参调用的时候 **将字典打散成 关键字参数(键=值)
在形参处出现**就是将关键字参数聚合成一个字典

2.函数的注释:

def aaa(user,pwd): """ 登录函数 :param user: 用户名 :param pwd: 密码 :return: 校验后的账号和密码 """ print(111) print(aaa.__doc__) 登录函数 :param user: 用户名 :param pwd: 密码 :return: 校验后的账号和密码
3.名称空间
1.内置空间中所有代码 -- 内置空间
2.自己写的py文件 -- 全局空间
3.函数中的代码 -- 局部空间

加载顺序:
'''
1.内置空间
2.全局空间
3.局部空间
'''
# 取值顺序:
'''
1.局部空间
2.全局空间
3.内置空间
4.找不到就报错
'''
4.作用域:
'''
1.全局作用域 内置+全局 = 全局作用域
2.局部作用域 函数内的就是局部作用域
全局变量:定义在函数外部的变量。
局部变量:定义在函数内部的变量,或者代码块内部的变量。
global(指定全局变量):在局部空间只修改全局变量,没有就创建修改。
nonlocal(指定上一级变量):在局部空间内,修改最近的上一层变量,如果没有就继续往上一层查找,

a = 10 def func(): global a # (声明)我要修改a 找到要a a+=1 # 修改 func() print(a)
输出的a是11

def func(): global a #(声明我要修改a,找不到a的时候在全局创建一个 a=0) a = 1 # a = 1 func() print(a)
输出的a是1
重点:5.函数的嵌套:

def func(): print(3) def f(): print(1) print(2) f() func()
函数的嵌套2