python 高级函数补充

1.高阶函数概述

在Python中,函数是一等公民,是指函数像其他算子一样,可以作为变量的值赋给其他变量,可以作为参数传递给其他函数,也可以作为其他函数的返回值。而高阶函数是以函数作为参数或返回值的函数,它可以减少代码量,提高代码的可读性和灵活性。

1.1 map函数

map函数是Python自带的高阶函数,它接收一个函数和一个可迭代对象作为参数,将函数应用于每个元素并返回一个新的可迭代对象。

# 将列表中的所有元素乘以2

def double_num(x):

return 2*x

lst = [1, 2, 3, 4, 5]

res = map(double_num, lst)

print(list(res)) # [2, 4, 6, 8, 10]

在上述代码中,我们定义了一个double_num函数,将参数乘以2,并将该函数作为参数传递给map函数,最终得到一个新的列表 [2, 4, 6, 8, 10]。

1.2 filter函数

filter函数也是Python自带的高阶函数,接收一个函数和一个可迭代对象作为参数,返回所有使得函数返回值为True的元素组成的迭代器。

# 保留列表中的所有偶数

def is_even(x):

return x % 2 == 0

lst = [1, 2, 3, 4, 5]

res = filter(is_even, lst)

print(list(res)) # [2, 4]

在上述代码中,我们定义了一个is_even函数,当参数为偶数时返回True,将该函数作为参数传递给filter函数,最终得到一个新的列表 [2, 4]。

1.3 reduce函数

reduce函数是Python自带的高阶函数,需要从functools模块中导入。它接收一个函数和一个可迭代对象作为参数,对可迭代对象中的元素进行迭代计算,将结果与下一个元素继续进行计算,返回最终的计算结果。

# 计算列表中所有元素的乘积

from functools import reduce

def multiply(x, y):

return x * y

lst = [1, 2, 3, 4, 5]

res = reduce(multiply, lst)

print(res) # 120

在上述代码中,我们定义了一个multiply函数,将两个参数相乘,将该函数作为参数传递给reduce函数,最终得到列表中所有元素的乘积120。

2.lambda函数

lambda函数也称为匿名函数,它是一种简单的、一次性的函数定义方式。lambda函数的语法为lambda参数列表:函数体,其中参数列表和函数体与普通函数定义方式相同。

lambda函数通常作为高阶函数的参数使用,可以避免定义冗长的函数并在使用后丢弃。

# 使用lambda函数代替高阶函数的参数

lst = [1, 2, 3, 4, 5]

res = map(lambda x: 2*x, lst)

print(list(res)) # [2, 4, 6, 8, 10]

3.装饰器

装饰器是Python中用于修改或增强函数定义的语法结构。装饰器通常用于在不修改原函数定义的情况下增加新的功能,比如日志记录、用户认证、性能分析等。

3.1 基本装饰器

最简单的装饰器是将一个函数包裹在另一个函数中,并在其中调用原函数实现功能的增强。以下示例定义了一个装饰器,它在函数被调用前打印一条日志。

# 定义装饰器函数

def log(func):

def wrapper(*args, **kw):

print(f'calling function {func.__name__} with args {args} and kw {kw}')

return func(*args, **kw)

return wrapper

# 使用装饰器修饰函数

@log

def my_func(x):

return x

res = my_func(1)

print(res) # 1

在上述代码中,我们定义了一个log装饰器,它接收一个函数作为参数,返回一个新的函数wrapper。wrapper函数打印日志,并调用原函数func获取返回值。使用@语法将装饰器应用于my_func函数,即my_func = log(my_func)。

3.2 带参数的装饰器

装饰器函数可以接收参数,向装饰器中传递参数可以通过在@语法中写上参数,比如@decorator(args)。

# 定义带参数的装饰器函数

def log(level):

def decorator(func):

def wrapper(*args, **kw):

print(f'[{level}] calling function {func.__name__} with args {args} and kw {kw}')

return func(*args, **kw)

return wrapper

return decorator

# 使用装饰器修饰函数

@log(level='INFO')

def my_func(x):

return x

res = my_func(1)

print(res) # 1

在上述代码中,我们定义了一个带参数的log装饰器,它接收一个level参数,返回一个decorator函数。decorator函数接收一个函数作为参数,返回一个wrapper函数。wrapper函数打印日志,并调用原函数func获取返回值。使用@语法将装饰器应用于my_func函数,并将level参数传递给装饰器。

4.partial函数

partial函数是一个返回新函数的、带参数的高阶函数。它可以将一个函数的部分参数进行固定,并返回一个新函数,新函数可以再接收其他参数,并将固定的参数和新的参数一起传递给原函数。

# 使用partial函数将函数的部分参数固定

from functools import partial

def multiply(x, y):

return x * y

double = partial(multiply, y=2)

res = double(3)

print(res) # 6

在上述代码中,我们定义了一个multiply函数,将两个参数相乘。使用partial函数将函数的第二个参数固定为2,并返回一个新的函数double。调用新函数double时,将参数3和固定参数2一起传递给原函数multiply,最终得到返回值6。

5.总结

高阶函数是Python中非常有用的语法结构,可以大大简化代码并提高代码的可读性和灵活性。常见的高阶函数包括map、filter和reduce函数,可以让我们避免使用循环迭代操作。lambda函数是一种简单的函数定义方式,通常用于高阶函数的参数定义。装饰器是一种修改或增强函数定义的语法结构,可以增加函数的功能而不改变原函数定义。partial函数是一个返回新函数的高阶函数,可以将原函数的部分参数进行固定。

后端开发标签