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. 整体架构图 ...
随机推荐
- Linux下编译安装qemu和libvirt【转】
转自:http://www.cnblogs.com/findumars/p/5679742.html 目录 [hide] 1 安装qemu 1.1 qemu介绍 1.2 下载源文件 1.3 编译安装 ...
- Redis相关链接
Redis 教程 http://www.runoob.com/redis/redis-data-types.html Python操作redis学习系列之(集合)set,redis set详解 (六) ...
- 获取SQL Server的版本信息
微软 SQL Server 版本号 产品名称 发行日期 主版本号 正式版 SP1 SP2 SP3 SP4 SQL Server 2016 2016.06.01 13.00.1601.5 13.00.1 ...
- manacher模板
转自:http://blog.csdn.net/zzkksunboy/article/details/72600679 作用 线性时间解决最长回文子串问题. 思想 Manacher充分利用了回文的性质 ...
- **汇总CodeIgniter(CI)的数据库操作函数
//查询: $query = $this->db_query("SELECT * FROM table"); ================================ ...
- CCF CSP 201512-2 消除类游戏
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201512-2 消除类游戏 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行 ...
- Java去重字符串的两种方法以及java中冒号的使用
package com.removesamestring; import java.io.BufferedWriter; import java.util.ArrayList; import java ...
- Ionic Js九:列表操作
列表是一个应用广泛在几乎所有移动app中的界面元素.ionList 和 ionItem 这两个指令还支持多种多样的交互模式,比如移除其中的某一项,拖动重新排序,滑动编辑等等. <ion-list ...
- js javascript 原型链详解
看了许多大神的博文,才少许明白了js 中原型链的概念,下面给大家浅谈一下,顺便也是为了巩固自己 首先看原型链之前先来了解一下new关键字的作用,在许多高级语言中,new是必不可少的关键字,其作用是为了 ...
- nginx启动 [emerg] 12180#12948: invalid number of arguments in "root" directive in D:
注意空格和中文符号 修改了就可以了. 还要注意最后需要加分号; https://blog.csdn.net/rodulf/article/details/53557278