python - 来自 itertools 库的 tee() 函数
问题描述
这是一个从列表中获取最小值、最大值和平均值的简单示例。下面的两个函数具有相同的结果。我想知道这两个函数的区别。为什么要使用itertools.tee()
?它提供了什么优势?
from statistics import median
from itertools import tee
purchases = [1, 2, 3, 4, 5]
def process_purchases(purchases):
min_, max_, avg = tee(purchases, 3)
return min(min_), max(max_), median(avg)
def _process_purchases(purchases):
return min(purchases), max(purchases), median(purchases)
def main():
stats = process_purchases(purchases=purchases)
print("Result:", stats)
stats = _process_purchases(purchases=purchases)
print("Result:", stats)
if __name__ == '__main__':
main()
解决方案
迭代器在 python 中只能迭代一次。之后,它们“筋疲力尽”并且不会返回更多值。
map()
您可以在、和许多其他函数zip()
中看到这一点:filter()
purchases = [1, 2, 3, 4, 5]
double = map(lambda n: n*2, purchases)
print(list(double))
# [2, 4, 6, 8, 10]
print(list(double))
# [] <-- can't use it twice
如果您将迭代器传递给两个函数,您可以看到它们之间的区别,例如返回值 from map()
。在这种情况下_process_purchases()
失败,因为耗尽了迭代器并且没有为andmin()
留下任何值。max()
median()
tee()
接受一个迭代器并为您提供两个或更多,允许您多次使用传递给函数的迭代器:
from itertools import tee
from statistics import median
purchases = [1, 2, 3, 4, 5]
def process_purchases(purchases):
min_, max_, avg = tee(purchases, 3)
return min(min_), max(max_), median(avg)
def _process_purchases(purchases):
return min(purchases), max(purchases), median(purchases)
double = map(lambda n: n*2, purchases)
_process_purchases(double)
# ValueError: max() arg is an empty sequence
double = map(lambda n: n*2, purchases)
process_purchases(double)
# (2, 10, 6)
推荐阅读
- html - 仅保留主页的 HTML 标头
- firefox - 量角器:Firefox 浏览器打开,但网站无法访问
- r - 如何一次将数据聚合到不同的值
- java - System.out.println() 总是显示类而不是值
- azure-devops - 从 Azure DevOps Pipeline 祖父 Pipeline 下载工件
- node.js - 如果在猫鼬中使用聚合和 $lookup,如何过滤?
- reactjs - 为什么我的应用程序在桌面上的性能非常好,但在使用 ReactJs 的手机上却搞砸了?
- android - 如何解决“发现现有项目依赖项不一致”的问题?
- linkchecker - 免费文件托管 URL 检查器
- python - 我如何获得图像的原始分辨率,就像我在 python 之外正常打开它时一样