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

Python高阶函数详解及应用案例分享

发布时间:2023-06-21 23:59:12

Python高阶函数是指能够接收函数作为参数或返回函数作为结果的函数,它可以对其他函数进行操作或者将其他函数作为参数或返回值,是函数式编程的重要概念之一。在Python中,高阶函数利用函数重用、参数化和抽象化的原则有效地提高了程序的可复用性和可扩展性,广泛应用于数据分析、机器学习、Web开发等领域。

本文将详细介绍Python高阶函数的各种应用,包括常见的map、filter、reduce、sorted等内建函数,以及lambda表达式、functools库等高级用法。同时,我们还将通过实例演示这些函数的实际运用,帮助读者更好地理解和掌握Python高阶函数的精髓。

一、内建函数

1.map函数

map函数可以对一个序列中的每个元素应用一个函数,得到一个新序列。其语法为:map(function, iterable)。其中,function是一个可调用对象,可以是函数、方法或lambda表达式。iterable是可迭代对象,可以是列表、元组、字典等。

示例:

# 将列表中的元素都转换为字符串
lst = [1, 2, 3]
lst_str = list(map(str, lst))
print(lst_str) # ['1', '2', '3']

# 计算列表中每个元素的平方
lst = [1, 2, 3]
lst_square = list(map(lambda x: x ** 2, lst))
print(lst_square) # [1, 4, 9]

# 将字典中的值都转换为字符串
dct = {'a': 1, 'b': 2, 'c': 3}
dct_str = dict(map(lambda x: (x[0], str(x[1])), dct.items()))
print(dct_str) # {'a': '1', 'b': '2', 'c': '3'}

2.filter函数

filter函数可以对一个序列中的元素应用一个布尔函数,得到一个满足条件的新序列。其语法为:filter(function, iterable)。其中,function是一个可调用对象,返回值是布尔类型。iterable是可迭代对象,可以是列表、元组、字典等。

示例:

# 过滤列表中的偶数
lst = [1, 2, 3, 4, 5]
lst_even = list(filter(lambda x: x % 2 == 0, lst))
print(lst_even) # [2, 4]

# 过滤字典中值小于2的项
dct = {'a': 1, 'b': 2, 'c': 3}
dct_filtered = dict(filter(lambda x: x[1] < 2, dct.items()))
print(dct_filtered) # {'a': 1}

3.reduce函数

reduce函数可以对一个序列中的元素依次应用一个二元函数,得到一个聚合结果。其语法为:reduce(function, iterable[, initializer])。其中,function是一个可调用对象,返回值是任意类型。iterable是可迭代对象,可以是列表、元组、字典等。initializer是一个可选参数,用于指定初始值。

示例:

# 计算列表中所有元素的和
from functools import reduce
lst = [1, 2, 3, 4, 5]
lst_sum = reduce(lambda x, y: x + y, lst)
print(lst_sum)  # 15

# 求列表中的最大值
lst_max = reduce(lambda x, y: x if x > y else y, lst)
print(lst_max) # 5

# 将列表中所有字符串连接成一个新字符串
lst = ['hello', 'world', 'python']
lst_str = reduce(lambda x, y: x + ' ' + y, lst, 'Greeting:')
print(lst_str) # 'Greeting: hello world python'

4.sorted函数

sorted函数可以对一个序列进行排序,返回一个新的排序后的序列。其语法为:sorted(iterable, key=None, reverse=False)。其中,iterable是可迭代对象,可以是列表、元组、字典等。key是一个可调用对象,用于提取每个元素的比较键值。reverse是一个布尔类型的参数,用于指定排序顺序。

示例:

# 对列表中的数字进行排序
lst = [3, 1, 4, 2, 5]
lst_sorted = sorted(lst)
print(lst_sorted) # [1, 2, 3, 4, 5]

# 对字典中的值进行排序
dct = {'a': 3, 'b': 1, 'c': 4}
dct_sorted = dict(sorted(dct.items(), key=lambda x: x[1]))
print(dct_sorted) # {'b': 1, 'a': 3, 'c': 4}

二、高级用法

1.lambda表达式

lambda表达式是一种轻便的匿名函数定义方式,其语法为:lambda arguments: expression。其中,arguments是参数列表,可以是位置参数、默认参数、可变参数、关键字参数等。expression是表达式,表示函数的返回值。

示例:

# 定义一个计算平方的lambda函数
square = lambda x: x ** 2
print(square(3)) # 9

# 对列表中的元素进行平方计算并过滤掉小于10的元素
lst = [1, 2, 3, 4, 5]
lst_square = list(filter(lambda x: x ** 2 > 10, map(lambda x: x ** 2, lst)))
print(lst_square) # [16, 25]

2.functools库

functools库是Python内建的一个库,提供了一些高阶函数和工具,方便我们进行函数操作和组合。其中,常用的函数有:

(1)partial函数:用于部分应用一个函数,生成一个新的可以接受剩余参数的函数。

示例:

from functools import partial
# 定义一个计算幂的函数
def power(x, n):
  return x ** n
# 固定      个参数为2,生成一个新的函数
power_2 = partial(power, 2)
print(power_2(3)) # 8

(2)reduce函数:用于对一个序列中的元素依次应用一个函数,得到一个聚合结果。

示例同内建函数。

(3)wraps函数:用于保留原函数的元信息,如函数名、注释等。

示例:

from functools import wraps
# 定义一个装饰器
def my_decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        """This is a wrapper function."""
        print('Before function call')
        result = func(*args, **kwargs)
        print('After function call')
        return result
    return wrapper
# 对一个函数进行装饰,并保留其元信息
@my_decorator
def greet(name):
    """This is a greet function."""
    print(f'Hello, {name}!')
print(greet.__name__) # greet
print(greet.__doc__) # This is a greet function.

三、应用案例

1.数据处理

假设我们有一个数据列表lst,其中包含不同商品的销售数据,我们需要计算每种商品的总销售额并按照销售额排序。

数据格式如下:

lst = [{'name': 'apple', 'price': 5, 'quantity': 10},
       {'name': 'banana', 'price': 3, 'quantity': 20},
       {'name': 'orange', 'price': 2, 'quantity': 30},
       {'name': 'pear', 'price': 4, 'quantity': 15}]

解决方法如下:

`python

# 计算每种商品的总销售额

total_sales = {}

for item in lst:

name = item['name']

price = item['price']

quantity = item['quantity']

if name in