python倒序函数,python迭代器详解
首先,实现可重复对象和可重复对象的方法
1.从可重复对象中获取迭代器对象。
例如,L是一个可重复的对象,而ITER(L)是一个迭代器对象。
在[1]中:l=[ 1,2,3,4 ]
在[2]中:l.__iter__
Out[2]:
在[3]中:t=ITER(L))
In [4]: t.next(
Out[4]: 1
In [5]: t.next(
Out[5]: 2
In [6]: t.next(
Out[6]: 3
In [7]: t.next(
Out[7]: 4
In [8]: t.next(
请参考。
静态跟踪(mostrecentcalllast))。
回车())。
- 1 t.next()).
停止标识:
对于l中的x:
打印x
for循环的工作流程是ITER(L)先获取一个T,然后一个接一个地调用t.nex,捕捉StopIteration,结束迭代。
#直接调用以下函数的方法在数据量较大的情况下对网络IO要求较高,所以也可以采用迭代器的方法。
defGetweather(城市) :
r=requests . get(u http://wthr cdn.etouch.cn/weather _迷你?city= city)
data=r.json()(数据))(预测))0))).
返回“%s:%s,% s“%(city,data[low],data[high])))))).)
打印网关(北京))。
返回值:
北京:低温13,高温28
实现iterator对象的天气迭代器,下一个方法每次返回城市温度。
实现一个可重复的对象WeaiterrIterable,迭代器方法返回一个迭代器对象。
#-*-编码:utf-8-*-
导入请求
从集合导入可迭代的,迭代器
Classweatheriterator(迭代器):
def __init__(self,cities):
self.cities=城市
self.index=0
defGetweather(自己,城市) :
r=requests . get(u http://wthr cdn.etouch.cn/weather _迷你?city= city)
data=r.json()(数据))(预测))0))).
返回“%s:%s,% s“%(city,data[low],data[high])))))).)
defnext(self):
ifself.index==Len(self.cities):
提升停止迭代
city=self . city[self . index]
self.index=1
return self.getWeather(城市)
classweatheriterable(iterable):
def __init__(self,cities):
self.cities=城市
def __iter__(self):
returnweatheriater(self . cities).
Xinweatheriterable ([U 北京,U 上海,U 广州,U 深圳]):
printx.encode(utf-8).
输出:
北京:低温13,高温28
上海:低温14,高温22
广州:低温17,高温23
深圳:低温18,高温24
第二,利用生成器函数实现可重复对象
1.实现一类可重复对象,可以重复给定范围内的所有素数。
素数定义为大于1的自然数,不再有1等因子的数称为素数。
带yield的函数是生成器。与普通的函数不同,生成器看起来像一个函数调用,但函数代码在正确之前不会被执行。
它调用next () (next()将在for循环中自动调用)。虽然执行流还是按照函数流执行,但是每执行一条yield语句就会被中断,返回一个迭代值。下一次执行将从下一个yield语句继续。看起来好像一个函数在正常执行过程中被yield中断了几次,每次中断都会通过yield返回当前的迭代值。
类别质数:
def __init__(self,start,end):
self.start=开始
self.end=结束
def isPrimeNum(self,k):
如果k 2:
返回False
对于xrange(2,k)中的I:
如果k % i==0:
返回False
返回True
def __iter__(self):
对于xrange中的k(self . start,self.end 1):
if self.isPrimeNum(k):
产量k
对于素数(1,10)中的x:
打印x
输出:
2
三
五
七
第三,实现反向迭代。
1.反向迭代。
比如实现一个浮点数生成器FloatRange(类似于xrange)根据给定的范围(开始,结束)和步长值(步长)生成一系列连续的浮点数。例如,迭代FloatRange(3.0,4.0,0.2)可以生成一个序列:
正向:3.0-3.2-3.4-3.6-3.8-4.0
反向:4.0-3.8-3.6-3.4-3.2-3.0
浮动等级:
def __init__(self,start,end,step=0.1):
self.start=开始
self.end=结束
self.step=步骤
def __iter__(self):
t=自我启动
while round(t,14)=round(self.end,14):
产量测试
t=t自我步骤
def __reversed__(自身):
t=自我. end
while round(t,14)=round(self.start,14):
产量测试
t=t -自我.步
对于反转的x(float range(3.0,4.0,0.2)):
打印x
输出:
4.0
3.8
3.6
3.4
3.2
3.0
对于浮点型(3.0,4.0,0.2)中的x:
打印x
输出:
3.0
3.2
3.4
3.6
3.8
4.0
上面的代码使用round函数是因为浮点数比较有精度问题,所以需要四舍五入。
2.切片迭代器
比如你有一个文本文件,想读取某个范围的内容,比如100到300行之间的内容,而文本文件在python中是一个迭代对象,是否可以用类似列表切片的方式得到一个100-300行的文件内容生成器?
使用标准库中的itertools.islice,它可以返回迭代对象切片的生成器。
f=打开(/var/log/dmesg )
从itertools导入islice
#将文件内容分割为100到300行,它返回一个生成器对象。默认直径为1。
伊斯利斯(100,300荷兰盾)
#前500行内容
伊斯利斯(500荷兰盾)
# 100行结束内容
伊斯利斯(f,100,无)
Ps:每次使用islice都要重新申请对象,这样会消耗掉原来迭代的对象。
四。迭代多个对象
1.在for语句中迭代多个可迭代对象
1.一类学生的语文、数学、英语的考试成绩分别存储在三个列表中,同时迭代三个列表,计算三个学生的总成绩(并行)。
2.某年级有四个班。某次考试各班英语成绩存储在四个列表中,依次迭代每个列表,统计全学年英语成绩高于90分的人数(连载)
解决方案:
并行性:使用内置函数zip,可以合并多个迭代对象,每次迭代返回一个元组。
从随机导入randint
chinese=[randint(60,100) for _ in xrange(40)]
math=[randint(60,100) for _ in xrange(40)]
english=[randint(60,100) for _ in xrange(40)]
总计=[]
对于zip中的c、m、e(中文、数学、英语):
总计.追加(c m e)
打印总计
输出:
[204, 227, 238, 201, 227, 205, 251, 274, 210, 242, 220, 239, 237, 207, 230, 267, 263, 240, 247, 249, 255, 268, 209, 270, 259, 251, 245, 262, 234, 221, 236, 250, 251, 249, 242, 255, 232, 272, 237, 253]
标准库中的Serial: itertools.chain可以连接多个迭代对象。
从随机导入randint
从itertools导入链
class1=[randint(60,100) for _ in xrange(40)]
class2=[randint(60,100) for _ in xrange(42)]
class3=[randint(60,100) for _ in xrange(39)]
[randint(60,100) for _ in xrange(43)]
计数=0
对于链中的(类别1、类别2、类别3、类别4):
如果s 90:
计数=计数1
打印计数
输出:
38
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。