Python基础14:装饰器,递归函数和匿名函数

126 阅读3分钟

目录:

一.装饰器:

1.装饰器的定义

2.带有参数的装饰器

3.带有返回值的装饰器

二.递归函数

三.匿名函数

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

一.装饰器:

1.装饰器的定义:

一般一个闭包可以作为装饰器,并且闭包的外层函数必须有形参才行。因为作为装饰器时,会将被装饰的函数作为实参代入。
然后会已经将带入实参但还没运行的返回值函数,赋值给被装饰的函数,然后在运行被装饰的函数。

格式:

闭包1
     @闭包1的名称
     被装饰器函数2
     被装饰函数2()

例子:

# 定义装饰器:
def a(func):
    print('---------------')

    def b():
        func()
        print('刷漆')
        print('买家具')
        print('铺地板')
        print('精装房')

    print('----------------')
    return b


@a
def house():
    print('毛坯房.....')  # 这些步骤等价于house = a(house)


house()  # 此时的house就是b

调用结果:

---------------
----------------
毛坯房.....
刷漆
买家具
铺地板
精装房

2.带有参数的装饰器:

当被装饰函数带有形参时, 装饰器的里面的返回值函数也必须是带有形参。

对于只有一个参数的被装饰函数就不看例子了,直接看多参数的例子,因为多参数的可包含单参数

例子:

def c(d):
    def e(*args, **kwargs):    # 这样写,装饰器就可以变得更具兼容性,对于有着不同个数实参的被装饰函数,都能去装饰
        d(*args, **kwargs)
        print('很值钱')

    print('什么最值钱?')
    return e

#  进行装饰g函数
@c   
def g(i, k):
    print('{}和{}'.format(i, k))


g('房子', '亲情')       # 此时的g函数就是e函数

调用结果:

什么最值钱?
房子和亲情
很值钱

3.带返回值的装饰器:

就是装饰器的内部函数带有返回值

例子:

def decorater(func):
    def wrapper(*atgs, **kwargs):
        r = func(*atgs, **kwargs)
        print('预计装修费用是{}'.format(r))
        print('刷漆')
        print('铺地板')
        print('买家具')
        print('精装修房子')
        return r
    return wrapper


@decorater
def house():
    print('我是一个毛坯房。。。')
    return 20000


r = house()  # house就是wrapper
print(r)

调用结果:

我是一个毛坯房。。。
预计装修费用是20000
刷漆
铺地板
买家具
精装修房子
20000

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

二.递归函数:

如果一个函数在内部不调用其它函数, 而自己本身的话, 这个函数就是递归函数
遵循:
1. 必须要有出口
2. 每次递归向出口靠近

例子:


# 使用递归函数打印1到10

def numbers(n):
    n += 1
    print(n)
    if n >= 10:
        return

    numbers(n) # 函数体内部调用自己的函数



numbers(0)

调用结果:

# 使用递归函数打印1到10
1
2
3
4
5
6
7
8
9
10

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

三.匿名函数:

使用关键词lambda创建的一个单行函数。这种函数省略了用def 声明函数

例子:

sum = lambda a, b: a + b
x = sum(1,2)
print(x)
sum(0, 1)

调用结果:

3