1、迭代器基于下面两个个方法:

(1)__next__ 返回容器的下一个项目
(2)__iter__ 返回迭代器本身

2、当序列遍历完时,将抛出StopIteration异常,所以通过捕获这个异常来停止循环

下面是自定义迭代器的示例代码:

class MyIterator(object):def __init__(self, step):self.step = stepdef __next__(self):if self.step == 0:raise StopIterationself.step -= 1return self.stepdef __iter__(self):return selffor i in MyIterator(6):print(i)

运行结果:

5
4
3
2
1
0

用户定义的迭代器

如今,Python中所有的迭代坏境都会先尝试__iter_二方法,再尝试__getite。_。也就是说,它们宁愿使角第13章所学到的迭代协议,然后才是重复对对象进行索弓l运算。如果对象不支持迭代协议,就会尝试索引运算。从技术角度来讲,迭代环境是通过调用内置函数iter去尝试寻找iter方法来实现的,而这种方法应该返回一个迭代器对象。如果已经提供了,Python就会重复调用这个迭代器对象的next方法,直到发生stop工teration异常。如果没找到这类__iter__方法,Python会改用__getitem__机制,就像之前那样通过偏移量重复索引,直到引发
IndexError异常。

下面的文件iters.py定义了用户定义的迭代器类来生成平方值。

#!/usr/bin/env python
# -*- coding:utf-8 -*-class Squares:def __init__(self, start, stop):self.value = start - 1self.stop = stopdef __iter__(self):return selfdef __next__(self):if self.value == self.stop:raise StopIterationself.value += 1return self.value **2for i in Squares(1, 5):print(i)

运行结果:

  

1
4
9
16
25

# 用生成器函数编写
#!/usr/bin/env python
# -*- coding:utf-8 -*-# 用生成器函数编写def gsquares(start, stop):for i in range(start, stop+1):yield i ** 2for i in gsquares(1, 5):print(i, end=" ")

运行结果:

1 4 9 16 25

转载于:https://www.cnblogs.com/chenlin163/p/7305401.html

pytion3--用户定义的迭代器相关推荐

  1. SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题

    SQL SERVER中用户定义标量函数(scalar user defined function)的性能问题 原文:SQL SERVER中用户定义标量函数(scalar user defined fu ...

  2. CodeGen用户定义的扩展令牌

    CodeGen用户定义的扩展令牌 用户定义的扩展令牌是一种特殊的令牌,开发人员可以确定令牌的名称以及在代码生成过程中遇到令牌时要插入的值. CodeGen支持多种机制,允许通过以下方式实现用户定义的令 ...

  3. java linkedlist排序_用Java对用户定义对象的LinkedList进行排序

    要使用Java对列表进行排序,可以使用sort(List list) 方法.此方法可以对所有元素必须实现Comparable接口的列表进行排序. 在下面的示例中,House类是用户定义的.为了使其具有 ...

  4. 博途数据类型wstring怎么用_如何在STEP 7 (TIA 博途)中使用“用户定义数据类型” (UDTS)...

    说明 创建一个 PLC 数据类型,在项目导航中打开" PLC 数据类型"文件夹并双击"添加新数据类型".新创建的 PLC 数据类型将分配一个默认名称.如果想更改 ...

  5. ylbtech-LanguageSamples-UserConversions(用户定义的转换)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-UserConversions(用户定义的转换) 1.A,示例(Sample) 返回顶部 ...

  6. 除了数据属性,Vue 实例还提供了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来。

    实例 <div id="vue_det"> <h1>site : {{site}}</h1> <h1>url : {{url}}&l ...

  7. 使用脚本编写 Vim 编辑器,第 2 部分: 用户定义函数

    用户定义函数 Haskell 或 Scheme 程序员会告诉您,函数对于任何严肃的编程语言来说都是最重要的特性.对于 C 或 Perl 程序员,他们也会告诉您完全相同的观点. 函数为严肃的程序员提供了 ...

  8. boost::units模块实现带有转换的用户定义单位的测试程序

    boost::units模块实现带有转换的用户定义单位的测试程序 实现功能 C++实现代码 实现功能 boost::units模块实现带有转换的用户定义单位的测试程序 C++实现代码 #include ...

  9. boost::spirit模块实现演示自定义的、用户定义的类型如何作为标记值类型轻松地与词法分析器集成

    boost::spirit模块实现演示自定义的.用户定义的类型如何作为标记值类型轻松地与词法分析器集成 实现功能 C++实现代码 实现功能 boost::spirit模块实现演示自定义的.用户定义的类 ...

最新文章

  1. shell脚本自动执行,top命令无输出
  2. LeetCode实战:将有序数组转换为二叉搜索树
  3. HL7 Figure 2-1. Delimiter values(分隔符值)
  4. java 线程aba,JAVA中CAS-ABA的问题解决方案AtomicStampedReference
  5. python算法与数据结构-快速排序算法
  6. 命犯编程!因为名字特殊,她被苹果封了 6 个月
  7. angular 示例项目
  8. 计算机专业在湖南录取分数,计算机科学与技术专业分数线各大学排名(湖南)
  9. java 二叉树特点_疯狂java笔记之树和二叉树
  10. codeforces 688D D. Remainders Game(中国剩余定理)
  11. (238)数字IC工程师核心技能树(一)
  12. python字符串操作总结_Python字符串的一些操作方法总结
  13. 计算机同S7-300PLC通讯,西门子S7-300 PLC与Intouch的通讯连接方法
  14. 查看电脑CPU是否支持虚拟化
  15. 常用软件开发安装包+破解分享
  16. gcc编译工具集中各软件的用途,了解EFF文件格式
  17. 华为云OBS文件服务
  18. 怎么查看当前登录的svn账号_svn 用户名,密码 查看/删除方法
  19. 趣店能否撑起百亿美元市值!
  20. Java程序员从携程、美团、阿里面试回来,这些面经分享给大家

热门文章

  1. 1467: C语言实验题――两个数最大
  2. UBUNTU修改控制台语言
  3. Instant Complexity--POJ 1472
  4. 组装我的计算机社会实践活动,暑期电脑销售社会实践心得体会
  5. 从分布式环境的特点、问题到CAP、BASE理论详解
  6. Python机器学习:逻辑回归005决策边界
  7. Python机器学习:逻辑回归001什么是逻辑回归
  8. linux mysql 加固_apache+mysql+php安全加固配置说明
  9. 自定义oracle异常,详解Oracle自定义异常示例
  10. 第一代计算机主要用于科学计算和数据处理,计算机一级第一章练习题.doc