python基础——闭包、装饰器、递归函数、匿名函数

闭包、装饰器、递归函数、匿名函数

闭包

闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数块+引用环境)。

闭包:
1.嵌套函数
2.内部数据引用了外部数据的变量
3.返回值是内部函数
def outer(n):
    a = 10

    def inner():
        b = a + n
        print('内部函数', b)

    return inner


a = outer(2)()

装饰器

  • 原则:开放封闭原则,在不改变原函数的情况下,拓展函数得到功能

  • 装饰器(decorator)功能:

  1. 引入日志

  2. 函数执行时间统计

  3. 执行函数前预备处理

  4. 执行函数后清理功能

  5. 权限验证等场景

  6. 缓存

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值