Python8-26

迭代器(iterator)

  有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器物件的内容。
  在python中,对迭代器的定义是为类似序列的对象提供了一个具有序列特性的接口。它是在python2.2版本中引进进来的。python的迭代器无缝地支持序列对象,而且它还支持非序列类型,包括用户定义的对象。

迭代器的作用(优点)

  • PEP234中对迭代器的作用有着明确的记录:
  • 提供了可扩展的迭代器接口;
  • 对字典、列表的迭代带来了性能的提升;它一次只返回一个数据项,占用更少的内存。但它需要记住当前的状态,以便返回下一数据项。
  • 创建真正的迭代接口,而不是原来的随机对象访问;
  • 与所有已经存在的用户定义的类以及扩展的模块序列和映射的对象向后兼容;
  • 迭代非序列对象时,可以创建更加简洁可读的代码;

迭代器的缺点

迭代器不能回退,只能往前进行迭代。迭代器也不是线程安全的,在多线程环境中对可变集合使用迭代器是一个危险的操作。但如果小心谨慎,或者干脆贯彻函数式思想坚持使用不可变的集合,那这也不是什么大问题

>>>i = iter(‘abc‘)
>>>i.next()
‘a‘
>>>i.next()
‘b‘
>>> 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 mi in MyIterator(4):
...     print mi
...
3
2
1
0

生成器

  生成器提供了一种出色的方法,使得需要返回一系列元素的函数所需的代码更加简单、高效。

  基于yield指令,可以暂停一个函数别返回中间结果。

In [1]: def fibonacci():
   ...:     a,b=0,1
   ...:     while True:
   ...:         yield b
   ...:         a,b=b,a+b
   ...:         

In [2]: fib=fibonacci()

In [3]: fib.next()
Out[3]: 1

In [4]: fib.next()
Out[4]: 1

In [5]: fib.next()
Out[5]: 2

In [6]: [fib.next() for i in range(10)]
Out[6]: [3, 5, 8, 13, 21, 34, 55, 89, 144, 233]

  链接多个函数

In [10]: def power(values):
   ....:     for value in values:
   ....:         print ‘powering %s‘%value
   ....:         yield value
   ....: 

In [12]: def adder(values):
   ....:     for value in values:
   ....:         print ‘adding to %s‘ % value
   ....:         if value % 2==0:
   ....:             yield value+3
   ....:         else:
   ....:             yield value+2
   ....:             

In [13]: elements=[1,4,7,9,12,19]

In [14]: res=adder(power(elements))

In [15]: res.next()
powering 1
adding to 1
Out[15]: 3

In [16]: res.next()
powering 4
adding to 4
Out[16]: 7

  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"
   ....:                 

In [20]: free=psychologist()

In [21]: free.next()
Please tell me your problems

In [24]: free.send(‘I feel bad‘)
Don‘t be so negative

In [25]: free.send(‘I feel bad?‘)
Don‘t ask yourself too much questions

  send的工作机制和next一样,但是yied将变成能够返回传入的值。因而,这个函数可以根据客户端行为改变自身行为。

  一个典型的生成器模板应该类似于:

In [31]: def my_generator():
   ....:     try:
   ....:         yield ‘something‘
   ....:     except ValueError:
   ....:         yield ‘dealing with the exception‘
   ....:     finally:
   ....:         print "ok let‘s clean"
   ....:         

In [32]: gen=my_generator()

In [33]: gen.next()
Out[33]: ‘something‘

In [34]: gen.throw(ValueError(‘mean mean‘))
Out[34]: ‘dealing with the exception‘

In [35]: gen.close()
ok let‘s clean

In [37]: gen.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
/home/zxp/<ipython-input-37-b2c61ce5e131> in <module>()
----> 1 gen.next()

StopIteration: 
时间: 2024-08-10 09:06:50

Python8-26的相关文章

MySQL 5.6.26几种安装包的区别

http://downloads.mysql.com/archives/community/ 一.MySQL Installer 5.6.26 mysql-installer-community-5.6.26.0.msi, 364.2MBMySQL Installer 提供了简单易用.向导式的 MySQL 软件的安装体验过程(目前只支持 Windows),包含的产品有:MySQL Server,所有的 connectors,Workbench 和示例模型,示例数据库,文档.该安装包大而全. 二.

10.23 linux任务计划cron10.24chkconfig工具10.25 systemd管理服务10.26 unit介绍 10.27 target介绍

- 10.23 linux任务计划cron - 10.24 chkconfig工具 - 10.25 systemd管理服务 - 10.26 unit介绍 - 10.27 target介绍 - 扩展 1. anacron http://blog.csdn.net/strikers1982/article/details/4787226  2. xinetd服(默认机器没有安装这个服务,需要yum install xinetd安装) http://blog.sina.com.cn/s/blog_46

Oracle SQL语言基础及环境准备_超越OCP精通Oracle视频教程培训26

Oracle SQL语言基础及环境准备_超越OCP精通Oracle视频教程培训26 本课程介绍: Oracle视频教程,风哥本套oracle教程培训是<<Oracle数据库SQL语言实战培训教程>>的第1/5套:SQL语言之基础入门及环境准备.主要学习Oracle数据库SQL语言基础介绍.PL/SQL语言介绍.数据库SQL对象与数据类型介绍.SQL语言实战环境准备等. Oracle SQL语言之基础及环境准备,课程内容详细如下: Oracle数据库SQL语言基础介绍Oracle数据

《善圈第26期天天圈》:善圈520,鞠躬迎老兵!

亮点:<善圈第26期天天圈>5.20今日精彩回顾:善圈520,鞠躬迎老兵! 深圳罗湖京基100大厦71层善圈,今天迎来了一位尊贵的客人,他是共和国功臣,一位抗美援朝的英雄老兵--现年83岁的老爷爷陈碧.只见他身穿昔日的绿色军装,挂满了各种军功章. 老人家精神矍铄地向大家行军礼,参加学习的企业家纷纷与老人家合影留念,聆听英雄老兵讲述峥嵘岁月的战斗故事. 著名作家魏巍<谁是最可爱的人>将人们的记忆,回放到60多年前那场让全世界为之瞩目的抗美援朝战争.曾经多少优秀中华儿女,雄赳赳气昂昂跨

3月26日 作业

一.质量管理1.质量管理基本原则?1.以实用为核心的多元要求 2.系统工程 3.职工参与管理 4.管理层和第一把手重视 5.保护消费者权益 6.面向国际市场 2.质量管理的目标?1.顾客满意度 2.预防胜于检查 3.各阶段内的过程 c3.质量管理的主要活动有哪些?(记)质量策划.质量保证.质量控制三个过程 4.质量管理流程包括哪四个环节?(记)(按P'DCA理解记忆)1.确立质量标准体系 2.对项目实施进行质量监控 3.将实际与标准对照 4.纠偏纠错 5.ISO9000质量管理的8项原则是什么?

家庭作业6.23 6.24 6.26 10.6

6.23 设半径为r的磁盘总的磁道是K 如上图去除的部分x*r的磁道数为x*K 那么剩下的磁道数为 (1-x)*K 所以总容量为 2*pi*x*r*(1-x)*K (其中pi,r和K都是常数) 也就是对x*(1-x)进行判断 可以得出x = 0.5的时候取最大 6.24 6.26 可以由以下公式计算得出 10.6 Unix进程打开的描述符赋给了stdin(描述符0).stdout(描述符1)和stderr(描述符2). open函数总是返回最低的未打开的描述符,所以第一次调用open函数会返回描

leetCode做题笔记二(26, 20,9)

LeetCode26:给定一个有序序列,求不同的元素个数并且返回不同序列,要求原地返回,O(1)空间(26, easy) 15分钟,第一次就AC了略开心,最好记录406ms貌似是前1%!虽然这个时间不靠谱 没啥可优化的了,感觉几乎没有废代码 经验?:真的会有公司考这么简单? 括号匹配.(20, easy) 最好记录430ms,前10%.稍微用了点小聪明,不过不好(使用异常做判断) 经验8:使用Stack比使用数组效率高很多,对这个题而言 经验?:真的会有公司考这么简单? 判断一个数是不是回文数,

26. Remove Duplicates from Sorted Array【easy】

26. Remove Duplicates from Sorted Array[easy] Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with consta

MariaDB小版本升级10.1.22 -&gt; 10.1.26

一.升级原因 因为版本bug,导致DB经常crash.原因可能是由于innodb采用新的统计信息收集问题. 相关网页:https://jira.mariadb.org/browse/MDEV-12281 https://bugs.mysql.com/bug.php?id=84940 二.升级环境 linux :CentOS 7 架构:一主一从 使用rpm yum方式安装的MariaDB,systemd启动. 三.升级步骤 1.官网下载MariaDB 10.1.26 rpm包,解压到服务器 2.关

26. Remove Duplicates from Sorted Array【leetcode】,数组,array,java,算法

26. Remove Duplicates from Sorted Array Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length. Do not allocate extra space for another array, you must do this in place with constant mem