关于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. 【算法学习】有旋treap

    treap是平衡树的一种.与其他平衡树一样,它也能够支持插入和删除,求第k极值等,接下来我们主要探讨有旋treap的实现过程. treap中每个节点要维护其值,左右孩子以及子树大小.父亲要不要写则看你 ...

  2. mini2440的程序下载

    mini2440拿到手有四天了,抱着很大的兴趣看韦东山老师的视频,但是因为电脑是win7 64bit的系统,dnw的驱动没有,经查询可以使用supervivi,就查找相关的资料.但是始终弄不好,后来使 ...

  3. 84.VMware Tools安装——设置共享文件

    一.安装VMware Tools 1.如图所示,点击安装 2.出现如下界面,将VMwareTools-9.6.2-1688356.tar.gz安装包复制到主文件夹下 3.输入命令tar -zxvf V ...

  4. MVC 视图页对数字,金额 用逗号 隔开(数字格式化)

    cshtml页面代码: <tr> <th>@Model.BankName</th> <th>@Model.Month</th> <th ...

  5. SQL 根据关联表更新主表中字段数据

    今天遇到一个客户的数据更新问题,两个相关联的表,一个主表用于保存单据主要信息,一个副表用于保存单据的明细信息:现在要把主表的其中一个字段的数据更新到副表的一个字段中保存.精通的SQL语法的,当然是很简 ...

  6. 使用Scrapy命令行工具【导出JSON文件】时编码设置

    Windows 10家庭中文版,Python 3.6.4,virtualenv 16.0.0,Scrapy 1.5.0, 使用scrapy命令行工具建立了爬虫项目(startproject),并使用s ...

  7. 【前端vue开发】vue子调父 $emit (把子组件的数据传给父组件)

    ps:App.vue 父组件 Hello.vue 子组件 <!--App.vue :--> <template> <div id="app"> ...

  8. Vue项目实现excel导出

    1.package.json里面安装三个插件 npm install  xlsx  --save npm install  script-loader  –save-dev npm install   ...

  9. git —— 分支

    git中每一个分支相当于一个时间线 并列且相互平行 控制用指针控制~ 1.第一种创建命令: $ git branch 分支名称 —— 创建分支 $ git checkout 分支名称 —— 切换分支 ...

  10. Web 2.0应用客户端性能问题十大根源《转载》

    前言 Web 2.0应用的推广为用户带来了全新的体验,同时也让开发人员更加关注客户端性能问题.最近,资深Web性能诊断专家.知名工具dynatrace的创始人之一Andreas Grabner根据自己 ...