【一】函数作为参数
1)分类
1.形参
- 函数定义时,括号内声明的值;用来接收外部传来的值
2.实参
- 函数调用时,括号内传入的得值;常是常量,变量,表达式或三者组合
2)位置参数
- 参数数量不对会报错
- 必须按照顺序传入,否则顺序会乱
3)关键字参数
- 需指定定义时的名字,可不按位置传入
4)默认参数
- 函数定义时,就给一个参数赋了值
- 如果给了新值就会覆盖原来的值
5)可变长度参数
函数调用时,实参个数可以不固定
1.可变长位置参数(*args)
def eg(a, b, *args):
print(a, b) # 1 2
print(args) # (3, 4, 5)
eg(1, 2, 3, 4, 5)
2.可变长关键字参数(**kwargs)
def eg(a, b, **kwargs):
print(a, b) # 1 2
print(kwargs) # {'c': 3, 'd': 4}
eg(a=1, b=2, c=3, d=4)
3.*解包
使用 *+可迭代类型 就能将每一个元素单独解包出来
print([1, 2, 3]) # [1, 2, 3]
print(*[1, 2, 3]) # 1 2 3
print(*{'name': 'diva'}) # name
6)命名关键字参数
定义形参时,用*隔开
- *前:
- 参数支持位置和关键字传参
- 位置参数在前,关键字参数在后
- *后:
- 参数必须按照关键字传参
- 默认参数允许在位置参数后
7)组合使用
- 位置参数、默认参数、*args 、**kwargs
- 位置参数必须在关键字在前;不能重复赋值
【二】类型特殊语法参数Optional
1)注释概念
定义函数的位置参数时可以指定参数类型
2)基本类型注释
1.不可变数据类型
-
数字,字符串,布尔
def 函数名(参数:指定类型)-> 返回值类型: 代码块 return 返回值
2.可变数据类型
-
字典,列表,元组,集合
-
Dict,List,Tuple,Set
#导入类型模块,以支持类型注解 from typing import 类型 def 函数名(参数:指定类型[不可变类型]) -> 返回值类型: 代码块 return 返回值 # 字典的{键:值}都要约束
3.Union类型
-
允许参数接受多种不同类型的数据
from typing import Union def 函数名(参数:Union[类型1,类型2]) -> Union[类型1,类型2]: 代码块 return 返回值
4.Optional 类型
-
参数可以指定类型或None
from typing import Optional def 函数名(参数:Optional[类型1]) -> Optional[None]: 代码块 return 返回值
【三】名称空间
1)内建名称空间
- Python解释器自带的名称空间
- 第一个加载的名称空间
2)全局名称空间
- 随着内建名称空间加载完成
- 用户创建的,如变量名、函数名、类名
3)局部名称空间
- 函数内部定义的变量
- 随着函数而存在
4)加载顺序
-
加载顺序
- 内建名称空间->全局名称空间->局部名称空间,
-
查找顺序
- 局部名称空间->全局名称空间->内置名称空间。
【四】作用域
1)变量作用域
1.Local(局部变量)
- 用于暂时存放,作用于当前整个函数体
2.Enclosed(嵌套)
- 用于函数中嵌套函数内,作用于闭包函数
3.Global(全局)
- 用于模块文件顶层声明的变量,用于当前模块
4.Built-in(内置)
- 随着python启动而加载
2)LEGB规则
按照L - E - G - B的顺序查找变量
3)变量的修改
- global修改全局变量
- 将第一层函数内的变量修改到函数外层
- nonlocal修改外层函数变量
- 将第二层函数内的变量修改到第一层函数内