反向迭代和正向迭代
zero, one, two, three, fous, five, six, seven, eight, nine = range(10) """ Author:Cairo """ # 反向迭代器 # list1 = [3.0,3.2,3.4,3.6,3.8,4.0] # # print(reversed(list1)) # # for i in reversed(list1): # # print(i) class _Iter_(): def __init__(self,start,end,sted): self.start = start self.end = end self.sted = sted def __reversed__(self): t = self.start while t >= self.end: yield t t+=self.sted def __iter__(self): t = self.start while t<= self.end: yield t t -=self.sted for x in reversed(range(1,20,2)): print(x)
如何在一个for循环中迭代多个对象
zero, one, two, three, fous, five, six, seven, eight, nine = range(10) """ Author:Cairo """ ''' 1、某班学生期末考试成绩,语文,数学,英语,分别存储在3个列表中, 同时迭代三个列表,计算每个学生的总分(并行) 2、某班级有4个班,某次考试每班英语的成绩分别存储在4个列表中, 依次迭代每个列表,统计全学年成绩高于90分人数(串行) ''' from random import randint from itertools import chain #用列表解析做出学生成绩 math = [randint(60,100) for _ in range(40)] englinh = [randint(60,100) for _ in range(40)] numberl = [randint(60,100) for _ in range(40)] # 1.可以使用: # for i in len(math): # math[i]+englinth[i]+munberl[i] # 这样也是可以的,但是有一定的局限性 # 解决方案:并行,使用内置函数zip,它能将多个可迭代对象合并,每次迭代返回一个元组。 # 串行,使用标准库中的itertools.chain,它能将多个可迭代对象链接。 total = [] for c,m,e in zip(math,englinh,numberl): total.append(c+m+e) print(total) e1 = [randint(60,100) for _ in range(50)] e2 = [randint(60,100) for _ in range(45)] e3 = [randint(60,100) for _ in range(43)] e4 = [randint(60,100) for _ in range(43)] count = 0 for s in chain(e1,e2,e3,e4): if s>=90: count += 1 print(count)
如何对迭代器做成切片
zero, one, two, three, fous, five, six, seven, eight, nine = range(10) """ Author:Cairo """ ''' 实际案例: 有某一个文本文件,我们想读取其中范围内的内容 如100-300行之间的内容,Python中文本四可迭代 对象,我们是否可以使用类似列表切片的方式得到一个100-300 行文件内容的生成器? 注意:他可以先全部逐行读取然后在进行切片,不过这样的话很浪费空间,如果内容很大很大的话,可能会导致空间不足 ''' ''' 解决方案:使用标准库中的itertools.islice,它能返回一个迭代对象切片的生成器 ''' from itertools import islice ''' :islice:使用:islice(可迭代对象,开始值,停止值,步长) ''' # f = open()#文件 # islice(f,100,300(None从一百开始到最后))#文件切片得到一个地址 ##注意:这样的话,它就会消耗掉了f这里面的100-300行的数据,如果需要从头开始,得需要重新申请一个 # 比如: l = list(range(1,20)) for x in islice(l,5,10): print(x)##这样他截取到的数据是[6,7,8,9,10],如果再用就如下面: for i in l: print(l)
抓取天气
zero, one, two, three, fous, five, six, seven, eight, nine = range(10) """ Author:Cairo """ ''' 如何实现可迭代对象和迭代器对象? 实际案例: 某软件要求,从网络抓取各个城市气温信息,并依次显示: 北京:15~20 天津:17~22 长春:12~18 如果一次抓取所有的城市天气在再显示,显示第一个城市的气温时,有很高的 延时,并且浪费存储空间。我们希望以“用时访问”的策略,并且能把所有的城 市气温封装到一个对象里,可用for语句迭代对象。 ''' ''' 解决方案: 1、实现一个迭代器对象Weatheritertor,next方法每次返回一个城市气温 2、实现一个可迭代对象Weatherrable,__iter__方法放回一个可迭代器对象 ''' import requests from collections import Iterable , Iterator # 迭代器 class WeatherIterator(Iterator): def __init__(self,cities): self.cities = cities self.index = 0 def getWeather(city): r = requests.get(u'http://wthrcdn.etouch.cn/weather_min?city=' + city) data = r.json()['data']['forecast'][0] return "%s:%s , %s" % (city, data["low"], data['high']) def next(self): if self.index == len(self.cities): raise StopIteration city = self.cities[self.index] self.index +=1 return self.getWeather(city) # 迭代对象 class WeatherIterble(Iterable): def __init__(self,cities): self.cities = cities def __iter__(self): return WeatherIterator(self.cities) for x in WeatherIterble([u'广州',u'上海',u'北京',u'长沙']): print(x)