美文网首页
关于迭代

关于迭代

作者: 侃侃看看 | 来源:发表于2017-05-28 22:49 被阅读0次

    关于迭代

    定义:

    迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果,每一次对过程的重复称为一次迭代,而每一次的迭代得到的结果为下一次迭代的初始值

    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=',')
      

    相关文章

      网友评论

          本文标题:关于迭代

          本文链接:https://www.haomeiwen.com/subject/awzhfxtx.html