Python Iteration,itertools(Python迭代器,itertool个人总结)

1.迭代是什么?
首先看三个例子:

当迭代的对象是一个list对象的时候,他打印的是每一个list对象

for i in [1,2,3,4]:
    print(i)
打印的结果:
1
2
3
4

当我们迭代的对象是一个字符串的时候,他会一一打印出字符串的每一个字符

for c in ‘Python‘:
    print(c)
打印的结果是:
P
y
t
h
o
n

当我们迭代的对象是一个字典(dict)时,他会遍历他的keys

for k in {‘x‘:1,‘y‘:2}:
    print(k)
打印的结果是:
x
y
add1:(有时候我们会发现打印的结果会是:
y
x

为什么呢?
dict的存储不是按照list的方式顺序排列的,所以迭代出的结果顺序很可能不是一样的)

add2:(看到这也许会有同学问,我是否可以用迭代遍历dict的value呢?
答案是肯定的,毕竟这么强大的python,具体怎么做?look at me:

for value in {‘x‘:1,‘y‘:2}.values():
    print(value)
    打印的结果是:
    1
    2
    或者是
    ?
    ?

我想看了上面的你应该这两个问号怎么填了吧。如果还是不会填这两个问号,我劝你还是回去重新看一下这个文最

but,等等,等等,有的同学说,我还想把key和value一起遍历。可以吗?

for k,v in {‘x‘:1,‘y‘:2}.items():
    print(k,v)
    打印的结果是:
    x 1
    y 2
    或者是:
    y 2
    x 1

那么问题来了,会不会出现,key和value不匹配呢?经过我运行了成千上百次是不会的。
    为什么呢?自己思考吧。
    )

所以,可以看出的可以迭代的对象很多,list,string,tuple,dict。。。都可以作为迭代的对象

现在知道了迭代器的意思了吗?
迭代器是访问集合内元素的一种方式,迭代对象访问集合的所有元素

2.迭代器的产生
python内置函数ITER需要迭代对象并返回一个迭代器

x=iter([1,2,3])
print(next(x))
print(next(x))
print(next(x))
结果是:
<list_iterator object at 0x0000000001EA2908>
1
2
3
File "D:\Python\xode\try.py", line 6, in <module>
    print(next(x))
StopIteration

每一次调用next会访问下一个元素
当元素遍历完如果继续调用next,Python遇到这样的情况时将会抛出StopIteration异常

3.Itertools
Python内置了一个模块itertools,包含了很多函数用于creating iterators for efficient looping(创建更有效率的循环迭代器)

3.1
itertools.accumulate(iterable[, func])
返回累计的和,参数可以是任何类型,包括小数或者分数的增加,
如果提供了可选的功能参数,它应该是两个参数的函数,它将替代加法
简而言之就是:
如果一个list对象是list=[p0,p1,p2,p3,p4],那么通过itertools.accumulate()
返回的结果就是[p0,p0+p1,p0+p1+p2,p0+p1+p2+p3,p0+p1+p2+p3+p4]
例子:必须要导入itertools包

import itertools
d=[6,21,5,3,4,8,62,54,12,0]
de=iter(d)
print(list(itertools.accumulate(de)))
打印的结果是:
[6, 27, 32, 35, 39, 47, 109, 163, 175, 175]

3.2
itertools.chain(*iterables)
使返回元素从第一个直到筋疲力尽的迭代器,然后继续下一个,直到所有的可迭代对象枯竭。用于连续序列作为一个单一序列

实例:

import itertools
partlist1=‘ABC‘
partlist2=‘DEF‘
partlist3=‘GHI‘
print(list(itertools.chain(partlist1,partlist2,partlist3)))
打印的结果是:
[‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘]

itertools.chain就是把所有的list连接起来

3.3
itertools.combinations(iterable, r)
返回r长度的子序列的元素输入迭代器,组合的字典排序顺序发出,
所以如果输入迭代器进行排序,结合会产生元组排序,每个元素都是基于他们位置的独特元素,并不是按照他们的价值
所以如果输入元素是独一无二的,每个组合中都没有重复的值
例子:

import itertools
partlist1=‘1234‘
print(list(itertools.combinations(partlist1,2)))
打印的结果是:
[(‘1‘, ‘2‘), (‘1‘, ‘3‘), (‘1‘, ‘4‘), (‘2‘, ‘3‘), (‘2‘, ‘4‘), (‘3‘, ‘4‘)]

通过结果可以看出,itertools.combinations(iterable,r)的函数作用是返回各个r长度的元素,而结果元素是有
原来的list中的元素组合而成,组合的规律是原list中每个元素与其后的元素组合。

同时看一下这个函数combinations_with_replacement(‘ABCD‘, 2)
如果把上式的combinations换成combinations_with_replacement那么
打印的结果是:

[(‘1‘, ‘1‘), (‘1‘, ‘2‘), (‘1‘, ‘3‘), (‘1‘, ‘4‘), (‘2‘, ‘2‘), (‘2‘, ‘3‘), (‘2‘, ‘4‘), (‘3‘, ‘3‘), (‘3‘, ‘4‘), (‘4‘, ‘4‘)]

显然combinations_with_replacement()组合的起始位置是每一个元素自己

3.4
itertools.compress(data, selectors)
通过选择器selectors对data进行筛选,随后只返回那先经过selectors判断为true的data
实例:

import itertools
partlist1=‘1234‘
print(list(itertools.compress(partlist1,[1,1,1,0])))
结果是:
[‘1‘, ‘2‘, ‘3‘]

3.5
itertools.count(start, step)
从start开始,以后每个元素都加上step。step默认值为1。

count(10) --> 10 11 12 13 14 ...

建议大家千万别用这个函数来测试,别问我为什么,我已经重启了五次了。

3.6
itertools.cycle(iterable)
迭代至序列p的最后一个元素后,从p的第一个元素重新开始。 无限迭代
和3.5的建议一样,都是无限迭代

3.7
itertools.repeat(object[, times])
来看看第三个无限迭代的函数,将objext重复times次然后停止
实例:

import itertools
partlist1=‘1234‘
print(list(itertools.repeat(partlist1,2)))
运行结果是:
[‘1234‘, ‘1234‘]

3.8
itertools.dropwhile(predicate, iterable)/itertools.takewhile(predicate, iterable)
从函数的名字就可以知道,predicate是判断条件,当predicate是true的时候迭代器中的参数都扔掉,一直到
predicate是false的时候,输出余下的所有内容(不在判断余下的参数)
实例:

import itertools
partlist1=[1,2,3,4,8,1]
print(list(itertools.dropwhile(lambda x:x<3,partlist1)))
结果是:
[3, 4, 8, 1]

很明显,前面的1,2都是符合x<3的,所以都被过滤掉,当参数走到3的时候,因为3不小于3,因此
函数停止,后面的参数不再判断。

3.9
itertools.filterfalse(predicate, iterable)
输出predicate为false的所有数据
一个实例:

import itertools
partlist1=[1,2,3,4,8,1]
print(list(itertools.filterfalse(lambda x:x<3,partlist1)))
输出结果是:
[3, 4, 8]

3.10
itertools.islice(iterable, start, stop[, step])
这个函数就是一个切片,我前面的博客介绍过,iterable就是要截取的对象,start开始位置
sop结束位置,最后一个为可选参数,step步长。
实例:

import itertools
partlist1=[1,2,3,4,8,1]
print(list(itertools.islice(partlist1,2,None)))
结果是:
[3, 4, 8, 1]

3.11

itertools.startmap(function,iterable)
将iterable中的参数,经过function处理,一一返回。
import itertools
print(list(itertools.starmap(pow,[(2,3),(3,2)])))
打印的结果是:
[8, 9]

3.12
itertools.tee(it,n)
返回n个迭代器it的复制迭代器。

学习Python中,大二学生,感兴趣的可以交朋友。qq:904727147

时间: 2024-10-17 07:03:32

Python Iteration,itertools(Python迭代器,itertool个人总结)的相关文章

Python标准库:迭代器Itertools

Infinite Iterators: Iterator Arguments Results Example count() start, [step] start, start+step, start+2*step, ... count(10) --> 10 11 12 13 14 ... cycle() p p0, p1, ... plast, p0, p1, ... cycle('ABCD') --> A B C D A B C D ... repeat() elem [,n] elem

Python高级特性:迭代器和生成器 -转

在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的,就要了解一下迭代器相关的知识了. 迭代器 迭代器对象要求支持迭代器协议的对象,在Python中,支持迭代器协议就是实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身:next()方法返回容器的下一个元素,在结尾时引发StopIteration异常. __iter__()和next()

python之 可迭代 迭代器 生成器

0. 1.总结 (1) iterable 可迭代(对象) 能力属性 指一个对象能够一次返回它的一个成员,for i in a_list 而不需要通过下标完成迭代. 例子包括所有序列类型(list, str, tuple), 以及 dict, file, 还包括定义了 __iter__() 或 __getitem__() 方法的类实例. iterator 迭代器 具体实现 代表数据流的对象.重复调用迭代器的 next() (python3为 __next__()) 方法将依次返回流中的项.当没有更

完全理解 Python 迭代对象、迭代器、生成器

2017/05/29 · 基础知识 · 9 评论 · 可迭代对象, 生成器, 迭代器 原文出处: liuzhijun 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网友指正. 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式

python 之 itertools模块

官方:https://yiyibooks.cn/xx/python_352/library/itertools.html 参考: https://blog.csdn.net/neweastsun/article/details/51965226 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143200162233153835cfdd1a541a18ddc15059e3d

Python的itertools模块

本章将介绍Python自建模块itertools,更多内容请参考:Python参考指南 python的自建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertools提供的几个无限迭代器: >>>import itertools >>>natuals = itertools.count(1) >>>for n in natuals: print(n) 1 2 3 ... 因为count()会创建一个无限的迭代器,所以

python高级编程之迭代器与生成器

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #迭代器与生成器 #--------------------------------------- #迭代器基于2个方法 """ next:返回容器下一个项目 __iter__:返回迭代器本身 """ #通过内建函数和序列来创建 i=iter('abc') print i.next()#a print i.next(

python高级之生成器&amp;迭代器

python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象(iterable):对象中含有__iter__()方法 迭代器(iterator):对象含有__next__()方法,并且迭代器也有__iter__()方法 生成器(generator):生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅 列表/集合/字典推导式(list,set,dict compreh

Python装饰器、迭代器&amp;生成器、re正则表达式、字符串格式化

Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########