深入了解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练习程序批量修改文件名
Jan 16 Python
在Python的setuptools框架下生成egg的教程
Apr 13 Python
Python中http请求方法库汇总
Jan 06 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
wxpython实现图书管理系统
Mar 12 Python
实例讲解python中的协程
Oct 08 Python
将python图片转为二进制文本的实例
Jan 24 Python
Python符号计算之实现函数极限的方法
Jul 15 Python
django框架F&amp;Q 聚合与分组操作示例
Dec 12 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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 5.0 Pear安装方法
2006/12/06 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
PHP 截取字符串函数整理(支持gb2312和utf-8)
2010/02/16 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
当达到输入长度时表单自动切换焦点
2014/04/06 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
2016/12/08 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
[13:40]TI3青蛙君全程回顾 DOTA2我们为梦想再战
2013/09/13 DOTA
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
python实现指定字符串补全空格的方法
2015/04/30 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
浅谈python之新式类
2018/08/12 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
django 使用全局搜索功能的实例详解
2019/07/18 Python
postman传递当前时间戳实例详解
2019/09/14 Python
如何基于Python创建目录文件夹
2019/12/31 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
策划总监岗位职责
2014/02/16 职场文书
和解协议书
2014/04/16 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
小学教研工作总结2015
2015/05/13 职场文书
2015年车间安全管理工作总结
2015/05/13 职场文书
2015年人民调解工作总结
2015/05/18 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书