Python高级函数2:使用itertools、functools、operator使得代码更高效、可读、可重用

Python高级函数2:使用itertools、functools、operator使得代码更高效、可读、可重用

Python 是一种功能强大的编程语言,它提供了范围广泛的内置函数和模块,使编码更容易、更高效。上一篇博客介绍了map、reduce、filter、zip 和 enumerate ;这篇博客将介绍itertools.groupby()、functools.partial()、operator.attrgetter() 和 operator.itemgetter(),并通过实际示例介绍如何使用这些功能解决现实世界问题。这些函数非常强大和有用,可以大大提高你的编码能力,以及让代码更高效、可读、可重用。

Python 标准库中还有许多更强大的函数可用。作为 Python 开发人员,必须继续学习和探索这些功能以提高技能和能力。通过这种方式可以编写更好、更高效的代码,并解决更复杂的问题。 好的代码不仅涉及使用高级函数,还涉及编写干净、可读和文档齐全的代码,并遵循良好的编码实践。

itertools 模块提供了一个名为 groupby() 的函数,允许根据键函数对可迭代对象中的项目进行分组。此功能对于数据分析和操作任务非常有用。

functools 模块提供了一个名为 partial() 的函数,允许创建一个带有一些预填充参数的新函数。此函数对于创建可重用代码以及简化复杂函数调用非常有用。

operator 模块提供了两个函数,分别称为 attrgetter() 和 itemgetter(),允许轻松访问对象的属性或项目。这些函数对于根据对象的属性或项对对象列表进行排序非常有用。

1. 原理

itertools.groupby()

itertools 模块中的 groupby() 函数允许根据键函数对可迭代对象中的项目进行分组。这对于数据分析和操作任务非常有用。该函数有两个参数:一个可迭代对象和一个用于确定每个元素的键的函数。该函数返回一个生成对 (键, 组) 的迭代器,其中每个组都是具有相同键的元素序列。

functools.partial()

functools 模块中的 partial() 函数允许创建一个预填充了一些参数的新函数。这对于创建可重用的代码以及简化复杂的函数调用非常有用。该函数接受一个函数和任意数量的参数和关键字参数,并返回一个新的可调用对象,该对象在调用时,它将原始函数应用于给定的参数和关键字参数,以及传递给可调用对象的任何其他参数和关键字参数。

operator.attrgetter() 和 operator.itemgetter()

operator模块中的 attrgetter() 和 itemgetter() 函数分别允许轻松访问对象的属性或项。对于根据对象的属性或项目对对象列表进行排序非常有用。
attrgetter() 函数返回一个可调用对象,当调用时,它返回输入对象的给定属性的值。itemgetter() 函数返回一个可调用对象,当调用时,它返回输入对象的给定项的值。

2. 源码

# python高级函数2: itertools、functools、operator
# python python_high2.py

from itertools import groupby

words = ['apple', 'average', 'banana', 'cherry', 'date', 'elderberry', 'fig']

# itertools.groupby() 函数根据键函数对可迭代对象中的项目进行分组。这对于数据分析和操作任务非常有用。该函数有两个参数:一个可迭代对象和一个用于确定每个元素键的函数。该函数返回一个生成对(键、组)的迭代器,其中每个组都是具有相同键的元素序列。下面是如何使用它按第一个字母对单词列表进行分组的示例:
# 该函数按单词的第一个字母对单词进行分组,它首先对单词列表进行排序,然后将 key 函数应用于每个元素以确定作为单词第一个字母的键,然后迭代结果,对于每个键,它返回关联的元素组
for first_letter, group in groupby(sorted(words), key=lambda x: x[0]):
    print(first_letter, list(group))

# functools.partial() functools 模块中的 partial() 函数允许创建一个预填充了一些参数的新函数。这对于创建可重用的代码以及简化复杂的函数调用非常有用。该函数接受一个函数和任意数量的参数和关键字参数,并返回一个新的可调用对象,该对象在调用时,它将原始函数应用于给定的参数和关键字参数,以及传递给可调用对象的任何其他参数和关键字参数。下面是如何使用它创建一个将数字乘以 10 的新函数的示例:
from functools import partial


def multiply(x, y):
    return x * y


# 定义了一个函数乘法,它接受两个参数并返回它们的乘积。然后使用偏函数创建一个新的函数times_10,该函数等效于第一个参数固定为 10 的乘法函数。因此当调用 times_10(5) 时,它相当于调用返回 50 的 multiply(10,5)。
times_10 = partial(multiply, 10)

print(times_10(5))  # 50

# operator.attrgetter() 和 operator.itemgetter() 运算符模块中的 attrgetter() 和 itemgetter() 函数分别允许轻松访问对象的属性或项。对于根据对象的属性或项目对对象列表进行排序非常有用。
# attrgetter() 函数返回一个可调用对象,当调用时,它返回输入对象的给定属性的值。itemgetter() 函数返回一个可调用对象,当调用时,它返回输入对象的给定项的值。下面是如何使用 attrgetter() 按对象名称属性对对象列表进行排序的示例:
import operator


class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


people = [Person('Bob', 30), Person('Charlie', 25), Person('Alice', 35)]

sorted_people = sorted(people, key=operator.attrgetter('name'))

for person in sorted_people:
    print(person.name)

data = [(1, 'a'), (3, 'b'), (2, 'c')]

# 根据第2个属性排序 使用 itemgetter() 函数来获取每个元组的第二项,并将其用作排序的键。
sorted_data = sorted(data, key=operator.itemgetter(1))

for item in sorted_data:
    print(item)

参考

猜你喜欢

转载自blog.csdn.net/qq_40985985/article/details/130362337