關(guān)于迭代
定義:
迭代是重復(fù)反饋過程的活動,其目的通常是為了逼近所需目標或結(jié)果,每一次對過程的重復(fù)稱為一次迭代,而每一次的迭代得到的結(jié)果為下一次迭代的初始值
Python中的迭代
-
好處:使用迭代可以提供某種流式的操作,占用內(nèi)存少,拿讀文件來說:
對于一個文件而言,其操作為將文件讀入內(nèi)存 處理內(nèi)存中的數(shù)據(jù) 釋放內(nèi)存關(guān)閉文件等操作
而一口氣將文件讀入內(nèi)存,不僅耗時而且占用大量內(nèi)存,所以,讀一點處理一點的‘流式操作’比較好
迭代器對象
內(nèi)部有iter()方法,對象的iter函數(shù)經(jīng)調(diào)用之后會返回一個迭代器,里面包含具體數(shù)據(jù)獲取的實現(xiàn)。可迭代的對象
含有next方法或者next()方法,每次返回一個迭代的值,在正確范圍內(nèi)返回期待的數(shù)據(jù)以及超出范圍后能夠拋出StopIteration的錯誤停止迭代。生成器生成可迭代對象
生成器:含有yeild的語句,生產(chǎn)期類似于迭代器,在某些類中,實現(xiàn)iter()函數(shù),其中返回yeild,就就是一個可迭代對象
反向迭代
實現(xiàn)__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=",")
# 結(jié)果是5,6,7,8,9,10
for i in t:
print(i,end=",")
#結(jié)果是 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=',')
#結(jié)果是 1,2,3,4,a,b,c
示例代碼
-
使用collections模塊中的Iterator和Iterable
自己生成的模塊中繼承Iterator ,完成next()方法完成迭代器的定義
繼承Iterable,完成iter()方法,在這個方法中返回一個迭代器對象,這樣,使用next或者for循環(huán)即可完成迭代的遍歷示例:上網(wǎng)抓取城市氣溫情況:
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'])) #關(guān)鍵函數(shù) 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 #關(guān)鍵函數(shù) def __iter__(self): return WeatherIterator(self.cities) test_weather=WeatherIterable(['北京','上海','廣州','深圳','定西']) for i in test_weather: print(i)
示例:求100之內(nèi)的素數(shù),使用生成器
#-*- coding=utf-8 -*- #判斷素數(shù);除了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=',')