- 浏览: 241662 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (127)
- vim (3)
- python (44)
- pymysql (1)
- mysql (9)
- macvim (1)
- erlang (3)
- twisted (0)
- tornado (5)
- django (7)
- postgresql (5)
- sql (1)
- java (7)
- tech (4)
- cache (1)
- lifestyle (3)
- html (1)
- ubuntu (2)
- rabbitmq (1)
- algorithm (8)
- Linux (4)
- Pythonista (1)
- thread (1)
- sort (6)
- 设计模式 (1)
- search (1)
- Unix (6)
- Socket (3)
- C (2)
- web (1)
- gc (1)
- php (10)
- macos (1)
最新评论
-
2057:
这个程序有bug。
查找算法学习之二分查找(Python版本)——BinarySearch -
dotjar:
NB
一个Python程序员的进化[转]
迭代器
迭代器只不过是一个实现迭代器协议的容器对象。它基于两个方法:
迭代器可以通过使用一个iter内建函数和一个序列来创建,示例如下。
生成器
Python引入的与生成器相关的最后一个特性是提供了与next方法调用的代码进行交互的功能。yield将变成一个表达式,而一个值可以通过名为send的新方法来传递,如下所示。
Output:
Please tell me your problems
Don't be so negative
Don't ask yourself too much questions
A that's good, go on
send的工作机制与next一样,但是yield将变成能够返回传入的值。因而,这个函数可以根据客户端代码来改变其行为。同时,还添加了throw和close两个函数,以完成该行为。它们将向生成器抛出一个错误:
throw 允许客户端代码传入要抛出的任何类型的异常;
close的工作方式是相同的,但是将会抛出一个特定的异常——GeneratorExit,在这种情况下,生成器函数必须再次抛出GeneratorExit或StopIteration异常。
finally部分在之前的版本是不允许使用的,它将捕获任何未被捕获的clise和throw调用,是完成清理工作的推荐方式。
协同程序
协同程序是可以挂起、回复,并且有多个进入点的函数。它们可以实现协同的多任务和管道机制。例如:每个协同程序将消费或生产的数据,然后暂停,直到其他数据被传递。
在Python中,协同程序的替代者是线程,它可以实现代码块之前的交互。但是因为它们表现出一种抢先式的风格,所以必须注意资源锁,而协同程序不需要。这样的代码可能变得相当复杂,难以创建和调试。但是生成器几乎就是协同程序,添加send、throw和close其初始的意图就是为该语言提供一种类似协同程序的特性。
使用multimask模块
在协同程序之间的写作,最经典的例子是接受来自多个客户的查询,并将每个查询委托给对此作出相应的新线程的服务器应用程序。
生成器表达式
itertools模块
islice:窗口迭代器
tee:往返式的迭代器
groupby:uniq迭代器
以上内容整理于PYTHON高级编程
迭代器只不过是一个实现迭代器协议的容器对象。它基于两个方法:
- next 返回容器的写一个项目;
- __iter__ 返回迭代器本身。
迭代器可以通过使用一个iter内建函数和一个序列来创建,示例如下。
>>> i = iter('abc') >>> i.next() 'a' >>> i.next() 'b' >>> i.next() 'c' >>> i.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
引用
当序列遍历完时,将抛出一个StopIteration异常。这将使迭代器与循环兼容,因为它将捕获这个异常以停止循环。要创建定制的迭代器,可以编写一个具有next方法的类,只要该类能够提供返回迭代器实例的__iter__特殊方法。
class MyIterator(object): def __init__(self, step): self.step = step def next(self): if self.step == 0: raise StopIteration self.step -= 1 return self.step def __iter__(self): return self for el in MyIterator(4): print el
生成器
引用
生成器提供了一种出色的方法,使得需要返回一系列元素的函数所需的代码更加简单、高效。基于yield指令,可以暂停一个函数并返回中间结果。该函数将保存执行环境并且可以在必要时恢复。
#!/usr/bin/env python #-*-coding:utf-8-*- def fibonacci(): a, b = 0, 1 while True: yield b a, b = b, a + b fib = fibonacci() print [fib.next() for i in range(10)] print map(lambda x,f = lambda x,f:f(x-1,f)+f(x-2,f) if x >1 else x:f(x,f),range(10))
Python引入的与生成器相关的最后一个特性是提供了与next方法调用的代码进行交互的功能。yield将变成一个表达式,而一个值可以通过名为send的新方法来传递,如下所示。
def psychologist(): print 'Please tell me your problems' while True: answer = (yield) if answer is not None: if answer.endswith('?'): print ("Don't ask yourself too much questions") elif 'good' in answer: print "A that's good, go on" elif 'bad' in answer: print "Don't be so negative" free = psychologist() free.next() free.send('I feel bad') free.send("?") free.send("ok then i should find what is good for me")
Output:
Please tell me your problems
Don't be so negative
Don't ask yourself too much questions
A that's good, go on
send的工作机制与next一样,但是yield将变成能够返回传入的值。因而,这个函数可以根据客户端代码来改变其行为。同时,还添加了throw和close两个函数,以完成该行为。它们将向生成器抛出一个错误:
throw 允许客户端代码传入要抛出的任何类型的异常;
close的工作方式是相同的,但是将会抛出一个特定的异常——GeneratorExit,在这种情况下,生成器函数必须再次抛出GeneratorExit或StopIteration异常。
def my_generator(): try: yield 'something' except ValueError: yield 'dealing with the exception' finally: print "ok let's clean" gen = my_generator() print gen.next() print gen.throw(ValueError('mean mean mean')) gen.close() print gen.next()
finally部分在之前的版本是不允许使用的,它将捕获任何未被捕获的clise和throw调用,是完成清理工作的推荐方式。
协同程序
协同程序是可以挂起、回复,并且有多个进入点的函数。它们可以实现协同的多任务和管道机制。例如:每个协同程序将消费或生产的数据,然后暂停,直到其他数据被传递。
在Python中,协同程序的替代者是线程,它可以实现代码块之前的交互。但是因为它们表现出一种抢先式的风格,所以必须注意资源锁,而协同程序不需要。这样的代码可能变得相当复杂,难以创建和调试。但是生成器几乎就是协同程序,添加send、throw和close其初始的意图就是为该语言提供一种类似协同程序的特性。
使用multimask模块
#!/usr/bin/env python # -*- coding:utf-8 -*- import multitask def coroutine_1(): for i in range(3): print 'c1' yield i def coroutine_2(): for i in range(3): print 'c2' yield i multitask.add(coroutine_1()) multitask.add(coroutine_2()) multitask.run()
在协同程序之间的写作,最经典的例子是接受来自多个客户的查询,并将每个查询委托给对此作出相应的新线程的服务器应用程序。
#!/usr/bin/env python # -*- coding:utf-8 -*- from __future__ import with_statement from contextlib import closing import socket import multitask def client_handler(sock): while closing(sock): while True: data = (yield multitask.recv(sock, 1024)) if not data: break yield multitask.send(sock, data) def echo_server(hostname, port): addrinfo = socket.getaddrinfo(hostname, port, socket.AF_UNSPEC,socket.SOCK_STREAM) (family, socktype, proto, cannoname, sockaddr) = addrinfo[0] with closing(socket.socket(family,socktype,proto)) as sock: sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sock.bind(sockaddr) sock.listen(5) while True: multitask.add(client_handler((yield multitask.accept(sock))[0])) if __name__ == "__main__": import sys hostname = None port = 1111 if len(sys.argv) > 1: hostname = sys.argv[1] if len(sys.argv) > 2: port = int(sys.argv[2]) multitask.add(echo_server(hostname,port)) try: multitask.run() except KeyboardInterrupt: pass
生成器表达式
>>> iter = (x**2 for x in range(10) if x % 2 == 0) >>> for el in iter: ... print el … 0 4 16 36 64
itertools模块
islice:窗口迭代器
tee:往返式的迭代器
groupby:uniq迭代器
#!/usr/bin/env python #-*-coding:utf-8-*- from itertools import group by def compress(data): return ((len(list(group)),name) for name,group in groupby(data)) def decompress(data): return (car * size for size, car in data) print list(compress('get uuuuuuuuuuuuuuuup')) compressed = compress('get uuuuuuuuuuuuuuuup') print ''.join(decompress(compressed))
以上内容整理于PYTHON高级编程
发表评论
-
macos 10.9.2 clang: error: unknown argument: '-mno-fused-madd' [-Wunused-command
2014-03-25 19:13 1723方法总是有的,当然需要你去寻找。 当然如果花费太多的时间在一件 ... -
PostgreSQL psycopg2:IndexError: tuple index out of range
2014-01-09 17:04 2189Postgresql psycopg2使用like查询的时候 ... -
Python时间模块
2013-10-15 23:03 3425time模块 时间模块中最常用的一个函数就是获取当前时间的函数 ... -
Python装饰器
2013-10-15 22:59 1510编写自定义装饰器有许多方法,但最简单和最容易理解的方法是编写一 ... -
python list
2013-10-15 22:56 1213简单总结以及整理如下: >>> dir( ... -
Python Excel
2013-09-10 17:21 932安装lib easy_install xlrd def ... -
排序算法学习(python版本)之堆排序(HeapSort)
2013-07-01 22:54 1958Contains: 堆排序以及堆排序的应用 堆排序(Heaps ... -
python range xrange
2013-06-25 23:30 1104引用Help on built-in function ran ... -
python class
2013-06-25 00:54 1786引用类是创建新对象类 ... -
AttributeError: 'module' object has no attribute 'SendCloud'
2013-06-05 11:46 7018网上查了下 意思是说你命名的文件名不能和lib重名,这样会导 ... -
python string
2013-05-07 23:44 2161如果这就是字符串,这本来就是字符串 首先看下字符串的方法 ... -
Python property
2013-03-29 19:56 0由于之前有总结过,可以参考http://2057.iteye. ... -
python tips
2013-03-28 23:57 8461、enum #!/usr/bin/env python ... -
python decorators
2013-03-28 23:36 1324Contains: 1、decorators 2、funct ... -
python closures
2013-03-28 22:09 1149Closure:如果在一个内部函数里,对在外部作用域(但不是在 ... -
Python map、filter,reduce介绍
2013-03-28 22:02 12421、filter(function,iterable) 引用C ... -
Python __new__ 、__init__、 __call__
2013-03-26 23:49 5295Contains: __new__: 创建对象时调用,返回当 ... -
Python socket简介
2013-03-25 23:42 2117自豪地使用dir和help. Python 2.7.2 ( ... -
Tornado ioloop源码简析
2013-03-21 00:18 2800#!/usr/bin/env python #-*-en ... -
Tornado httpserver 源码简析
2013-03-17 01:49 1744整个流程就是创建一个socket socket.socket ...
相关推荐
14.1 迭代器生成 字符串,列表或元组对象都可用于创建迭代器 list=[1,2,3,4] it = iter(list) # 创建迭代器对象 print(next(it)) # 输出迭代器的下一个元素 print(next(it)) 14.2 迭代器遍历 list=[1,2,3,4] it =...
本文实例讲述了Python迭代器和生成器定义与用法。分享给大家供大家参考,具体如下: 迭代器 iter() 迭代器是访问集合中元素的一种方式,迭代器 object 从集合中的第一个元素开始访问,直到所有的元素被访问完成. 所以...
主要介绍了Python迭代器和生成器介绍,本文分别用代码实例讲解了Python的迭代器和生成器,需要的朋友可以参考下
一、生成器 1.1 什么是生成器 generator:一边生成一边计算后面元素的机制,称为生成器,生成器里面保存的是算法,只有需要用到才会计算后面的值 1.2 通过列表生成式创建生成器 我们可以将列表生成式的中括号改成小...
本文实例讲述了python 协程中的迭代器,生成器原理及应用。分享给大家供大家参考,具体如下: 1.迭代器理解 迭代器: 迭代器是访问可迭代对象的工具 迭代器是指用iter(obj)函数返回的对象(实例) 迭代器是指用next(it...
主要介绍了python 迭代器和生成器的相关资料,文中讲解非常细致,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
迭代器概述: 访问集合元素的一种方式。 是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退。 1. 创建迭代器对象 实例:基于list列表...
Python的迭代器和生成器怎么样?_.docx
Python3 迭代器与生成器.doc
手动创建迭代器 实现迭代协议(__iter__方法) 反向迭代(reversed方法) 迭代器切片 数据管道实现
主要给大家介绍了关于Python中可迭代对象、迭代器和生成器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
大家周末好,今天给大家带来的是Python当中生成器和迭代器的使用。 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法。对于获取数据的方法而言,我们会一种就足够了。但是...
主要介绍了Python迭代器iterator生成器generator使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
python学习笔记,包含迭代器-生成器-with语句和上下文管理器-修饰符
第一次写的文章 Python2.5中的迭代器与生成器
全国计算机等级考试二级Python学习笔记可以从以下几个方面进行总结: ... - Python迭代器和生成器:迭代器协议、生成器函数和生成器表达式。 - Python函数式编程:Lambda表达式、高阶函数、闭包等概念。