1、如何实现可迭代对象和迭代器对象
# /usr/bin/env python
# -*- coding:utf-8 -*-
# Author : yimi
#如何实现可迭代对象和迭代器对象
import requests
from collections import Iterable,Iterator
class WeatherIterator(Iterator):
def __init__(self,cities):
self.cities = cities
self.index = 0
def getWeather(city):
r = requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city=' + city)
data = r.json()['data']['forecast'][0]
return '%s: %s, %s' % (city,data['low'],data['high'])
# print getWeather(u'北京')
# print getWeather(u'上海')
def next(self):
if self.index == len(self.cities):
raise StopIteration
city = self.cities[self.index]
self.index += 1
return self.getWeather()
class WeatherIterable(Iterable):
def __init__(self,cities):
self.cities = cities
def __iter__(self):
return WeatherIterator(self.cities)
for x in WeatherIterable([u'北京',u'天津',u'上海',u'贵港',u'重庆']):
print(x)
2、如何使用生成器函数实现可迭代对象
class PrimeNumbers:
def __init__(self,start,end):
self.start = start
self.end = end
def isPrimeNum(self,k):
if k < 2:
return False
for i in xrange(2,k):
if k % i == 0:
return False
return True
def __iter__(self):
for k in xrange(self.start,self.end+ 1):
if self.isPrimeNum(k):
yield k
for x in PrimeNumbers(1,50):
print x
输出结果:
3、如何进行反向迭代和实现反向迭代?
class FloatRange:
#构造器
def __init__(self, start, end, step=0.1):
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.0, 4.0, 0.5)):
print(x)
输出结果:
4、如何在一个for语句中迭代多个可迭代对象
案例1
# Author : yimi
from random import randint
chinese = [randint(60,100) for x in xrange(20)]
math = [randint(60,100) for x in xrange(20)]
english = [randint(60,100) for x in xrange(20)]
print chinese
print math
print english
total = []
for c,m,e in zip(chinese,math,english):
total.append(c+m+e)
print total
输出结果
案例2
from itertools import chain
from random import randint
e1 = [randint(60,100) for x in xrange(17)]
e2 = [randint(60,100) for x in xrange(15)]
e3 = [randint(60,100) for x in xrange(18)]
e4 = [randint(60,100) for x in xrange(17)]
print e1
print e2
print e3
print e4
count = 0
for i in chain(e1,e2,e3,e4):
if i > 90:
count += 1
print count
输出结果: