欢迎访问宙启技术站
智能推送

Python函数式编程:高阶函数和装饰器详解

发布时间:2023-06-19 21:49:42

函数式编程是一种编程范式,Python中也有函数式编程的思想和功能。本文将重点介绍Python中的高阶函数和装饰器。

1. 高阶函数

高阶函数是指函数可以接收函数作为参数或返回一个函数。在Python中,函数是具有“一等公民”地位的,因此可以被传递和返回。下面是一些常用的高阶函数:

1.1 map函数

map函数接收一个函数和一个可迭代对象作为参数,返回一个新的迭代器,迭代器中的元素是将可迭代对象中的元素依次传递给函数处理后的结果。例如:

def square(x):
    return x ** 2

lst = [1, 2, 3, 4]
new_lst = map(square, lst)
for i in new_lst:
    print(i)

输出:

1
4
9
16

map函数可以用lambda表达式简化写法:

lst = [1, 2, 3, 4]
new_lst = map(lambda x: x ** 2, lst)
for i in new_lst:
    print(i)

1.2 filter函数

filter函数接收一个函数和一个可迭代对象作为参数,返回一个新的迭代器,迭代器中的元素是将可迭代对象中的元素依次传递给函数判断后返回True的结果。例如:

def is_even(x):
    return x % 2 == 0

lst = [1, 2, 3, 4]
new_lst = filter(is_even, lst)
for i in new_lst:
    print(i)

输出:

2
4

filter函数也可以用lambda表达式简化写法:

lst = [1, 2, 3, 4]
new_lst = filter(lambda x: x % 2 == 0, lst)
for i in new_lst:
    print(i)

1.3 reduce函数

reduce函数接收一个函数和一个可迭代对象作为参数,返回一个结果。reduce函数是将可迭代对象中的元素依次传递给函数处理,处理后的结果与下一个元素继续传递给函数处理,最终得到一个结果。例如:

from functools import reduce

def add(x, y):
    return x + y

lst = [1, 2, 3, 4]
result = reduce(add, lst)
print(result)

输出:

10

reduce函数也可以用lambda表达式简化写法:

from functools import reduce

lst = [1, 2, 3, 4]
result = reduce(lambda x, y: x + y, lst)
print(result)

2. 装饰器

装饰器是在不改变原函数代码前提下,增加函数功能的一种方式。在Python中,装饰器是一个函数,可以在函数定义前加上@decorator的形式来使用。下面是一些常用的装饰器:

2.1 装饰器函数

使用装饰器函数,可以记录函数的执行时间,增加函数参数校验等功能。

import time

def runtime(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print('函数运行时间:', end_time - start_time)
        return result
    return wrapper

@runtime
def func():
    time.sleep(2)
    print('Hello World!')

func()

输出:

Hello World!
函数运行时间: 2.000295877456665

2.2 类装饰器

使用类装饰器,可以记录函数的执行次数,动态增加方法等功能。

class Counter:
    def __init__(self, func):
        self.func = func
        self.count = 0
        
    def __call__(self, *args, **kwargs):
        self.count += 1
        return self.func(*args, **kwargs)

@Counter
def func():
    print('Hello World!')

func()
func()
print('函数执行次数:', func.count)

输出:

Hello World!
Hello World!
函数执行次数: 2

2.3 带参数的装饰器函数

装饰器函数可以带参数,可以实现具有不同功能的装饰器。

def login_required(role):
    def decorator(func):
        def wrapper(*args, **kwargs):
            if role == 'admin':
                print('验证通过,管理员权限!')
                return func(*args, **kwargs)
            else:
                print('验证失败,普通用户没有权限!')
                return None
        return wrapper
    return decorator

@login_required('admin')
def admin_func():
    print('管理员操作!')

@login_required('user')
def user_func():
    print('普通用户操作!')

admin_func()
user_func()

输出:

验证通过,管理员权限!
管理员操作!
验证失败,普通用户没有权限!

总结:高阶函数和装饰器是Python函数式编程中的重要概念,掌握它们可以让我们写出更加简洁、高效、易维护的代码。