深入了解Python iter() 方法的用法


Posted in Python onJuly 11, 2019

今天我们来介绍下Python基础教程学习之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中字典的循环遍历的两种方式
Feb 07 Python
python3大文件解压和基本操作
Dec 15 Python
Python+opencv 实现图片文字的分割的方法示例
Jul 04 Python
简单了解python PEP的一些知识
Jul 13 Python
pytorch中nn.Conv1d的用法详解
Dec 31 Python
基于Python生成个性二维码过程详解
Mar 05 Python
python数据类型可变不可变知识点总结
Mar 06 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 Python
Django中日期时间型字段进行年月日时分秒分组统计
Nov 27 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
Pygame Time时间控制的具体使用详解
Nov 17 Python
Python中三种花式打印的示例详解
Mar 19 Python
用python给自己做一款小说阅读器过程详解
Jul 11 #Python
Python 200行代码实现一个滑动验证码过程详解
Jul 11 #Python
ML神器:sklearn的快速使用及入门
Jul 11 #Python
python 随机森林算法及其优化详解
Jul 11 #Python
python实现从本地摄像头和网络摄像头截取图片功能
Jul 11 #Python
python常用库之NumPy和sklearn入门
Jul 11 #Python
python在新的图片窗口显示图片(图像)的方法
Jul 11 #Python
You might like
PHP学习笔记之二 php入门知识
2011/01/12 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
Node.js+ELK日志规范的实现
2019/05/23 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
用python生成与调用cntk模型代码演示方法
2019/08/26 Python
Python绘制热力图示例
2019/09/27 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
采购人员的个人自我评价
2014/01/16 职场文书
公司端午节活动方案
2014/02/04 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
个人贷款收入证明
2014/10/26 职场文书
Go语言编译原理之变量捕获
2022/08/05 Golang