引言
在本文中,我们将分享一些在Python生态系统中提高编程效率的实用技巧。大部分技巧都是使用标准库中的功能,而其他一些则涉及一些第三方库。
在深入了解本文内容之前,让我们先回顾一下Python中迭代器(Iterables)的概念。
根据Python标准文档的定义,迭代器的概念如下:
迭代器是一种能够一次返回一个成员的对象。
迭代器的示例包括:
- 所有序列类型(如list、str和tuple)
- 一些非序列类型,如dict、文件对象以及类的实现中定义了
__iter__()
方法
迭代器是一个需要我们牢记的概念,因为接下来我们展示的许多技巧都使用了itertools
包。itertools
模块提供了一些函数,用于对迭代器对象进行操作,而不仅仅是逐个处理对象。
Trick 1
在工作和学习中,我们经常需要使用一个简单的函数来从一个列表生成新的列表、集合或字典。在这种情况下,我们可以利用迭代器的概念。举例来说:
- 生成列表:
<code>names = ['John', 'Bard', 'Jessica', 'Andres'] lower_names = [name.lower() for name in names]</code>
- 生成集合:
<code>names = ['John', 'Bard', 'Jessica', 'Andres'] lower_names = {name.lower() for name in names}</code>
- 生成字典:
<code>names = ['John', 'Bard', 'Jessica', 'Andres'] lower_names = {name: name.lower() for name in names}</code>
个人建议:仅当for语句、函数调用和方法调用的数量较少时使用。
Trick 2
有时,我们需要获取两个列表对象之间的所有可能组合。我们可以使用嵌套的for循环来实现,但更简洁的方法是使用itertools
提供的product
函数。示例:
<code>from itertools import product l1 = [1, 2, 3] l2 = [4, 5, 6] combinations = product(l1, l2)</code>
Trick 3
有时我们需要在一个元素列表中比较或应用一些操作,以形成相邻元素的对。这被称为“滑动窗口”。我们可以使用itertools
中的tee
函数来实现这一点。示例:
<code>from itertools import tee def window2(iterable): it, offset = tee(iter(iterable)) next(offset) return zip(it, offset) l = [1, 2, 3, 4, 5, 6] dd = window2(l) for a in dd: print(a)</code>
Trick 4
有时我们希望创建一个类来存储信息,但是如果觉得创建一个类并定义其__init__()
方法太麻烦,可以使用dataclass
。示例:
<code>from dataclasses import dataclass @dataclass class Person: name: str age: int address: str person = Person(name='John', age=12, address='Nanjing Street')</code>
dataclass
会为我们创建一个具有默认构造函数的类,该类接收相应字段的赋值,并且会自动生成特殊方法,如__str__
、__repr__
、__eq__
等。
Trick 5
有时我们希望将一个对象上的操作视为tuple上的操作。我们可以使用collections.namedtuple
实现这一点。示例:
<code>from typing import NamedTuple class Coordinate(NamedTuple): x: int y: int coordinate = Coordinate(10, 15) print(coordinate.x == coordinate[0]) # True print(coordinate.y == coordinate[1]) # True</code>
Trick 6
如果我们有一个dataclass
,需要验证输入数据是否符合类型注释,可以使用第三方软件包pydantic
。示例:
<code>from pydantic.dataclasses import dataclass @dataclass class Person: name: str age: int address: str</code>
Pydantic在运行时强制执行类型提示,并在数据无效时提供友好的错误提醒。
Trick 7
有时我们需要生成一些容器中元素频率的基本统计信息。在这种情况下,可以使用标准库中的Counter
。示例:
<code>from collections import Counter l = [1, 1, 2, 3, 4, 4] frequencies = Counter(l) print(frequencies[1]) # Output: 2 print(frequencies[2]) # Output: 1 print(frequencies[2323]) # Output: 0</code>
Counter
还提供了一些其他方法,如most_common
,用于检索最常见的元素。
Trick 8
如果我们想对两个列表中的元素对进行相应的函数处理,可以使用map
函数。示例:
<code>l1 = [1, 2, 3] l2 = [4, 5, 6] map(f, l1, l2)</code>
Trick 9
有时我们需要从一个列表中随机选择一个或多个元素,可以使用random.choice
和random.choices
。示例:
<code>from random import choice, choices l = [1, 2, 3] random_element = choice(l) l = [1, 2, 3, 4, 5] random_elements = choices(l, k=3)</code>
参数k
表示选择的元素个数。
总结
本文重点介绍了Python中9个与迭代相关的实用技巧,这些技巧可以方便地提高编程效率。
暂无评论内容