当前位置:首页 > 编程教程 > Python技术文章 > Python iter()函数用法实例分析

Python iter()函数用法详解

  • 发布时间:
  • 作者:码农之家
  • 点击:193

这篇文章主要知识点是关于Python、iter、函数、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Python编程从入门到精通(资料源码视频)
  • 类型:Python编程大小:5.31 GB格式:PDF作者:叶维忠
立即下载

Python iter()函数用法实例分析

本文实例讲述了Python iter()函数用法。分享给大家供大家参考,具体如下:

python中的迭代器用起来非常灵巧,不仅可以迭代序列,也可以迭代表现出序列行为的对象,例如字典的键、一个文件的行,等等。

迭代器就是有一个next()方法的对象,而不是通过索引来计数。当使用一个循环机制需要下一个项时,调用迭代器的next()方法,迭代完后引发一个StopIteration异常。

但是迭代器只能向后移动、不能回到开始、再次迭代只能创建另一个新的迭代对象。

反序迭代工具:reversed()将返回一个反序访问的迭代器。python中提供的迭代模块:itertools模块

先看几个例子:

>>> l=[2,3,4]
>>> iterl=iter(l)
>>> iterl.next()
2
>>> iterl.next()
3
>>> iterl.next()
4
>>> iterl.next()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

>>> d={'one':1,'two':2,'three':3}
>>> d
{'three': 3, 'two': 2, 'one': 1}
>>> iterd=iter(d) #字典的迭代器会遍历字典的键(key)
>>> iterd.next()
'three'
>>> iterd.next()
'two'
>>> iterd.next()
'one'
>>> iterd.next()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

下面查看iter()函数的帮助信息:

>>> help(iter)
Help on built-in function iter in module __builtin__:
iter(...)
  iter(collection) -> iterator
  iter(callable, sentinel) -> iterator
  Get an iterator from an object. In the first form, the argument must
  supply its own iterator, or be a sequence.
  In the second form, the callable is called until it returns the sentinel.

iter()函数有两种用法,一种是传一个参数,一种是传两个参数。结果都是返回一个iterator对象。

所谓的iterator对象,就是有个next()方法的对象。next方法的惯例或约定(convention)是,每执行一次就返回下一个值(因此它要自己记录状态,通常是在iterator对象上记录),直到没有值的时候raiseStopIteration。

传1个参数:参数collection应是一个容器,支持迭代协议(即定义有__iter__()函数),或者支持序列访问协议(即定义有__getitem__()函数),否则会返回TypeError异常。

传2个参数:当第二个参数sentinel出现时,参数callable应是一个可调用对象(实例),即定义了__call__()方法,当枚举到的值等于哨兵时,就会抛出异常StopIteration。

>>> s='abc' #s支持序列访问协议,它有__getitem__()方法
>>> help(str.__getitem__)
Help on wrapper_descriptor:
__getitem__(...)
  x.__getitem__(y) <==> x[y]
>>> s.__getitem__(1)
'b'
>>> s[1]
'b'
>>> iters=iter(s) #iters是一个iterator对象,它有next()和__iter__()方法
>>> iters1=iters.__iter__()
>>> iters2=iter(iters)
>>> iters
<iterator object at 0x030612D0>
>>> iters1
<iterator object at 0x030612D0>
>>> iters2
<iterator object at 0x030612D0>
iters iters1  iters2 是同一个迭代器!!
>>> iters.next()
'a'
>>> iters.next()
'b'
>>> iters.next()
'c'
>>> iters.next()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
StopIteration

>>> class test: # test 类支持迭代协议,因为它定义有__iter__()函数
...   def __iter__(self):
...     print '__iter__ is called!'
...     self.result=[1,2,3]
...     return iter(self.result)
...
>>> t=test() # t支持迭代协议
>>> for i in t:  #当执行for i in t 时,实际上是调用了t.__iter__(),也就是__iter__(t),返回一个iterator对象
...   print i,
...
__iter__ is called!
1 2 3
>>> for i in t.__iter__():
        print i,
__iter__ is called!!
1 2 3
>>> for i in test.__iter__(t):
        print i,
__iter__ is called!!
1 2 3
>>> l=[1,2,3]
>>> for i in l:
...   print i,
...
1 2 3

#上述for循环实际上是这样工作的(for循环会自动调用迭代器的next()方法),如下:
>>> iterl=iter(l)
>>> while True:
...   try:
...     i=iterl.next()
...   except StopIteration:
...     break
...   print i,
...
1 2 3

>>> f=open(r'C:\Users\Administrator\Desktop\test.txt','w')
>>> f.writelines(['love python\n','hello python\n','love python\n'])
>>> f.close()
>>> f=open(r'C:\Users\Administrator\Desktop\test.txt','r')
>>> for line in f: # 文件对象生成的迭代器会自动调用readline()方法,这样循环遍历就可以访问文本文件的所有行
...   print line[:-1]
...
love python
hello python
love python

上述for循环部分功能与以下代码一致:

>>> while True:
...   line=f.readline()
...   if line!='':
...     print line[:-1]
...   else:
...     break
...
love python
hello python
love python

>>> f=open(r'C:\Users\91135\Desktop\test.txt','r')
>>> f.readlines()
['love python\n', 'hello python\n', '\n', 'love python\n']
>>> f.seek(0)
>>> f.next()
'love python\n'
>>> f.next()
'hello python\n'
>>> f.next()
'\n'
>>> f.next()
'love python\n'
>>> f.next()
Traceback (most recent call last):
 File "<pyshell#140>", line 1, in <module>
  f.next()
StopIteration
>>> f.seek(0)
>>> it1=iter(f)
>>> it2=f.__iter__()

f    iter1    iter2 三者是同一个对象!!!

>>> f
<open file 'C:\\Users\\91135\\Desktop\\test.txt', mode 'r' at 0x030E9A70>
>>> it1
<open file 'C:\\Users\\91135\\Desktop\\test.txt', mode 'r' at 0x030E9A70>
>>> it2
<open file 'C:\\Users\\91135\\Desktop\\test.txt', mode 'r' at 0x030E9A70>
>>> f.next()
'love python\n'
>>> it1.next()
'hello python\n'
>>> next(it2)
'\n'
>>> next(f)
'love python\n'
>>> next(f)
Traceback (most recent call last):
 File "<pyshell#247>", line 1, in <module>
  next(f)
StopIteration
>>> it1.next()
Traceback (most recent call last):
 File "<pyshell#248>", line 1, in <module>
  it1.next()
StopIteration
>>> it2.next()
Traceback (most recent call last):
 File "<pyshell#249>", line 1, in <module>
  it2.next()
StopIteration

iter(callable, sentinel) -> iterator

如果是传递两个参数给 iter() , 第一个参数必须是callable ,它会重复地调用第一个参数,

直到迭代器的下个值等于sentinel:即在之后的迭代之中,迭代出来sentinel就立马停止。

关于Python中,啥是可调用的,可以参考:python callable()函数

>>> class IT(object):
    def __init__(self):
        self.l=[1,2,3,4,5]
        self.i=iter(self.l)
    def __call__(self):  #定义了__call__方法的类的实例是可调用的
        item=next(self.i)
        print "__call__ is called,which would return",item
        return item
    def __iter__(self): #支持迭代协议(即定义有__iter__()函数)
        print "__iter__ is called!!"
        return iter(self.l)
>>> it=IT() #it是可调用的
>>> it1=iter(it,3) #it必须是callable的,否则无法返回callable_iterator
>>> callable(it)
True
>>> it1
<callable-iterator object at 0x0306DD90>
>>> for i in it1:
print i
__call__ is called,which would return 1
1
__call__ is called,which would return 2
2
__call__ is called,which would return 3

可以看到传入两个参数得到的it1的类型是一个callable_iterator,它每次在调用的时候,都会调用__call__函数,并且最后输出3就停止了。

>>> it2=iter(it)
__iter__ is called!!
>>> it2
<listiterator object at 0x030A1FD0>
>>> for i in it2:
print i,
1 2 3 4 5

与it1相比,it2就简单的多,it把自己类中一个容器的迭代器返回就可以了。

上面的例子只是为了介绍iter()函数传两个参数的功能而写,如果真正想写一个iterator的类,还需要定义next函数,这个函数每次返回一个值就可以实现迭代了。

>>> class Next():
        def __init__(self,data=825):
              self.data=data
        def __iter__(self):
              return self
        def next(self):
              print "next is called!!"
              if self.data>828:
                  raise StopIteration
              else:
                  self.data+=1
                  return self.data
>>> for i in Next():
print i
next is called!!
826
next is called!!
827
next is called!!
828
next is called!!
829
next is called!!
>>> for i in Next(826):
print i
next is called!!
827
next is called!!
828
next is called!!
829
next is called!!
>>>

唯一需要注意下的就是next中必须控制iterator的结束条件,不然就死循环了。

>>> it=Next()
>>> it.__iter__()
<__main__.Next instance at 0x02E75F80>
>>> Next.__iter__(it)
<__main__.Next instance at 0x02E75F80>
>>> iter(it)
<__main__.Next instance at 0x02E75F80>
>>> it
<__main__.Next instance at 0x02E75F80>
>>> it=Next()
>>> it.next()
next is called!!
826
>>> next(it)
next is called!!
827
>>> Next.next(it)
next is called!!
828
>>> next(it)
next is called!!
829
>>> it.next()
next is called!!
Traceback (most recent call last):
 File "<pyshell#68>", line 1, in <module>
  it.next()
 File "<pyshell#1>", line 9, in next
  raise StopIteration
StopIteration

希望本文所述对大家Python程序设计有所帮助。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • python XlsxWriter模块创建aexcel表格的代码讲解
  • php中CodeIgniter框架主从数据库配置方法
  • 详解CodeIgniter框架实现的整合Smarty引擎DEMO
  • 相关电子书
    学习笔记
    网友NO.981109

    解决csv.writer写入文件有多余的空行问题

    在用csv.writer写入文件的时候发现中间有多余的空行。 最早打开方式只是‘w',会出现多余的空行,网上建议使用binary形式‘wb'打开可以解决问题: with open('egg2.csv', 'wb') as cf: 不过只能在python2下运行,python3报错: TypeError: a bytes-like object is required, not 'str' 有人建议用encode(‘utf-8')编码转变格式,但是觉得还是比较繁琐,因为list也不支持直接的编码。 再找了一圈,找到的最佳解释: python2.x中写入CSV时,CSV文件的创建必须加上'b'参数,即csv.writer(open('test.csv','wb')),不然会出现隔行的现象。网上搜到的解释是:python正常写入文件的时候,每行的结束默认添加'n',即0x0D,而writerow命令的结束会再增加一个0x0D0A,因此对于windows系统来说,就是两行,而采用' b'参数,用二进制进行文件写入,系统默认是不添加0x0D的。 而python3.x中换成采用newline=''这一参数来达到这……

    网友NO.984640

    Java编程Iterator迭代器设计原理及实现代码示例

    我们知道迭代器(Iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素。那么Iterator迭代器的设计原理是什么呢?迭代器问什么定义了一个借口,而不是一个类呢? 我们假设迭代器迭代数据的功能定义为了一个类,那么,会有这样的问题。不同的集合,由于数据结构不一样,所以他们的存储方式也是不一样的。也就是说,迭代器获取的时候,获取的方式是变化的,也就是不固定的。所以把这种方式定义为具体的实现是不合理的。 无论何种集合,他们肯定都有获取的功能,而且不知道什么时候就没有数据了。所有他们也会有判断功能。于是,就把判断和获取功能抽取出来,定义在接口中。这样的话,将来无论是哪种集合在遍历的时候,它们自己只要去实现迭代器接口即可。 那具体怎么实现的呢?集合迭代器是以内部类的方式实现的……

    网友NO.571153

    python xlsxwriter库生成图表的应用示例

    xlsxwriter可能用过的人并不是很多,不过使用后就会感觉,他的功能让你叹服,除了可以按要求生成你所需要的excel外 还可以加上很形象的各种图,比如柱状图、饼图、折线图等。 xlsxwriter 基本用法,创建 xlsx 文件并添加数据 官方文档:http://xlsxwriter.readthedocs.org/ xlsxwriter 可以操作 xls 格式文件 注意:xlsxwriter 只能创建新文件,不可以修改原有文件。如果创建新文件时与原有文件同名,则会覆盖原有文件 Linux 下安装: sudo pip install XlsxWriter Windows 下安装: pip install XlsxWriter 请看本人生成的: 这里包含了数据公式的计算,插入图片的连接,生成的图表,当然如果你还需要其他的功能,可以继续参考库的文档 下面把源代码贴出来,希望对大家在工作遇到类似的情况,可以直接拿去用。 #!/usr/bin/env python# -*- coding:utf-8 -*-# Author:Eric.yueimport xlsxwriterimport randomfro……

    <
    1
    >

    Copyright 2018-2020 www.xz577.com 码农之家

    投诉 / 推广 / 赞助:QQ:520161757