itertools:无限与有限迭代器
使用 count、cycle、islice、chain 和 zip_longest。
itertools:无限与有限迭代器 是 CoddyKit 上的免费 Python Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
什么是 itertools?
itertools 是标准库模块,提供节省内存的迭代器构建工具。所有函数都返回迭代器,而不是列表。
import itertools
# count: infinite counter
for i in itertools.islice(itertools.count(10, 2), 5):
print(i, end=" ") # 10 12 14 16 18count()
count(start, step) 会生成无限的等差数列。请始终将它与 islice 或终止条件配合使用。
import itertools
for n in itertools.count(1, 10):
if n > 40:
break
print(n, end=" ") # 1 11 21 31 41cycle()
cycle(iterable) 会无限重复该可迭代对象。
import itertools
colors = itertools.cycle(["red","green","blue"])
for _ in range(7):
print(next(colors), end=" ")
# red green blue red green blue redrepeat()
repeat(value, times) 会生成相同的值 times 次;如果省略该参数,则会无限生成。
import itertools
print(list(itertools.repeat(42, 4))) # [42, 42, 42, 42]
print(list(map(pow, range(5), itertools.repeat(2))))
# [0, 1, 4, 9, 16]islice()
islice(it, stop) 或 islice(it, start, stop, step) 可以对迭代器进行切片,而无需将其一次性生成到内存中。
import itertools
result = list(itertools.islice(range(100), 2, 10, 2))
print(result) # [2, 4, 6, 8]chain()
chain(*iterables) 会将多个可迭代对象首尾相接,组合成一个迭代器。
import itertools
result = list(itertools.chain([1,2], [3,4], [5]))
print(result) # [1, 2, 3, 4, 5]
# chain.from_iterable for a list of iterables:
nested = [[1,2],[3,4]]
print(list(itertools.chain.from_iterable(nested)))zip_longest()
zip_longest 可以合并长度不同的可迭代对象,并使用 fillvalue 填充缺失的值。
import itertools
a = [1, 2, 3]
b = ["a", "b"]
print(list(itertools.zip_longest(a, b, fillvalue=0)))
# [(1, "a"), (2, "b"), (3, 0)]dropwhile() 和 takewhile()
takewhile(pred, it) 会在谓词为真时生成元素。dropwhile 的行为则相反。
import itertools
nums = [1, 3, 5, 6, 7, 9]
print(list(itertools.takewhile(lambda x: x % 2, nums)))
# [1, 3, 5]
print(list(itertools.dropwhile(lambda x: x % 2, nums)))
# [6, 7, 9]filterfalse()
filterfalse(pred, it) 会生成谓词为 False 的元素,也就是 filter() 的补集。
import itertools
evens = list(itertools.filterfalse(lambda x: x%2, range(10)))
print(evens) # [0, 2, 4, 6, 8]starmap()
starmap(func, iterable) 会将可迭代对象中的每个参数元组传递给函数进行处理。
import itertools, operator
pairs = [(2,3),(4,5),(1,10)]
result = list(itertools.starmap(operator.mul, pairs))
print(result) # [6, 20, 10]groupby()
groupby(it, key) 会将键值相同的连续元素分组。为了正确分组,请先对可迭代对象排序。
import itertools
data = sorted([("a",1),("b",2),("a",3)], key=lambda x:x[0])
for key, group in itertools.groupby(data, key=lambda x:x[0]):
print(key, list(group))快速检查
itertools.chain([1,2], [3,4]) 会生成什么?
复习
itertools 提供无限迭代器(count、cycle、repeat)、切片功能(islice)、组合功能(chain、zip_longest)和筛选功能(takewhile、dropwhile、filterfalse)。所有这些工具都是惰性的,并且节省内存。
常见问题解答
「itertools:无限与有限迭代器」课时是免费的吗?
是的 — 「itertools:无限与有限迭代器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「itertools:无限与有限迭代器」这节课中我会学到什么?
使用 count、cycle、islice、chain 和 zip_longest。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「itertools:无限与有限迭代器」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。