關(guān)于迭代

關(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=',')
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容