Itertools 是 Python 3 标准库中最令人惊叹的之一。这个库拥有非常酷炫的函数,可以毫不夸张地说,它是 Python 编程语言的珍宝。Python 提供了优秀的 itertools 文档,但在本教程中,我们将讨论 itertools 的几个重要和有用的函数或迭代器。

关于 itertools 的关键是,该库中的函数用于创建高效且精确的代码。

在学习 Python itertools 之前,您应该了解 Python 迭代器和生成器的知识。在本文中,我们将为初学者和专业人士描述 itertools。

简介

根据 itertools 的官方定义,"此模块实现了一些受 APL、Haskell 和 SML 构造启发的迭代器构建块。" 简单来说,迭代器的数量可以共同创建'迭代代数',从而使完成复杂任务成为可能。itertools 中的函数用于生成更复杂的迭代器。让我们举个例子:Python 内置的 zip() 函数接受任意数量的可迭代参数。它遍历元组并返回它们对应的元素。

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

输出:

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

在上面的代码中,我们传递了两个列表 [1, 2, 3] 和 ['a', 'b', 'c'] 作为 zip() 函数的可迭代参数。这些列表每次返回一个元素。在 Python 中,实现了 .*iter*().*getitem*() 方法的元素称为可迭代对象。

Python 的 iter() 函数用于在可迭代对象上调用,并返回可迭代对象的迭代器对象。

a = iter('Hello')  
print(a) 

输出:

<str_iterator object at 0x01505FA0>

Python 的 zip() 函数会在其每个参数上调用 iter(),然后将结果组合成元组,并调用 next()

注意:如果您正在使用 zip() 函数和 map() 函数,这意味着您已经在使用 itertools。您不需要单独导入它。

迭代器类型

itertools 模块中有各种类型的迭代器。以下是列表:

  • 无限迭代器
  • 组合迭代器
  • 终止迭代器

无限迭代器

在 Python 中,可以实现 for 循环 的任何对象称为迭代器。列表、元组、集合、字典、字符串都是迭代器的示例,但迭代器还可以是无限的,这种类型的迭代器称为 无限迭代器

迭代器参数结果
count(start, step)start, [step]start,start+step,step+2*step
cycle()Pp0,p1,……,plast
repeat()elem [,n]elem,elem,elem,……无限次或最多 n 次
  • count(start, stop):从起始值开始打印。步骤参数是可选的,如果将值提供给 step,则会跳过步骤的数量。考虑以下示例:
import itertools  
  
for i in itertools.count(10,5):  
    if i == 50:  
        break  
    else:  
        print(i,end=" ")  

输出:

10 15 20 25 30 35 40 45
  • cycle(iterable):此迭代器按顺序打印传递的参数中的所有值。它以循环方式打印值。考虑以下示例:
import itertools  
temp = 0  
for i in itertools.cycle("123"):  
    if temp > 7:  
        break  
    else:  
        print(i,end=' ')  
        temp = temp+1  

输出:

   1 2 3 1 2 3 1 2 3 1 2

示例 - 2:使用 next() 函数

import itertools  
  
val = ['Java', 'T', 'Point']  
  
iter = itertools.cycle(val)  
  
for i in range(6):  
    # Using next function  
    print(next(iter), end = " ")  

输出:

Java T Point Java T Point
  • repeat(val, num):顾名思义,它会无限次打印传递的值。num 参数是可选的。考虑以下示例:
import itertools  
print("Printing the number repeadtly:")  
print(list(itertools.repeat(40,15)))  

输出:

[40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40]

组合迭代器:通过递归生成器简化了复杂的组合结构。排列、组合和笛卡尔积是组合结构的示例。

在 Python 中,有四种类型的组合迭代器:

  • Product() - 用于计算输入可迭代对象的笛卡尔积。在此函数中,我们使用可选的 repeat 关键字参数来计算可迭代对象与自身的乘积。repeat 关键字表示重复的次数。它以排序后的元组形式返回输出。考虑以下示例:
from itertools import product  
  
print("We are computing cartesian product using repeat Keyword Argument:")  
print(list(product([1, 2], repeat=2)))  
print()  
  
print("We are computing cartesian product of the containers:")  
print(list(product(['Java', 'T', 'point'], '5')))  
print()  
  
print("We are computing product of the containers:")  
print(list(product('CD', [4, 5])))  

输出:

Computing cartesian product using repeat Keyword Argument:
[(1, 1), (1, 2), (2, 1), (2, 2)]

Computing cartesian product of the containers:
[('Java', '5'), ('T', '5'), ('point', '5')]

Computing product of the containers:
[('C', 4), ('C', 5), ('D', 4), ('D', 5)] 
  • Permutations():用于生成可迭代对象的所有可能排列。每个元素的唯一性取决于它们的位置,而不是值。它接受两个参数,iterablegroup_size。如果 group_size 的值为 none 或未指定,则 group_size 将变为可迭代对象的长度。
from itertools import permutations  
  
print("Computing all permutation of the following list")  
print(list(permutations([3,"Python"],2)))  
print()  
  
print("Permutations of following string")  
print(list(permutations('AB')))  
print()  
  
print("Permutation of the given container is:")  
print(list(permutations(range(4),2)))  

输出:

Computing all permutation of the following list
[(3, 'Python'), ('Python', 3)]

Permutations of following string
[('A', 'B'), ('B', 'A')]

Permutation of the given container is:
[(0, 1), (0, 2), (0, 3), (1, 0), (1, 2), (1, 3), (2, 0), (2, 1), (2, 3), (3, 0), (3, 1), (3, 2)]
  • Combinations():用于按排序顺序打印容器的所有可能组合(不重复),在指定的组合大小中。
from itertools import combinations  
print("Combination of list in sorted order(without replacement)",list(combinations(['B',3],2)))  
print()  
  
print("Combination of string in sorted order",list(combinations("ZX",2)))  
print()  
  
print("Combination of list in sorted order",list(combinations(range(20),1)))  

输出:

Combination of list in sorted order(without replacement) [('B', 3)]
Combination of string in sorted order [('Z', 'X')]
Combination of list in sorted order [(0,), (1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,)]
  • Combination_with_replacement():它接受两个参数,第一个参数是长度为 r 的元组,第二个参数是重复次数。它从可迭代对象的元素中返回长度为 n 的子序列,并重复相同的过程。单独的元素可以在 combination_with_replacement() 中重复出现。
from itertools import combinations_with_replacement  
  
print("Combination of string in sorted order(with replacement) is:")  
print(list(combinations_with_replacement("XY", 3)))  
print()  
  
print("Combination of list in sorted order(with replacement) is:")  
print(list(combinations_with_replacement([4, 2], 3)))  
print()  
  
print("Combination of container in sorted order(with replacement) is:")  
print(list(combinations_with_replacement(range(3), 2)))

输出:

Combination of string in sorted order(with replacement) is:
[('X', 'X', 'X'), ('X', 'X', 'Y'), ('X', 'Y', 'Y'), ('Y', 'Y', 'Y')]

Combination of list in sorted order(with replacement) is:
[(4, 4, 4), (4, 4, 2), (4, 2, 2), (2, 2, 2)]

Combination of container in sorted order(with replacement) is:
[(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]

终止迭代器

终止迭代器通常用于处理小型输入序列,并基于迭代器中使用的方法的功能生成输出。

有不同类型的终止迭代器:

  • accumulate(iter, func):它接受两个参数,第一个参数是可迭代对象,第二个参数是一个在每次迭代时将会执行的函数。如果在 accumulate() 迭代器中未定义函数,则默认进行加法运算。输出可迭代对象取决于输入可迭代对象;如果输入可迭代对象不包含任何值,则输出可迭代对象也将为空。
import itertools  
import operator  
  
# initializing list 1  
list1 = [1, 4, 5, 7, 9, 11]  
  
# using accumulate() that will prints the successive summation of elements  
print("The sum is : ", end="")  
print(list(itertools.accumulate(list1)))  
  
# using accumulate() that will prints the successive multiplication of elements  
print("The product is : ", end="")  
print(list(itertools.accumulate(list1, operator.mul)))  
  
  
# using accumulate() that will prints the successive summation of elements  
print("The sum is : ", end="")  
print(list(itertools.accumulate(list1)))  
  
# using accumulate() that will prints the successive multiplication of elements  
print("The product is : ", end="")  
print(list(itertools.accumulate(list1, operator.mul)))  

输出:

The sum is : [1, 5, 10, 17, 26, 37]
The product is : [1, 4, 20, 140, 1260, 13860]
The sum is : [1, 5, 10, 17, 26, 37]
The product is : [1, 4, 20, 140, 1260, 13860]
  • chain(iter1, iter2):用于按顺序打印迭代器中的所有值,这些值在参数中声明。考虑以下示例:
import itertools  
  
# declaring list 1  
list1 = [1, 2, 3, 4]  
  
# declaring list 2  
list2 = [1, 5, 6, 8]  
  
# declaring list 3  
list3 = [9, 10, 11, 12]  
  
# using chain() function that will to print all elements of lists  
print("The output is : ", end="")  
print(list(itertools.chain(list1, list2, list3)))  

输出:

The output is: [1, 2, 3, 4, 1, 5, 6, 8, 9, 10, 11, 12]
  • dropwhile(func, seq):它从 func 返回 false 开始打印字符。考虑以下参数:
import itertools  
# initializing list  
list1 = [2, 4, 5, 7, 8]  
# using dropwhile() iterator that will print start displaying after condition is false  
print("The output is : ", end="")  
print(list(itertools.dropwhile(lambda x: x % 2 == 0, list1)))  

输出:

The output is  : [5, 7, 8]
  • filterfalse(func, seq):我们可以根据其名称假设它,因为此迭代器仅打印对传递的函数返回 false 的值。考虑以下示例:
import itertools  
  
# declaring list  
list1 = [12, 14, 15, 27, 28]  
  
# using filterfalse() iterator that will print false values  
print("The Output is: ", end="")  
print(list(itertools.filterfalse(lambda x: x % 2 == 0, list1)))  

输出:

The Output is : [15, 27]
  • islice(iterable, start, stop, step):它根据给定位置切片给定的可迭代对象。它依次接受四个参数,即可迭代对象、容器、起始位置和结束位置,以及步长(可选)。
import itertools  
# Declaring list  
list1 = [12, 34, 65, 73, 80, 19, 20]  
# using islice() iterator that will slice the list acc. to given argument  
# starts printing from 3nd index till 8th skipping 2  
print("The sliced list values are : ", end="")  
print(list(itertools.islice(list1, 2, 8, 2)))  

输出:

The sliced list values are : [34, 73, 19]
  • starmap(func, tuple list):它接受两个参数,第一个参数是函数,第二个参数是列表,其中的元素以元组形式出现。考虑以下示例。
import itertools  
  
# Declaring list that contain tuple as element  
list1 = [(10, 20, 15), (18, 40, 19), (53, 42, 90), (16, 12, 27)]  
  
# using starmap() iterator for selection value acc. to function  
# selects max of all tuple values  
print("The values acc. to function are : ", end="")  
print(list(itertools.starmap(max, list1)))  

输出:

The values acc. to function are : [20, 40, 90, 27]
  • takewhile(func, iterable):它是 dropwhile() 的反向操作。它会打印值,直到返回 false 条件。考虑以下示例:
import itertools  
  
# Defining a list  
list1 = [20, 42, 64, 77, 8, 10, 20]  
  
# takewhile() iterator is used  to print values till condition return false.  
print("Print until 1st false value returned : ", end="")  
print(list(itertools.takewhile(lambda x: x % 2 == 0, list1)))  

输出:

The list values until false value return : [20, 42, 64]
  • tee(iterator, count):它将容器分成多个迭代器,这些迭代器在参数中定义。考虑以下示例:
import itertools  
  
# Declaring list  
li = [1, 2, 3, 4, 5, 6, 7]  
  
# storing list in iterator  
iti = iter(li)  
# using tee() iterator to create a list of iterators  
# Creating list of 3 iterators having similar values.  
it = itertools.tee(iti, 3)  
# It will print object of iterator  
print(it)  
print("The iterators are : ")  
for i in range(0, 2):  
    print(list(it[i]))  

输出:

(<itertools._tee object at 0x01B88D88>, <itertools._tee object at 0x01B88DA8>, <itertools._tee object at 0x01B88BA8>)
The iterators are : 
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7]

总结

迭代工具(itertools)是 Python 标准库中一个非常有用的模块,提供了许多强大的函数和迭代器,可以在处理迭代任务时提供便利。在编写代码时,了解如何使用 itertools 中的各种迭代器,可以帮助您更高效地处理各种迭代任务,从而减少代码的复杂性并提高性能。这篇教程只涵盖了 itertools 中的一些基本函数,您可以根据自己的需要进一步探索和使用其他函数。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程