关于迭代
定义:
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果,每一次对过程的重复称为一次迭代,而每一次的迭代得到的结果为下一次迭代的初始值
Python中的迭代
-
好处:使用迭代可以提供某种流式的操作,占用内存少,拿读文件来说:
对于一个文件而言,其操作为将文件读入内存 处理内存中的数据 释放内存关闭文件等操作
而一口气将文件读入内存,不仅耗时而且占用大量内存,所以,读一点处理一点的‘流式操作’比较好
-
迭代器对象
内部有iter()方法,对象的iter函数经调用之后会返回一个迭代器,里面包含具体数据获取的实现。 -
可迭代的对象
含有next方法或者next()方法,每次返回一个迭代的值,在正确范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代。 -
生成器生成可迭代对象
生成器:含有yeild的语句,生产期类似于迭代器,在某些类中,实现iter()函数,其中返回yeild,就就是一个可迭代对象
反向迭代
实现__reversed__()方法
class test(object):
def __init__(self,start,end,step = 0.1):
self.start = start
self.end = end
self.step = step
def __iter__(self):
i = self.start
while i <= self.end:
yield i
i = i+self.step
def __reversed__(self):
i = self.end
while i >= self.start:
yield i
i = i-self.step
_test1 = test(1.0,4.0,0.2)
_test2 = test(1.0,4.0,0.5)
for i in _test1:
print(i,end=',')
print("")
for i in reversed(_test2):
print(i,end=',')
对迭代器切片
使用itertools下的islice方法
from itertools import islice
l=range(20)
t = iter(l)
for i in islice(t,5,10):
print(i,end=",")
# 结果是5,6,7,8,9,10
for i in t:
print(i,end=",")
#结果是 11,12,13,14,15,16,17,18,19
#说明迭代之后的就消耗了,要重新迭代必须重新生成迭代器才行
可迭代对象的连接
from itertools import chain
for x in chain([1,2,3,4],['a','b','c'])
print(x,end=',')
#结果是 1,2,3,4,a,b,c
示例代码
-
使用collections模块中的Iterator和Iterable
自己生成的模块中继承Iterator ,完成next()方法完成迭代器的定义
继承Iterable,完成iter()方法,在这个方法中返回一个迭代器对象,这样,使用next或者for循环即可完成迭代的遍历示例:上网抓取城市气温情况:
from collections import Iterable,Iterator import requests #生成迭代器 class WeatherIterator(Iterator): def __init__(self,cities): self.cities = cities self.index = 0 def getweather(self,city): r = requests.get("http://wthrcdn.etouch.cn/weather_mini?city="+city) data = r.json()['data']['forecast'][1] return city+"{},{}".format(data['high'],data['low']) #print(city+"{},{}".format(data['high'],data['low'])) #关键函数 def __next__(self): if self.index == len(self.cities): raise StopIteration else: city = self.cities[self.index] self.index += 1 return self.getweather(city) #生成可迭代的对象 class WeatherIterable(Iterable): def __init__(self,cities): self.cities = cities #关键函数 def __iter__(self): return WeatherIterator(self.cities) test_weather=WeatherIterable(['北京','上海','广州','深圳','定西']) for i in test_weather: print(i)
示例:求100之内的素数,使用生成器
#-*- coding=utf-8 -*- #判断素数;除了1和它本身可以除 class test(object): def __init__(self,start,end): self.start = start self.end = end def IsPrime(self,k): if k < 2: return False else: for i in range(2,k): if k % i == 0: return False return True def __iter__(self): for i in range(self.start,self.end): if self.IsPrime(i): yield i _test = test(1,100) for i in _test: print(i,end=',')
网友评论