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)
原文地址:https://www.cnblogs.com/laonicc/p/6751839.html