在前面的一期Python学习教程有跟大家介绍过关于序列、可迭代对象、迭代器、生成器的概念,其中有提到过,如果实现了 _iter_() 和 _next_() 就是生成器,同时验证可迭代对象最好的方法是 iter(obj) 。

今天我们来介绍下 iter() 方法另外的用法。

据说是很少有人知道这个用法

一、上代码、学用法

我们都比较熟悉 iter(obj),会返现一个迭代器,如果 obj 不是可迭代对象,则会报错。但其实如果仔细看官方文档,会发现 iter() 方法其实是接受两个参数的,文档说明如下

iter(object[, sentinel])
sentinel 英文翻译为 哨兵。

sentinel 参数是可选的,当它存在时,object 不再传入一个可迭代对象,而是一个可调用对象,通俗点说就是可以通过()调用的对象,而 sentinel 的作用就和它的翻译一样,是一个“哨兵”,当时可调用对象返回值为这个“哨兵”时,循环结束,且不会输出这个“哨兵”。

可能有点难懂,用一个简单需求来说明,需求说明如下:

心里想一个[1, 10]范围的数,然后代码开始随机,当随机到想的数时停止,看每次代码需要随机几次。

实现分析:看起来应该很简单,random,然后加一个if判断即可,但是用 iter() 来实现更简单。实现代码如下:

from random import randint
def guess():return randint(0, 10)
num = 1
# 这里先写死心里想的数为5
for i in iter(guess, 5):print("第%s次猜测,猜测数字为: %s" % (num, i))num += 1
# 当 guess 返回的是 5 时,会抛出异常 StopIteration,但 for 循环会处理异常,即会结束循环

二、还是看看文档吧

关于这两个参数,文档里也说的很详细,分段解释如下:

The first argument is interpreted very differently depending on the presence of the second argument.

翻译:第一个参数根据第二个参数有不同的含义

Without a second argument, object must be a collection object which supports the iteration protocol (the _iter_() method), or it must support the sequence protocol (the _getitem_() method with integer arguments starting at 0). If it does not support either of those protocols, TypeError is raised.

翻译:如果没有第二个参数,object(即第一个参数)是一个支持迭代器协议(实现_iter_()方法的)的集合对象,或者是支持序列协议(实现_getitem_()方法)且是从0开始索引。如果它不支持其中任何一个,则抛出 TypeError 异常

简单来说就是,如果没有第二个参数,就是我们比较熟悉的用法。代码示例如下:

In [5]: iter("123")
Out[5]: <str_iterator at 0x105c9b9e8>
In [6]: iter([1, 2, 3])
Out[6]: <list_iterator at 0x105f9f8d0>
In [7]: iter(123)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-7-c76acad08c3c> in <module>()
----> 1 iter(123)
TypeError: 'int' object is not iterable

再来看看有第二个参数的情况

If the second argument, sentinel, is given, then object must be a callable object. The iterator created in this case will call object with no arguments for each call to its _next_() method; if the value returned is equal to sentinel, StopIteration will be raised, otherwise the value will be returned.

翻译:如果给定了第二个参数 sentinel,object 则必须是一个可调用对象,这个可调用对象没有任何参数,当可调用对象的返回值等于 sentinel 的值时,抛出 StopIteration 的异常,否则返回当前值。(这里如果不好理解可调用对象,可以理解为函数,这样更容易想明白)

对于这个用法的适用场景,文档中也给出了说明:

One useful application of the second form of iter() is to build a block-reader. For example, reading fixed-width blocks from a binary database file until the end of file is reached:

翻译:对于第二个参数,一个有用的场景是创建一个 blokc-reader,即根据条件中断读取。比如:从二进制数据库文件读取固定宽度的块,直到到达文件的末尾,代码示例如下:

from functools import partial
with open('mydata.db', 'rb') as f:for block in iter(partial(f.read, 64), b''):process_block(block)

三、小结一下

1、iter() 方法不管有没有第二个参数,返回的都是迭代器

2、iter() 方法第一个参数的参数类型,根据有无第二个参数决定

其实关于Python学习有很多还有待发掘的用法和方法,欢迎各位小伙伴补充呀!更多的Python学习教程也会继续为大家更新!

comparator比较器用法_Python学习:好像很少人知道 Python iter() 的另外一个用法?...相关推荐

  1. 深圳爱思拓大数据 网站_建议收藏!13个大数据学习网站很少人知道!附大数据自学资料分享...

    数据分析重要性 越来越多的管理者意识到数据分析对经济发展.企业运营的重要意义 在古代,得琅琊阁者得天下 现在,得大数据者得天下 我总结的数据分析五步走: 1.锁定分析目标,梳理思路,叫纸上谈兵: 2. ...

  2. C# 很少人知道的科技

    本文来告诉大家在C#很少有人会发现的科技.即使是工作了好多年的老司机也不一定会知道,如果觉得我在骗你,那么请看看下面 因为C#在微软的帮助,已经从原来很简单的,到现在的很好用.在10多年,很少人知道微 ...

  3. 搞模具的想转行学计算机,为什么很少人去做模具设计学徒,看看这里你就明白了!...

    原标题:为什么很少人去做模具设计学徒,看看这里你就明白了! 模具是工业之母,我们生活中很多东西都是用模具生产的,由于需求量巨大,只有用模具批量生产才能让产品达到量产,提高效率,降低成本.目前工业发展迅 ...

  4. 为什么很少人用redmine_为什么中文不能用来编程呢?其实还有这些原因!看完长见识了...

    今天小编带大家来了解一下编程的问题. 编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程.那么有些小伙伴就很困惑了,为什么我们编程的时候为什么中文不能用来编程呢? ...

  5. 很少人知道但很有用的 Linux 命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  6. 很少人知道的Linux命令

    Linux命令行吸引了大多数Linux爱好者.一个正常的Linux用户一般掌握大约50-60个命令来处理每日的任务.Linux命令和它们的转换对于Linux用户.Shell脚本程序员和管理员来说是最有 ...

  7. python中文名字叫什么-Python为什么取名为Python,很少人知道

    原标题:Python为什么取名为Python,很少人知道 打开世界编程语言排行榜,出现在榜单上的语言名称多半都让人一头雾水.一些编程语言的作者会以「这种语言是什么」来命名语言,比如 BASIC.COB ...

  8. 相片打印机原理_激光照片打印机的原理 为什么很少人用激光照片打印机打印照片...

    激光照片打印机是利用激光扫描,在硒鼓上形成电荷潜影,然后吸附墨粉,再将墨粉转印到打印纸上,只不过黑白激光打印机只有一种黑色墨粉,而彩色激光打印机要使用黄.品.青.黑四种颜色的墨粉. 该图片由注册用户& ...

  9. enfp工具箱怎么用_5个很少人知道的黑科技工具箱,功能奇妙,一个顶十个用

    原标题:5个很少人知道的黑科技工具箱,功能奇妙,一个顶十个用 平时我们上网或者在使用手机的时候,是不是因为各种各样的操作需要下载很多各式各样的软件?今天要来说说5个实用的黑科技工具箱,手机端网页端都有 ...

最新文章

  1. 淘淘商城 本地仓库配置和仓库jar包下载
  2. 变频电机转矩频率特性曲线_伟创变频器
  3. 什么是Windows Service应用程序?(转)
  4. java 内嵌汇编_C6000嵌入汇编C与汇编对照及功能说明
  5. 自学html和css,学习HTML和CSS的5大理由
  6. intel A20地址线
  7. 一刷leetcode——树
  8. ITU-T Technical Paper: QoS的构建模块与机制
  9. c++ 深度拷贝和浅度拷贝
  10. 高等数学 · 希腊符号
  11. OneNote 使用汇总
  12. photoshop cc 2018破解补丁(pscc2018注册机) 附使用方法
  13. 通过漫画学习MySQL索引及优化
  14. 店开天下,阿里云助力客如云数据中台建设
  15. ArcGIS基础知识之shape文件的构成
  16. Java基于ssm的超市多商家系自提系统
  17. 如何让电脑在指定时间内自动播放和关闭音乐
  18. 处理/root/jdk8/jdk1.8.0_241/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or di错误
  19. 4g+uim卡是什么卡_uim卡是什么 sim卡槽能不能用uim卡
  20. java-php-python-毕业生论文管理系统计算机毕业设计

热门文章

  1. NetBeans 时事通讯(刊号 # 60 - Jun 21, 2009)
  2. C# Task的简单使用
  3. 订餐系统之同步饿了么商家订单
  4. java中集合的结构(list和map)
  5. Git 修改分支的名称(亲测)
  6. 人工智能、机器学习和深度学习的区别?
  7. jupyter notebook的链接密码 token查询 以及 pycharm 如何使用 jupyter notebook
  8. RabbitMQ安装及PHP扩展安装(最后的代码可以测试连接是否成功)
  9. Go的GOPATH与GOROOT
  10. php检测非法字符的一种方法