Python零基础之高阶函数(高阶函数,匿名函数,闭包,装饰器)

1. 高阶函数

  • 接收函数作为参数,或者将函数作为返回值返回都是高阶函数
  • 高阶函数示例:
lst = [i for i in range(1,11)]

# 定义一个函数,用来检查偶数
def fn2(i):
    if i % 2 == 0:
        return True
# 定义一个函数,用来检查数字是否大于5
def fn3(i):
    if i > 5:
        return True
# 定义一个函数,用来检查偶数
def fn4(i):
    if i % 3 == 0:
        return True

def fn(func,lst):
    new_list = []
    for n in lst:
        if func(n):
            new_list.append(n)
    return new_list
# 把函数也当作变量处理,通过改变输入的函数改变规则
# 将指定代码传递入了函数
print(fn(fn4,lst))

2. 匿名函数

  • 匿名函数:lambda 函数表达式
  • 创建简单函数,是一种函数创建方式
  • 语法: lambda 参数列表: 返回值
  • 匿名函数示例:
# 匿名函数:lambda 函数表达式
# 创建简单函数,是一种函数创建方式
# 语法: lambda 参数列表: 返回值

a,b = 1,2
def fn5(a,b):
    return a + b
print(fn5(a,b))
# 创建lambda匿名函数的参数列表a,b : 返回值是a+b,后边跟的括号中是实参列表赋值给a,b
print((lambda a,b : a+b)(1,2))

fn6 = lambda a,b : a+b
print(fn6(2,4))

3. 闭包

  • 高阶函数的另一种形式: 闭包
  • 将函数作为返回值返回
  • 闭包函数可以访问到闭包内的变量
# 高阶函数的另一种形式: 闭包
# 将函数作为返回值返回

def fn():
    # 函数内部定义了一个函数fn1
    a = 123
    def fn1():
        print('我是fn1...',a)

    # 将fn1作为返回值返回
    return fn1
# 返回了函数对象
print(fn())
# r表面在全局,实际上在函数fn内
r =  fn()
# 调用fn1函数
# 可以访问到fn()函数内部的变量
r()
  • 通过闭包隐藏变量,注意nums的定义位置
  • 未保护示例:
nums = []

def average(n):
    # 将n添加到列表中
    nums.append(n)
    return sum(nums) / len(nums)
print(average(10))
print(average(10))
# nums可以被任何人修改,不安全,破坏了函数的安全性
nums.append(30)
print(average(30))

采用闭包保护

def make_average():
	# 变量定义在了闭包内
    nums = []
    def average(n):
        # 将n添加到列表中
        nums.append(n)
        # 计算列表中的平均值
        return sum(nums) / len(nums)
    # 返回了内部函数
    return average
# 把make_average()返回的函数赋给a,此时a()就是average()
a = make_average()
print(a(10))
# 此时对nums进行赋值,并不改变函数运行结果
nums = []
print(a(20))

4. 装饰器

4.1 装饰器的引入

  • 通过print()增加装饰语句的Bad Point:
  • 会导致修改难度过于麻烦
  • 会导致维护困难
  • 会违反开闭原则(ocp)
def add(a,b):
    # print('函数开始执行...')
    r = a + b
    # print('函数执行结束...')
    return r
def mul(a,b):
    return a * b
r = add(1,2)
print(r)

4.2 装饰器的作用

  • 装饰器使程序的执行过程更美观,更具交互性
  • 在不修改函数的情况下开发对程序的扩展
# 示例:实现在不修改函数的情况下实现对原函数的扩展
def fn():
    print('我是fn函数....!!')

def fn2():
    print('函数开始执行...')
    fn()
    print('函数执行结束...')
fn2()

4.3 装饰器的运用

  • 以下代码中的start_end()函数就叫做装饰器
  • 通过装饰器可以在不修改源代码的基础上进行程序扩展
  • 在开发中,我们应当采用装饰器来扩展功能
def add(a,b):
    r = a + b
    return r

def fn():
    print('我是fn函数...')

def start_end(old):
    # 对其他函数进行扩展,在其他函数执行开始和结束分别打印开始和结束

    # 创建一个新的函数
    def new_function(*args,**kwargs):
        print('开始执行...')
        # 在此处加fn()就写死了,所以把函数作为参数传递
        # fn()
        # 调用需要被扩展的函数
        # args 是 arguments 的缩写,表示位置参数;
        # kwargs 是 keyword arguments 的缩写,表示关键字参数。
        # 这其实就是 Python 中可变参数的两种形式
        # *args 必须放在 **kwargs 的前面,因为位置参数在关键字参数的前面。
        # **是为了避免和*冲突
        result = old(*args,**kwargs)
        print('执行结束...')
        return result
    return new_function
# # f = start_end(fn)
# f = start_end(add)
# r = f(1,2)
# print(r)

# 当函数需要传参数量或者属性不同的时候装饰器会又问题
# f = start_end(fn)
# r = f()
# print(r)

# 所以*args,接收所有位置
# **kwargs,接收所有关键字参数

f = start_end(fn)
r = f()

f2 = start_end(add)
r = f2(123,234)
print(r)
# 可以通过 @装饰器 进行程序扩展
@start_end
def speak():
    print('大家好好学习!!!')

speak()
  • 可以通过 @装饰器 进行程序扩展,如@start_end
  • 注意@符和装饰器中间不能添加空格

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kingx3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值