目录
1. 函数简介
- 函数分类
2. 函数参数
- 形参与实参
- 参数传递方式
- 不定长参数
3. 函数作用域
- 全局作用域
- 函数作用域
- 命名空间
4. 递归函数
5. 高阶函数
- 闭包
- 装饰器
课堂笔记
1. 函数简介
- 函数(function),为实现某个功能而定义的一段可执行的代码,可对其进行重复调用,属于对象级别
1.1 函数分类
- 自定义函数,自己定义的函数,一般仅在当前文件中使用
# 语法
def funName(parm1, parm2....):
expresssions
- 内置函数,又称为内嵌函数,为编程语言自身预先定义的函数,存在于函数库中,使用时自己调用即可
2. 函数参数
2.1 形参与实参
- 形参(形式参数),相当于在函数内部定义的参数,但并为赋值
- 实参(实际参数),定义了形参就必须传递实参,相当于为形参赋值,形参与实参数相对应
2.2 参数传递方式
- 位置传参,实参与形参的位置相对应给出参数
def f1(name, age):
print('name =', name, ',age =', age)
f1('葫芦娃', 10)
- 关键字传参,按照形参参数名指定传递参数,参数位置可以任意
def f1(name, age):
print('name =', name, ',age =', age)
f1(age=10, name='葫芦娃')
2.3 不定长参数
- *形参 ,*形参 会将获取的参数保存到一个 元组 中,该参数最多只能有一个,
- ** 形参,**形参 将获取的参数保存到一个 字典 中,其也可以接收关键字参数,将其关键字与值一一映射到字典的key-value中
- 区别:
- *形参 只能放在所有位置参数之后,其后面只能放关键字参数以及 **参数,其中 **参数必须放在所有参数最后
def f1(a, *b, c, **d): print(a, type(a)) # 1 <class 'int'> print(b, type(b)) # (2, 5) <class 'tuple'> print(c, type(c)) # 70 <class 'int'> print(d, type(d)) # {'d': 25, 'e': 17} <class 'dict'> f1(1, 2, 5, c=70, d=25, e=17)
- 参数解包,传递实参时在变量前加*,这样会自动将序列中参数依次传递
def f1(a, *b, c, **d):
print(a, type(a)) # 1 <class 'int'>
print(b, type(b)) # (2, 5) <class 'tuple'>
print(c, type(c)) # 70 <class 'int'>
print(d, type(d)) # {'d': 25, 'e': 17} <class 'dict'>
# 定义一个元组
t = (2, 5)
# 定义一个字典
d = {'d':25,'e':17}
f1(1, *t, c=70, **d) # 参数的解包,含义与上面等价
3. 函数作用域
- 作用域(scope),变量生效的区域
3.1 全局作用域
- 全局作用域,即函数以外的区域,创建于程序执行时,在程序结束时销毁,定义于全局作用域的变量可在程序任意位置进行访问
3.2 函数作用域
- 函数作用域,即函数内的区域,每次调用都会产生一个新的作用域,调用结束时会自动销毁,函数作用域内的变量只能用于该函数内部
3.3 命名空间
- 命名空间,一个用于存储变量的字典,可用于获取当前作用域内的所有变量及值,用locals()实现
4. 递归函数
- 一种解决问题的方式,将一个大规模的问题分解为一个个小规模的问题,直到问题无法分解时为止
- 两要素:
- 边界条件,即当问题分解到不能再分解时的条件,此时可直接返回结果
- 递归条件,即当问题仍需继续分解时的条件,此时须继续执行递归函数,直到边界条件满足
# 求10的阶乘 10!
# 分解:10! = 10*9! = 10*9*8! ... = 10*9*8..*2*1! = 10*9*8...*2*1
# 定义递归函数
def fac(n):
if n > 1: # n > 1 为递归条件
return n*f(n-1)
return 1 # n == 1 为边界条件,直接返回结果
print(fac(10)) # 输出 3628800
5. 高阶函数
- 高阶函数,接收函数作为参数 或将函数作为返回值的函数
# 定义函数
def f():
def fn():
print('hello world')
return fn
# 执行f函数
res = f()
res() # 打印 hello world
5.1 闭包
-
高阶函数的一种
-
特点:
- 可以将数据放到闭包中,防止被随意访问,但可以被之后的函数调用,类似于Java中的私有成员变量
-
形成闭包条件
- 函数嵌套
- 将内部函数作为返回值返回
- 内部函数必须使用的外部函数的变量
5.2 装饰器
- 作用:为已经存在的函数或对象添加额外的功能,即起到扩展功能的作用
- 实例:
# 定义两个操作数数的加法器
def add(a, b):
return a+b
# 定义三个操作数的乘法器
def mul(a, b, c):
return a*b*c
# 定义高阶函数,引入装饰器,并使用不定长参数
def f(funName):
def fn(*args, **kwargs):
# 为当前函数funName扩展 开始执行 与 执行完毕 两条语句
print('开始执行...')
res = funName(*args, **kwargs)
print('执行完毕...')
return res
return fn
res = f(add)
print(res(40, 50))
res = f(mul)
print(res(2, 4, 6))
为简化工作,python内部自定义了装饰器的使用,用@代替
# 如上,定义相同f高阶函数
......
@f
def add(a, b):
return a+b
@f
def mul(a, b, c):
return a*b*c
# 可直接调用,输出结果相同
print(add(40, 50))
print(mul(2, 4, 6))