1.装饰器
- 软件开发有一条重要的规则:对修改封闭,对扩展开放。对于一个现有函数,如向增强此函数功能,不允许修改函数源代码时候,使用装饰器解决这个问题。
- 本质:就是一个闭包,还是一个返回函数的高阶函数
- 好处:就是在不用修改原函数代码的前提下给函数增加新的功能
1.1 装饰器初步
def demo1(name):
print(f"{name},加油")
def wrapper(func):
def inner(name):
func(name)
print("岂曰无衣,与子同袍")
return inner
demo1 = wrapper(demo1)
print(demo1)
demo1("武汉")
1.2 语法糖@
- 使用@时候,如果装饰器和需要被装饰的在同一个.py文件中的时候,装饰器一定要出现在被装饰函数的前面【Python中的代码时从上往下依次执行】
def wrapper(func):
def inner(name):
func(name)
print("岂曰无衣,与子同袍")
print("青青子衿,悠悠我心")
return inner
@wrapper
def demo2(name):
print("{},风月同天".format(name))
print(demo2)
1.3 带任意参数的装饰器
def wrapper(func):
def inner(*args,**kwargs):
func(*args,**kwargs)
print("岂曰无衣,与子同袍")
return inner
@wrapper
def hello():
print("门前大桥下,游过一群鸭")
hello()
1.4 多个装饰器装饰同一个函数
- 多个装饰器同时作用于一个函数的时候,注意一下装饰器的顺序
def wrapper1(func):
print("装饰器1的外部函数")
def inner(*args,**kwargs):
func(*args,**kwargs)
print("装饰器1的内部函数")
print("岂曰无衣,与子同袍")
return inner
def wrapper2(func):
print("装饰器2--外不函数")
def inner(*args,**kwargs):
func(*args,**kwargs)
print("装饰器2的内部函数")
print("岂曰无衣,与子同袍")
return inner
@wrapper1
@wrapper2
def demo2():
print("我是被装饰的函数")
demo2()
2.递归函数
- 一个问题规模缩减后,求解方式和原来一样,小规模问题解决后导致问题的最终解决,则可适用递归
- 形式时递归的阶乘和斐波那契数列;结构时递归的列表遍历;解决时递归的汉诺塔
- 递归程序必须包含两部分;递归终止条件;递归调用自己
def demoA():
print("A")
print("------")
def demoB():
print("B")
demoA()
print("*****")
def demoC():
print("C")
demoB()
print("=====")
"""
n! = (n-1)!*n
5! = 4! * 5
4! = 3! * 4
3! = 2! * 3
2! = 1! * 2
1! = 0! * 1
0! = 1
"""
def fac(n):
if n == 0:
return 1
return fac(n-1) * n
print(fac(10))