• 8、如何实现可迭代对象和迭代器对象 9、如何使用生成器函数实现可迭代对象 10、如何进行反向迭代以及如何实现反向迭代 11、如何对迭代器做切片操作 12、如何在一个for语句中迭代多个可迭代对象


    8、如何实现可迭代对象和迭代器对象

    PS:注意重载Iterator方法的时候,需要和原来的方法名一样,否则创建实例时会报错

    from collections import Iterator,Iterable
    import requests,json
    
    class WeatherItertor(Iterator):
        def __init__(self,city_list):
            self.CityList = city_list
            self.indexA = 0
    
        def getWeather(self,city):
            r = requests.get('http://www.weather.com.cn/data/sk/{code}.html'.format(code=city))
            ret = json.loads(r.content.decode("utf-8"))
            #风向
            WD = ret["weatherinfo"]["WD"]
            #城市
            city_data = ret["weatherinfo"]["city"]
            return "城市:{city},风向:{WD}".format(city=city_data,WD=WD)
    
        def __next__(self):
            if self.indexA == len(self.CityList):
                raise StopIteration
            city = self.CityList[self.indexA]
            self.indexA += 1
            return  self.getWeather(city)
    
    
    class WeatherIterable(Iterable):
        def __init__(self,city_list):
            self.CityList =city_list
    
        def __iter__(self):
            return WeatherItertor(self.CityList)
    
    
    
    # citys = {'北京':101010100,'朝阳':101010300,'顺义':101010400,'怀柔':101010500}
    citys_list = [101010100,101010300,101010400,101010500]
    ret = WeatherIterable(citys_list)
    
    
    
    for x in ret:
        print(x)


    result:

    C:Python35-32python.exe C:/laoni/PycharmProjects/TEXT/aa.py
    城市:北京,风向:东南风
    城市:朝阳,风向:南风
    城市:顺义,风向:南风
    城市:怀柔,风向:西南风

    9、如何使用生成器函数实现可迭代对象

    函数里有yield关键是,则是生成器,生成器内置有__iter__方法,只不过调用__iter__返回的是生成器本身,利用这一特性,可以创建一个可迭代对象的类。

    class PrimeNum():
        def __init__(self,start,end):
            self.start = start
            self.end = end
    
    
        def aa_bb(self,x):
            if x % 2 ==0:
                ret = "这是一个偶数:{info}".format(info=x)
            elif x % 2 !=0:
                ret = "这是一个奇数:{info}".format(info=x)
            else:
                pass
            return ret
    
        def __iter__(self):
            for x in range(self.start,self.end):
                p = self.aa_bb(x)
                yield p
    
    for x in PrimeNum(1,8):
        print(x)
    
    
    result:
    这是一个奇数:1
    这是一个偶数:2
    这是一个奇数:3
    这是一个偶数:4
    这是一个奇数:5
    这是一个偶数:6
    这是一个奇数:7

    10、如何进行反向迭代以及如何实现反向迭代

     

    正向的可以使用iter函数获取正向的迭代器,reversed函数可以获取反向的迭代器,使用reversed的前提是对象本身具有__reversed__方法

    class FloatRange():
        def __init__(self,start,end,step=0.2):
            self.start =start
            self.end = end
            self.step = step
    
        def __iter__(self):
            t = self.start
            while t <= self.end:
                yield t
                t += self.step
    
        def __reversed__(self):
            t = self.end
            while t >= self.start:
                yield t
                t -= self.step
    
    
    for x in reversed(FloatRange(1,4)):
        print(x)
    
    结果:
    4
    3.8
    3.5999999999999996
    3.3999999999999995
    3.1999999999999993
    2.999999999999999
    2.799999999999999
    2.5999999999999988
    2.3999999999999986
    2.1999999999999984
    1.9999999999999984
    1.7999999999999985
    1.5999999999999985
    1.3999999999999986
    1.1999999999999986

    11、如何对迭代器做切片操作

     

    通过readlines方法可以获取到,

    f = open('H2','r')
    print(f)
    ret = f.readlines()
    print(ret[1:3])
    
    result:
    <_io.TextIOWrapper name='H2' mode='r' encoding='cp936'>
    ['        log 127.0.0.1 local2
    ', '        daemon
    ']

    使用itertools.islice

    from itertools import islice
    
    f = open('H2','r')
    #获取第10到第20行
    info = islice(f,10,20)
    print(info)
    for x in info:
        print(x)
    #获取开始到第二十行
    info2 = islice(f,30)
    #获取第四十行到结尾
    info3 = islice(f,40,None)
    
    retsult:
    
    
    <itertools.islice object at 0x01803F00>
            timeout server 50000ms
    
            option  dontlognull
    
    listen scats :8888
    
            stats enable
    
            stats uri     /admin
    
            stats auth     admin:1234
    
    
    
    frontend oldboy.org
    
            bind 0.0.0.0:80
    
            option httplog

    12、如何在一个for语句中迭代多个可迭代对象

     

    from random import randint
    from itertools import chain
    
    
    #并行
    Chinese = [randint(40,100) for x in range(10)]
    Math = [randint(50,100) for x in range(10)]
    English = [randint(60,100) for x in range(10)]
    print(Chinese,Math,English)
    result = []
    for C,M,E in zip(Chinese,Math,English):
        ret = C + M + E
        result.append(ret)
    
    print(result)
    
    
    #串行
    class_one = [randint(40,100) for x in range(6)]
    class_two = [randint(50,100) for x in range(8)]
    class_three = [randint(60,100) for x in range(9)]
    chin = 0
    for x in chain(class_one,class_two,class_three):
        if x >= 90:
            chin += 1
    
    print(chin)
  • 相关阅读:
    包含游标、数组的例子
    团队开发的注意点
    养成逻辑的习惯
    C# DEV 右键出现菜单
    C#中ToString数据类型格式大全 千分符(转)
    Oracle系统查询的语句
    PLSQLDevelop 查询当前未完成的会话
    Oracle 异常工作中出现的
    Oracle 返回结果集 sys_refcursor
    DevExpress.XtraEditors.TextEdit,设定为必须number类型的。
  • 原文地址:https://www.cnblogs.com/laonicc/p/6751839.html
Copyright © 2020-2023  润新知