关于for循环,其实质是利用被循环对象的__iter__,或者__getitem__属性接口,由可迭代对象得到迭代器。for循环就是不断调用.next(),直到最终捕获到stop。

 import requests
from collections import Iterable,Iterator class WeatherIterator(Iterator):#可迭代对象
def __init__(self,cities):
self.cities = cities
self.index = 0 def getweather(self,city):
r = requests.get(u'http://wthrcdn.etouch.cn/weather_mini?city='+city)#这是一个免费的天气api
data = r.json()['data']['forecast'][0]
return '%s:%s,%s'%(city,data['low'],data['high']) def next(self):
if self.index == len(self.cities):
raise StopIteration
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) for x in WeatherIterable([u'北京',u'上海',u'广州',u'长春']):
print x

先是利用内置的iterator创建一个新的包含next的可迭代对象,然后再创建一个迭代器(这个迭代器调用了可迭代对象)。调用的时候直接使用迭代器(使用其__iter__的接口)就可以了,而且达到一个用时访问的功能。

 #coding:utf-8
class PrimeNumbers(object):
def __init__(self,start,end):
self.end = end
self.start = start def isPrimeNumber(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.isPrimeNumber(k):
yield k #利用生成器对象来完成迭代 for i in PrimeNumbers(1,20):
print i

利用yield生成器来实现__iter__(可迭代),因为yield的本质可以说是return 和 next的合体(暂时这样理解)

对list的反序操作,就是list.reverse(),可以得到反序的list,但是这样就是对list进行了操作,原有的顺序改变了。

而list[::-1],是产生一个新的,反序的list,可能会浪费内存。

所以最好的方法是,去实现list.__reversed__的方法。(正向迭代,就是实现__iter__;反向迭代,就是实现__reversed__)。

使用itertools.islice可以对迭代器进行切片操作,islice(iter,[start,]end[,step]),不过对迭代对象进行切片操作后,迭代对象的指针会停留在切片的停止的地方,所以如果想要再次用,需要重新申请迭代对象。

关于处理多个迭代对象,并行(同时迭代),用zip函数,zip(*seq),会返回最短那个迭代对象长度的,由每个迭代对象各个元素组成的子tuple组成的list(ps:用itertools.izip()可以返回iter);串行(一个接着一个),用itertools.chain,chain(*iter),直接将所有迭代对象接起来。

注意,所有for对iter的操作,都会使iter的指针去到结尾,需要重新申请迭代对象才能使用。(也就是重新做一个迭代器,或者说在第一次使用时将迭代器list化)

总的来说,迭代器就只能用一次。然后针对不同的迭代对象,有不同的重置方法,如file操作中的fetch()。

Python168的学习笔记2的更多相关文章

  1. Python168的学习笔记8

    #coding:utf8 #斐波那契数列,第三项起,每一项都等于前两项之和 def memo(func): cache = {}#闭包 def wrap(*args): if args not in ...

  2. Python168的学习笔记7

    关于多线程操作. 对于IO操作,如访问网站,写入磁盘这种需要时间等待响应的操作,多个cpu也几乎不能提高效率. 对于CPU密集型操作,如这个格式转换,可以通过多个cpu同时去进行. 但是对于pytho ...

  3. Python168的学习笔记6

    如何派生内置不可变类型并修改实例化行为. 个人理解,如何派生出自己想要的类. class IntTuple(tuple): def __new__(cls,iterable): g = (x for ...

  4. Python168的学习笔记5

    关于对csv文件的操作. python标准库中有csv的库,使用非常方便. import csv with open('pingan.csv','rb') as rf: reader = csv.re ...

  5. Python168的学习笔记4

    关于普通文本文件的读写 python2.7中,未注明的字符都是以acsii来编码的,而要让字符能够通用,必须声明为unicode. s=u'你好',s.encode('utf8')就是指用utf8来进 ...

  6. Python168的学习笔记3

    list.extend(),可以拓展list,a=(0,1),b=(2,3) a.extend(b),a就变成(0,1,2,3) 分割字符串(除去字符串中的,\/;之类的),如果用str.split( ...

  7. Python168的学习笔记1

    在对list的条件选择有两种常用方法,直接使用filter函数,就是filter(func,sequence);另外一种就是迭代操作,类似 x for x in sequence func.这两种方法 ...

  8. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  9. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

随机推荐

  1. torch.nn.CrossEntropyLoss

    class torch.nn.CrossEntropyLoss(weight=None, size_average=True, ignore_index=-100, reduce=True) 我这里没 ...

  2. 我所知道的MVVM框架(转 司徒大大 )

    RubyLouvre commented on 6 Sep 2014   avalon http://avalonjs.github.io/ (使用Object.defineProperties. V ...

  3. HDU 6057 Kanade's convolution

    题目链接:HDU-6057 题意: 思路:先按照官方题解推导出下面的式子: 现在唯一的问题就是怎么解决[bit(x)-bit(y)=bit(k)]的问题. 我们定义\( F(A,k)_{i}=\lef ...

  4. docker centos:last 开启sshd 遇到的证书问题

    启动sshd: # /usr/sbin/sshd 一.问题描述 这时报以下错误: [root@ xxx/]# /usr/sbin/sshd Could not load host key: /etc/ ...

  5. cve-2010-3333 Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 分析

    用的是泉哥的POC来调的这个漏洞 0x0 漏洞调试    Microsoft Office Open XML文件格式转换器栈缓冲区溢出漏洞 Microsoft Office 是微软发布的非常流行的办公 ...

  6. PHP array_diff 计算数组的差集

    array_diff (PHP 4 >= 4.0.1, PHP 5) array_diff — 计算数组的差集 说明 array array_diff ( array $array1 , arr ...

  7. Spark(一)Spark简介

    一.官网介绍 1 什么是Spark 官网地址:http://spark.apache.org/ Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎.Spark是UC Berkel ...

  8. 9-1 A Spy in the Metro uva1025 城市里的间谍 (DP)

    非常有价值的dp题目  也是我做的第一题dp    真的效率好高 题意:某城市的地铁是线性的 有n个车站 从左到右编号为1-n  有m1辆列车从第一站开始往右开 还有m2辆列车从第n站开始往左开  在 ...

  9. js数组乱序输出 数组乱序排列

    网上看的数组乱序输出,要么不合实际,要么代码繁琐.自己试了下,希望能给大家带来帮助. 重要思想也是Math.random*arr.length随机下标,然后删除取到的元素,继续随机下标. //将数组乱 ...

  10. NCPC 2016 October 8,2016 Artwork

    Problem A Artwork Problem ID: artwork Time limit: 4 seconds A template for an artwork is a white gri ...