深入了解Python iter() 方法的用法
作者:千锋Python唐唐君 发布时间:2023-11-05 02:12:37
今天我们来介绍下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() 方法第一个参数的参数类型,根据有无第二个参数决定
来源:https://www.cnblogs.com/cherry-tang/p/11040561.html


猜你喜欢
- 本文实例为大家分享了Vue自定义日历插件的具体代码,供大家参考,具体内容如下由于网上的插件没有符合项目的需求决定自己实现图示如下:默认选择今
- 博主在开发一些C端小软件时,喜欢用json作为序列化方案,故总结下python中json库常见用法。导包自带的库,无需额外安装。import
- 本文实例为大家分享了js秒表计时器的制作代码,供大家参考,具体内容如下具体代码:<!DOCTYPE html><html
- Python中的is和==比较两个对象的两种方法在Python中有两种方式比较两个对象是否相等,分别是is和==,两者之间是不同的==比较的
- 有时候有很多逗号,这样我们就不好处理了,下面的函数就是将多个逗号替换为一个逗号,方便后面的处理。<script language=&q
- 本文介绍了vue语法之拼接字符串的示例代码,分享给大家,具体如下。先来一行代码:<div class="swiper-sli
- 今天知数堂一个学生反馈说在优化课中老师讲Innodb是以主键排序存储,读取的时间以主键为顺序读取,但发现个例外,如下:CREATE TABL
- bbssend.asp'寻呼台页面,向在线网友发送寻呼信息<%@ Language=VBScript %&
- Player.playState0 Undefined Windows Media Player is in an undefined st
- 网站标准(或称“WEB标准”)对于每一个开发网站和做网页的人来说,都是不可忽视的,这不仅是一个潮流,而是一个标准,一个更加符合规范的做法,而
- Random库主要包含返回随机数的函数,主要用于普通的随机数生成的程序,如果对随机性有特殊要求,比如加密等,可以用函数os.urandom(
- 原生上传图片方式#新建工程 python manage.py startapp test30#修改 settings.pyINSTALLED
- pymysql模块的使用查询一条数据fetchone()from pymysql import *conn = connect(  
- 今天在百度知道看php相关资料时发现一个网友问一个wordpress安装提示错误的一个问题,说他在安装wordpress安装包时遇到这样一个
- 简介本文主要简述如何通过sklearn模块来进行预测和学习,最后再以图表这种更加直观的方式展现出来数据集学习数据预测数据数据处理数据分离因为
- 1.安装anaconda(anaconda内置python在内的许多package,所以不用另外下载python)可以点击下面的清华开源软件
- PromisePromise能够处理异步程序。回调地狱JS中或node中,都大量的使用了回调函数进行异步操作,而异步操作什么时候返回结果是不
- 摘要: 前端框架 Bootstrap 的模态对话框,可以使用 remote 选项指定一个 URL,这样对话框在第一次弹出的时候就会自动从这个
- EXEC SQL WHENEVER SQLERROR CONTINUE; sqlglm(msg_buffer, &buf
- 记录了Windows安装python3.7的详细过程,供大家参考,具体内容如下1. 在python的官网下载python对应版本:官网地址6