美文网首页
python itertools

python itertools

作者: 小董不太懂 | 来源:发表于2019-08-20 18:24 被阅读0次

这货特别强大,所以我要深入了解一下:
itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。
使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。

  • 无限迭代器

itertools包自带了三个可以无限迭代的迭代器。这意味着,当你使用他们时,你要知道要的到底是最终会停止的迭代器,还是需要无限地迭代下去。

  1. count(初值=0, 步长=1):可以设置两个参数,第一个参数为起始点,且包含在内,第二个参数为步长,如果不设置第二个参数则默认步长为1
    count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。
    count 也可以接收指定的步长参数。
    我们来看一个简单的例子:
import itertools
for i in itertools.count(10):#从10开始,步长为1,无限迭代
    if i>20:
        break
    else:
        print(i,end=',')
print(type(i))

输出结果:

D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
10,11,12,13,14,15,16,17,18,19,20,<class 'int'>

Process finished with exit code 0
  1. islice(count(10), 5):
    从 10 开始,输出 5 个元素后结束。
    islice 的第二个参数控制何时停止迭代。
    但其含义并不是”达到数字 5 时停止“,而是”当迭代了 5 次之后停止。
import itertools
for i in itertools.islice(itertools.count(10,2),5):#从10开始,步长为2,迭代5次
    if i>20:
        break
    else:
        print(i,end=',')
print()
print(type(i))
*******************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
10,12,14,16,18,
<class 'int'>

Process finished with exit code 0
  1. cycle:无限循环,可以设置一个参数,且只接受可以迭代的参数,如列表,元组,字符串。。。,该函数会对可迭代的所有元素进行循环:
    这里我们创建了一个 for 循环使其在三个字母 XYZ 间无限循环。当然,我们并不真地想要永远循环下去,所以我们添加了一个简单的计数器来跳出循环。
import itertools
li = ['x','y','z']
count = 0
for i in itertools.cycle(li):
    print(i,end=',')
    count += 1
    if count >= 10:
        break
*****************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
x,y,z,x,y,z,x,y,z,x,
Process finished with exit code 0

因为是无限循环,所以添加了外部手段在循环十次后终止迭代

  1. repeat()可以设置两个参数,其中第一个参数要求可迭代,第二个参数为重复次数,第二个参数如不设置则无限循环,一般来说使用时都会设置第二个参数,用来满足预期重复次数后终止:
import itertools

li = ['a','b','c','d']
for i in itertools.repeat(li,6):
    print(i)
***********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']

Process finished with exit code 0
  • 可终止迭代器

  1. accumulate(可迭代对象[, 函数]),accumulate 迭代器将返回累计求和结果,或者传入两个参数的话,由传入的函数累积计算的结果。默认设定为相加。
import itertools
import operator
li = list(itertools.accumulate(range(1,10)))
print(li)

lis = list(itertools.accumulate(range(1,10),operator.mul))#乘
print(lis)
******************************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
[1, 3, 6, 10, 15, 21, 28, 36, 45]
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

Process finished with exit code 0

2 . chain(*可迭代对象)
chain 迭代器能够将多个可迭代对象合并成一个更长的可迭代对象。我有一个列表,里面已经包含一些元素,接着想把另外两个列表添加到最初那个列表中。注意,我们想添加的是两个列表的元素。最初,我是这样做的:

my_list = ['foo', 'bar']
numbers = list(range(5))
cmd = ['ls', '/some/dir']
my_list.append(cmd)
my_list.append(numbers)
print(my_list)
*****************************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
['foo', 'bar', ['ls', '/some/dir'], [0, 1, 2, 3, 4]]

Process finished with exit code 0

如果用chain来解决这个问题:

import itertools

my_list = ['foo', 'bar']
numbers = list(range(5))
cmd = ['ls', '/some/dir']
print(list(itertools.chain(my_list,numbers,cmd)))
***********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
['foo', 'bar', 0, 1, 2, 3, 4, 'ls', '/some/dir']

Process finished with exit code 0

是不是觉得chain很优雅,很装逼,也很省内存啊

  • 其他迭代器

  1. itertools.permutations(可迭代对象,每个对象需要的元素),通俗地讲,就是返回可迭代对象的所有数学全排列方式。
import itertools

li = ['a','b','c']
for i in itertools.permutations(li,3):#permutations是排列组合的意思
        print(i)
print('*'*20)
m = ['1','2','3']
for j in itertools.permutations(m,2):#permutations是排列组合的意思
        print(j)
***********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
('a', 'b', 'c')
('a', 'c', 'b')
('b', 'a', 'c')
('b', 'c', 'a')
('c', 'a', 'b')
('c', 'b', 'a')
********************
('1', '2')
('1', '3')
('2', '1')
('2', '3')
('3', '1')
('3', '2')
  1. 笛卡尔积:itertools.product(*iterables[, repeat])
    直接对自身进行笛卡尔积:
import itertools

li = ['A','B','C']
for i in itertools.product(li,repeat=2):
    print(','.join(i))
    print(type((','.join(i))))
    print(i)
    print(type(i))
**********************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
A,A
<class 'str'>
('A', 'A')
<class 'tuple'>
A,B
<class 'str'>
('A', 'B')
<class 'tuple'>
A,C
<class 'str'>
('A', 'C')
<class 'tuple'>
B,A
<class 'str'>
('B', 'A')
<class 'tuple'>
B,B
<class 'str'>
('B', 'B')
<class 'tuple'>
B,C
<class 'str'>
('B', 'C')
<class 'tuple'>
C,A
<class 'str'>
('C', 'A')
<class 'tuple'>
C,B
<class 'str'>
('C', 'B')
<class 'tuple'>
C,C
<class 'str'>
('C', 'C')
<class 'tuple'>

Process finished with exit code 0

顺便还复习了join()函数,join()函数是连接成一个新的字符串
然后笛卡尔积返回的是元祖结构,repeat也是代表返回每个元祖所含元素的个数

两个元祖笛卡尔积,两个列表笛卡尔积:

import itertools

li_1 = ['A','B','C']
li_2 = ['a','b','c']
for i in itertools.product(li_1,li_2):
    print(i)

li_3 = (1,2,3)
li_4 = (4,5,6)
for j in itertools.product(li_3,li_4):
    print(j)
*************************************************************
('A', 'a')
('A', 'b')
('A', 'c')
('B', 'a')
('B', 'b')
('B', 'c')
('C', 'a')
('C', 'b')
('C', 'c')
(1, 4)
(1, 5)
(1, 6)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)
  1. 组合
  • 组合:itertools.combinations(iterable, r)
  • 组合(包含自身重复):itertools.combinations_with_replacement(iterable, r)
import itertools

li_1 = ['A','B','C']
li_2 = ['a','b','c']
for i in itertools.combinations(li_1,2):
    print(i)
print('*'*20)
for j in itertools.combinations_with_replacement(li_2,2):
    print(j)
**********************************************************************
D:\anaconda\python.exe D:/bilibili大学/python经典习题100道/测试itertools.py
('A', 'B')
('A', 'C')
('B', 'C')
********************
('a', 'a')
('a', 'b')
('a', 'c')
('b', 'b')
('b', 'c')
('c', 'c')

Process finished with exit code 0

相关文章

  • Python itertools

    Python itertools

  • python itertools

    PYTHON-进阶-ITERTOOLS模块小结

  • Python高阶部分扩展 (collections ,iter

    Python高阶部分扩展 (collections ,itertools) python3 collection...

  • 2019-04-10

    Python中的分组函数(groupby、itertools)

  • itertools

    python 模块itertools 提供了非常有用的用于操作迭代对象的函数。 首先,我们看看itertools...

  • python itertools 模块讲解

    1、介绍 itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。 使用这...

  • Day16内建模块itertools&urllib

    itertools Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。首先,我们看看...

  • python itertools 模块讲解

    1、介绍itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。使用这些工...

  • Python itertools

    Python的内置库itertools是专门提供迭代器(iterator)和相关函数的库,虽然说Python3里面...

  • python itertools

    这货特别强大,所以我要深入了解一下:itertools 是python的迭代器模块,itertools提供的工具相...

网友评论

      本文标题:python itertools

      本文链接:https://www.haomeiwen.com/subject/ezppsctx.html