首页 > 解决方案 > 来自 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()

标签: pythonitertoolstee

解决方案


迭代器在 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)

推荐阅读