搜索
首页后端开发Python教程python迭代器以及itertools模块

迭代器       

      在python中,迭代器协议就是实现对象的__iter()方法和next()方法,其中前者返回对象本身,后者返回容器的下一个元素。实现了这两个方法的对象就是可迭代对象。迭代器是有惰性的,只有在使用时才会产生,这就为处理大量数据提供了好处,不同一次性把所有数据写入内存。下面自己写了一个迭代器,可以看到使用for循环可以处理自己编写的迭代器,实现了迭代器协议的对象,可以使用任何类似于for循环这样的迭代器工具。但是,看下面的输出,第二次输出为空,这是为什么呢?我们在使用list时,可以多次输出同一个对象,这和实现了自己实现了迭代器协议的对象有什么区别?

class it(object):
   def __init__(self, n):
       self.a = 0
       self.n = n

   def __iter__(self):
<br/>
       return self

   def next(self):
       if self.a < self.n:
           self.a += 1
           return self.a
       else:
           raise StopIteration

i=it(5)
for j in i:
   print j,
print ''
print '------'
for j in i:
   print j
# 1 2 3 4 5
# ------

      经过学习,得知,list等类型迭代器返回的是一个迭代器对象,不是返回了本身。那么就写了如下代码进行测试,经过打印输出可以看到,类TestIt的对象是可以反复使用的。那么又有一个问题了,没有实现next()方法的对象,还是迭代器对象吗?这是因为在使用it类时,是返回了迭代器对象的,把迭代的功能使用了it迭代器实现,也就是说相当于实现了迭代器协议。迭代器协议在python中很有用,python中有一个关于迭代器的模块itertools,下面我就学习一下itertools模块,看看有哪些惊喜!

class TestIt(object):
def __init__(self, a):
self.a = a 
def __iter__(self):
return it(self.a)

itertools

无限迭代器

1 count(),接受两个参数,第一个是开始的数字,第二个是步幅,默认从0开始,用法如下

import itertools as it

c = it.count(10, 2)
for i in c:
    if i > 20:
        break
    print i,
# 10 12 14 16 18 20

2 cycle(),接受一个参数,该参数是迭代器对象(列表,字符串等),会循环生成迭代器中的元素

c = it.cycle([1, 2, 3])
i = 1
for j in c:
    if i > 7:
        break
    print j,
    i += 1

3 repeat(),接受两个参数,用于生成第一个参数n次

for j in it.repeat([1, 2, 3], 4):
print j

有限迭代器,选取感觉自己常用的介绍下

1 chain(),接受多个迭代器对象作为参数,并把它们连接起来chain('abc', [1, 2, 3])

2 compress(data, selectors), 根据后面的参数过滤前面的参数,两个参数都需要是迭代器对象

dropwhile(pre, iterable),pre参数是一个函数,当pre(i)是Ture是,返回该项以及后面所有项

groupby(iterable[, keyfunc]),其中iterable 是一个可迭代对象,keyfunc 是分组函数,用于对 iterable 的连续项进行分组,如果不指定,则默认对 iterable 中的连续相同项进行分组,返回一个 (key, sub-iterator) 的迭代器。

ifilter(function or None, sequence),将 iterable 中 function(item) 为 True 的元素组成一个迭代器返回,如果 function 是 None,则返回 iterable 中所有计算为 True 的项

6 tee(iterable [,n]),tee 用于从 iterable 创建 n 个独立的迭代器,以元组的形式返回,n 的默认值是 2。


 for j in it.tee(&#39;abc&#39;, 4):
     print list(j)


组合生成器

permutations(iterable[, r]),用于生成一个排列,r是生成排列的元素长度,不指定则为默认长度


  list(it.permutations(  list(it.permutations(, 2


combinations(iterable, r), 求序列的组合,其中,r 指定生成组合的元素的长度,是必需的参数

3 combinations_with_replacement(iterable, r),生成的组合包含自身元素 

 print list(it.combinations_with_replacement(&#39;abc&#39;, 2))
 # [(&#39;a&#39;, &#39;a&#39;), (&#39;a&#39;, &#39;b&#39;), (&#39;a&#39;, &#39;c&#39;), (&#39;b&#39;, &#39;b&#39;), (&#39;b&#39;, &#39;c&#39;), (&#39;c&#39;, &#39;c&#39;)]

更多python迭代器以及itertools模块相关文章请关注PHP中文网!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何解决Linux终端中查看Python版本时遇到的权限问题?如何解决Linux终端中查看Python版本时遇到的权限问题?Apr 01, 2025 pm 05:09 PM

Linux终端中查看Python版本时遇到权限问题的解决方法当你在Linux终端中尝试查看Python的版本时,输入python...

我如何使用美丽的汤来解析HTML?我如何使用美丽的汤来解析HTML?Mar 10, 2025 pm 06:54 PM

本文解释了如何使用美丽的汤库来解析html。 它详细介绍了常见方法,例如find(),find_all(),select()和get_text(),以用于数据提取,处理不同的HTML结构和错误以及替代方案(SEL)

python对象的序列化和避难所化:第1部分python对象的序列化和避难所化:第1部分Mar 08, 2025 am 09:39 AM

Python 对象的序列化和反序列化是任何非平凡程序的关键方面。如果您将某些内容保存到 Python 文件中,如果您读取配置文件,或者如果您响应 HTTP 请求,您都会进行对象序列化和反序列化。 从某种意义上说,序列化和反序列化是世界上最无聊的事情。谁会在乎所有这些格式和协议?您想持久化或流式传输一些 Python 对象,并在以后完整地取回它们。 这是一种在概念层面上看待世界的好方法。但是,在实际层面上,您选择的序列化方案、格式或协议可能会决定程序运行的速度、安全性、维护状态的自由度以及与其他系

如何使用TensorFlow或Pytorch进行深度学习?如何使用TensorFlow或Pytorch进行深度学习?Mar 10, 2025 pm 06:52 PM

本文比较了Tensorflow和Pytorch的深度学习。 它详细介绍了所涉及的步骤:数据准备,模型构建,培训,评估和部署。 框架之间的关键差异,特别是关于计算刻度的

Python中的数学模块:统计Python中的数学模块:统计Mar 09, 2025 am 11:40 AM

Python的statistics模块提供强大的数据统计分析功能,帮助我们快速理解数据整体特征,例如生物统计学和商业分析等领域。无需逐个查看数据点,只需查看均值或方差等统计量,即可发现原始数据中可能被忽略的趋势和特征,并更轻松、有效地比较大型数据集。 本教程将介绍如何计算平均值和衡量数据集的离散程度。除非另有说明,本模块中的所有函数都支持使用mean()函数计算平均值,而非简单的求和平均。 也可使用浮点数。 import random import statistics from fracti

用美丽的汤在Python中刮擦网页:搜索和DOM修改用美丽的汤在Python中刮擦网页:搜索和DOM修改Mar 08, 2025 am 10:36 AM

该教程建立在先前对美丽汤的介绍基础上,重点是简单的树导航之外的DOM操纵。 我们将探索有效的搜索方法和技术,以修改HTML结构。 一种常见的DOM搜索方法是EX

如何使用Python创建命令行接口(CLI)?如何使用Python创建命令行接口(CLI)?Mar 10, 2025 pm 06:48 PM

本文指导Python开发人员构建命令行界面(CLIS)。 它使用Typer,Click和ArgParse等库详细介绍,强调输入/输出处理,并促进用户友好的设计模式,以提高CLI可用性。

哪些流行的Python库及其用途?哪些流行的Python库及其用途?Mar 21, 2025 pm 06:46 PM

本文讨论了诸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和请求等流行的Python库,并详细介绍了它们在科学计算,数据分析,可视化,机器学习,网络开发和H中的用途

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具