闭包
闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数块+引用环境)。
闭包:
1.嵌套函数
2.内部数据引用了外部数据的变量
3.返回值是内部函数
def outer(n):
a = 10
def inner():
b = a + n
print('内部函数', b)
return inner
a = outer(2)()
装饰器
-
原则:开放封闭原则,在不改变原函数的情况下,拓展函数得到功能
-
装饰器(decorator)功能:
-
引入日志
-
函数执行时间统计
-
执行函数前预备处理
-
执行函数后清理功能
-
权限验证等场景
-
缓存
import time
def cal_time(fn):
def inner():
start = time.time()
s = fn()
end = time.time()
print('代码耗时', end - start)
return s
return inner
@cal_time
def demo():
x = 0
for i in range(1, 100000):
x += i
return x
a=demo()
print(a)
- 为啥打印 m的值是 None 而不是x 的值呢?
因为m=demo()在内存里实际上是m=inner()
- 想要返回怎么办?
在内部函数里返回,5 8 行
def decorater(func):
def wrapper():
func()
print("刷漆")
print("铺地板")
print("买家具")
print("精装修房子")
return wrapper
@decorater
def house():
print("毛坯房--")
house()
图解
递归函数
如果一个函数在内部不调用其它的函数,而是自己本身的话,这个函数就是递归函数。(自己调用自己)
图解
递归函数的作用
举个例子:打印数字 1-10
# 打印数字1-10
def test(i):
if i == 10:
print('10')
else:
print(i)
i += 1
test(i)
test(1)
打印 1-10 的和
# 1-10的和
count1 = 0
def test1(i):
global count1
count1 += i
if i == 10:
print(count1)
else:
i += 1
test1(i)
test1(1)
计算阶乘 n! = 1 * 2 * 3 * ... * n
解决办法1:使用循环来完成
def cal(num):
result,i = 1,1
while i <= num:
result *= i
i+= 1
return result
print(cal(3))
匿名函数
lambda 参数列表: 运算表达式
# 一个参数
a = lambda num: num + 1
print(a(4)) # 5
# 多个参数
b = lambda q, w, e, r: q - w - e - r
print(b(1, 2, 3, 4)) # -8
# if..else
c = lambda x: x if x % 2 == 0 else x + 1
print(c(6)) # 6
print(c(7)) # 8