Python168的学习笔记2
关于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的更多相关文章
- Python168的学习笔记8
#coding:utf8 #斐波那契数列,第三项起,每一项都等于前两项之和 def memo(func): cache = {}#闭包 def wrap(*args): if args not in ...
- Python168的学习笔记7
关于多线程操作. 对于IO操作,如访问网站,写入磁盘这种需要时间等待响应的操作,多个cpu也几乎不能提高效率. 对于CPU密集型操作,如这个格式转换,可以通过多个cpu同时去进行. 但是对于pytho ...
- Python168的学习笔记6
如何派生内置不可变类型并修改实例化行为. 个人理解,如何派生出自己想要的类. class IntTuple(tuple): def __new__(cls,iterable): g = (x for ...
- Python168的学习笔记5
关于对csv文件的操作. python标准库中有csv的库,使用非常方便. import csv with open('pingan.csv','rb') as rf: reader = csv.re ...
- Python168的学习笔记4
关于普通文本文件的读写 python2.7中,未注明的字符都是以acsii来编码的,而要让字符能够通用,必须声明为unicode. s=u'你好',s.encode('utf8')就是指用utf8来进 ...
- Python168的学习笔记3
list.extend(),可以拓展list,a=(0,1),b=(2,3) a.extend(b),a就变成(0,1,2,3) 分割字符串(除去字符串中的,\/;之类的),如果用str.split( ...
- Python168的学习笔记1
在对list的条件选择有两种常用方法,直接使用filter函数,就是filter(func,sequence);另外一种就是迭代操作,类似 x for x in sequence func.这两种方法 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
随机推荐
- 触发器Demo
--mysql 触发器简单实例 --创建表1 )) ; --创建表2 )); --创建触发器,表一增加数据时,表二自动增加数据 create trigger t_afterinsert_on_tab1 ...
- css给表格每一列设置不同的样式
第一列#id table tr td:first-child{ overflow: visible; }第二列table tr td:first-child+td{color:#666;}第三列tab ...
- Mac ssh
mac的终端默认在打开一个新的tab/window的时候需要重新输入ssh的密码, 很不方便.本文完成在mac中设置,实现secureCRT/xshell里的克隆会话功能, 即新开一个terminal ...
- 缓存数据库-redis安装和配置
一:redis安装 python操作redis分为两部分,一为安装redis程序 二是安装支持python操作redis的模块 1)安装redis redis 官方网站:http://www.redi ...
- jmeter之数据库
https://www.cnblogs.com/ShadowXie/p/6007515.html
- thinkphp5高亮当前页(仅针对个人项目记录,不做通用参考)
<div class="navbg"> <ul class="menu"> <li> <a href="/& ...
- Centos中查询目录中内容命名ls
首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录, #代表用户权限 #表示超级用户,$表示普通用户: 查询目录中内容命令 ls (list缩写) ...
- oracle数据库11g(11.2.0.1)安装报错:提示ins_ctx.mk编译错误。
https://blog.csdn.net/weixin_42967330/article/details/81668404
- python开发学习-day16(Django框架初识)
s12-20160507-day16 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- React + Reflux 渲染性能优化原理
作者:ManfredHu 链接:http://www.manfredhu.com/2016/11/08/23-reactRenderingPrinciple 声明:版权所有,转载请保留本段信息,否则请 ...