使用生成器创建新的迭代模式

问题

你想实现一个自定义迭代模式,跟普通的内置函数比如 range() , reversed() 不一样。

解法

如果你想实现一种新的迭代模式,使用一个生成器函数来定义它。下面是一个生产某个范围内浮点数的生成器:

def frange(start, stop, increment):x = startwhile x < stop:yield xx += increment

为了使用这个函数,你可以用 for 循环迭代它或者使用其他接受一个可迭代对象的函数 (比如 sum() , list() 等)。示例如下:

>>> for n in frange(0, 4, 0.5):
... print(n)
...
0
0.5
1.0
1.5
2.0
2.5
3.0
3.5
>>> list(frange(0, 1, 0.125))
[0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875]
>>>

讨论

一个函数中需要有一个 yield 语句即可将其转换为一个生成器。跟普通函数不同的是,生成器只能用于迭代操作。下面是一个实验,向你展示这样的函数底层工作机制:

>>> def countdown(n):
...     print('Starting to count from', n)
...     while n > 0:
...         yield n
...         n -= 1
...     print('Done!')
...
>>> # Create the generator, notice no output appears
>>> c = countdown(3)
>>> c
<generator object countdown at 0x1006a0af0>>>> # Run to first yield and emit a value
>>> next(c)
Starting to count from 3
3>>> # Run to the next yield
>>> next(c)
2
>>> # Run to next yield
>>> next(c)
1
>>> # Run to next yield (iteration stops)
>>> next(c)
Done!
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>

一个生成器函数主要特征是它只会回应在迭代中使用到的 next 操作。一旦生成器函数返回退出,迭代终止。我们在迭代中通常使用的 for 语句会自动处理这些细节,所以你无需担心。

《Python Cookbook 3rd》笔记(4.3):使用生成器创建新的迭代模式相关推荐

  1. 使用生成器创建新的迭代模式

    一个函数中需要有一个 yield 语句即可将其转换为一个生成器. def frange(start, stop, increment):x = startwhile x < stop:yield ...

  2. 《Python Cookbook 3rd》笔记汇总

    文章目录 一.数据结构 二.字符串和文本 三.数字.日期和时间 四.迭代器与生成器 五.文件与IO 一.数据结构 标题 关键词 1.1:拆分序列后赋值给多个变量 可迭代对象.拆分赋值 1.2:拆分任意 ...

  3. 《Python Cookbook 3rd》笔记(1.4):查找最大或最小的N个元素

    <Python Cookbook 3rd>1.4:查找最大或最小的N个元素 问题 怎样从一个集合中获得最大或者最小的N个元素列表? 解法 heapq 模块有两个函数:nlargest()和 ...

  4. Python Cookbook 3rd Edition Documentation

    Python Cookbook 3rd Edition Documentation 文章目录 第一章:数据结构和算法 1.1 解压序列赋值给多个变量 问题 解决方案 讨论 1.2 解压可迭代对象赋值给 ...

  5. 《Python cookbook》笔记二

    <Python cookbook>笔记二 第二章 字符串和文本 -使用多个界定符分割字符串- 你需要将一个字符串分割为多个字段,但是分隔符 (还有周围的空格) 并不是固定 的. # str ...

  6. Machine Learning with Python Cookbook 学习笔记 第9章

    Chapter 9. Dimensionality Reduction Using Feature Extraction 前言 本笔记是针对人工智能典型算法的课程中Machine Learning w ...

  7. Machine Learning with Python Cookbook 学习笔记 第8章

    Chapter 8. Handling Images 前言 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放 ...

  8. Machine Learning with Python Cookbook 学习笔记 第6章

    Chapter 6. Handling Text 本笔记是针对人工智能典型算法的课程中Machine Learning with Python Cookbook的学习笔记 学习的实战代码都放在代码压缩 ...

  9. 《Python Cookbook 3rd》笔记(1.18):映射名称到序列元素

    映射名称到序列元素 问题 你有一段通过下标访问列表或者元组中元素的代码,但是这样有时候会使得你的代码难以阅读,于是你想通过名称来访问元素. 解法 collections.namedtuple() 函数 ...

最新文章

  1. 【资源推荐】知识图谱顶会论文集锦
  2. Apache多站点设定
  3. Struts2 学习笔记 — 第一个struts2项目
  4. 灰暗而空虚的景色β(数学思维题)
  5. GPS-nmealib学习
  6. leetcode 208. Implement Trie (Prefix Tree) | 208. 实现 Trie 前缀树(Java)
  7. 在C#中使用RESTful API的几种好方法
  8. [转]敏捷开发之Scrum扫盲,及敏捷开发中XP与SCRUM的区别
  9. kali linux wifi监听模式,无线渗透教程1:监听无线网络
  10. oracle日常维护(不断更新)
  11. 豆瓣镜像源的使用与pip包版本控制
  12. Qt4_字符串、字节数组和变量
  13. 复域,频域,时域之间关系,转换,s平面(转)
  14. php speex转码为mp3,ffmpeg speex转换为mp3或者aac
  15. 云安全架构连载之一-Azure整体架构及安全亮点详解
  16. Dns是什么?IPHostEntry/IPAddress/IPEndPort是什么?怎么用?
  17. 使用阿里云ECS服务器搭建java环境
  18. 我是一只可可爱爱的小粽子
  19. 计算机类专科学校排名,2017计算机专科学校排名一览表
  20. 2020年计算机专业研究生考试时间,2020计算机考研考试时间及考试内容

热门文章

  1. python画饼图程序_python使用matplotlib画饼状图
  2. 如何创建_如何创建自己的微信圈子?圈子创建运营指南
  3. linux屏保配置文件夹,Linux下屏保设置
  4. C语言程序设计(代码+知识点)
  5. Linq找不到行或行已更改
  6. oracle 12c sql图形化,Oracle 12c PL/SQL程序设计终极指南
  7. linux查看tcl版本_查看Linux内核版本的方法有几个?你也是这样操作吗?
  8. java异或_JAVA面试必备之HashMap必会点
  9. REVERSE-PRACTICE-BUUCTF-32
  10. java内存分配和垃圾回收,Java内存分配与垃圾回收