Python里面怎么给自己的类自定义迭代器方法

作者&投稿:瞿邢 (若有异议请与网页底部的电邮联系)
〔求问〕Python里面怎么给自己的类自定义迭~

迭代器的用法在 Python 中普遍而且统一。在后台,for 语句在容器对象中调用 iter() 。 该函数返回一个定义了 next() 方法的迭代器对象,它在容器中逐一访问元素。没有后续的元素时,next() 抛出一个 StopIteration 异常通知 for 语句循环结束。 了解了迭代器协议的后台机制,就可以很容易的给自己的类添加迭代器行为。定义一个 __iter__() 方法,使其返回一个带有 next() 方法的对象。如果这个类已经定义了 next(),那么 __iter__() 只需要返回self。 以下是其工作原理的示例: Python代码
class Reverse: "Iterator for looping over a sequence backwards" def __init__(self, data): self.data = data self.index = len(data) def __iter__(self): return self def next(self): if self.index == 0: raise StopIteration self.index = self.index - 1 return self.data[self.index] Python代码 for char in Reverse('spam'): print char

Python 3.x与Python 2.x之间存在着较多的语法细节差异。今天在看Python核心编程的时候,说到了自定义迭代器对象。于是动手将源码打了一遍,原书代码如下:

class AnyIter(object):
def __init__(self, data, safe=False):
""" The initialization of iterators """
self.safe = safe
self.iter = iter(data)
def __iter__(self):
""" return a iterator """
return self
def next(self, count=1):
""" Return arbitrary numbers of elements """
retval = []
for item in range(count):
try:
retval.append(self.iter.next())
except StopIteration:
if self.safe:
break
else:
raise # reraise the exception again
return retval

if __name__ == '__main__':
a = AnyIter(range(10), True)
b = iter(a)
for item in range(1,5):
print('{}:{}'.format(item, a.next(item)))


我机器上装的是Python 3.3.2,在控制台运行该脚本的时候直接抛出异常TypeError:

说是iter()返回的是一个非迭代器类型的对象。前后对照了一下,并没有发现哪里有错误啊。于是尝试使用Ipython(Python 版本是2.7.5)来运行该代码,得出完美结果。于是考虑是不是版本的问题。求助google,在stackoverflow上找到一个帖子,找到了关键原因:

于是将上述代码中调用next()的地方全部替换为__next__(),最后在控制台运行该代码,正确得到了预期的结果:

查阅Python 3.3.2 附带的用户手册,果然得到如下结果:

问题得到解决:Python核心编程使用的是Python 2.x,版本差异使得该状况得以发生。还是得动手,不然这样的差异无法得知。

迭代器的用法在 Python 中普遍而且统一。在后台,for 语句在容器对象中调用 iter() 。 该函数返回一个定义了 next() 方法的迭代器对象,它在容器中逐一访问元素。没有后续的元素时,next() 抛出一个 StopIteration 异常通知 for 语句循环结束。 
了解了迭代器协议的后台机制,就可以很容易的给自己的类添加迭代器行为。定义一个 __iter__() 方法,使其返回一个带有 next() 方法的对象。如果这个类已经定义了 next(),那么 __iter__() 只需要返回self。 
以下是其工作原理的示例: 
Python代码 

class Reverse: 
"Iterator for looping over a sequence backwards" 
def __init__(self, data): 
self.data = data 
self.index = len(data) 
def __iter__(self): 
return self 
def next(self): 
if self.index == 0: 
raise StopIteration 
self.index = self.index - 1 
return self.data[self.index] 
Python代码 
for char in Reverse('spam'): 
print char

希望能帮到你!




Python里面如何输出position?
按照你的要求编写的返回位置的Python程序如下 def square_to_position(s):a="abcdefgh".index(s[0])b=int(s[1])return (a,b)print(square_to_position("e4"))源代码(注意源代码的缩进)

在python中质数如何表示?
质数又称素数,指一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数。下面是求质数的程序,例如输入15,会输出【2,3,5,7,11,13】共6个15以内的质数。可以拷到vscode 或者pycharm里面试试。import math number = int(input("请输入一个数值: "))list1 = []如果用户输入的...

怎么在python里面,用键盘输入信息
a = input()print(a)运行之后,用键盘输入内容,按下回车键,就可以打印输入的内容。但是,如果运行之后有所提示,会不会好一点呢?print('请输入:')a = input()print('输入内容是',a)注意:python是从上往下运行。如果我们输入一个数字,要进行计算,怎么能得到计算结果呢?print('请输入:')...

python初学者怎么入门
python入门首先要掌握以下7个知识点:1、编程环境的安装与使用。比如Python的学习一般推荐软件自带的IDLE,简单好用。2、掌握输入、输入语句的使用。输入语句可以让计算机知道你通过键盘输入了什么,输出语句可以让你知道计算机执行的结果,其中“”里面的内容是原样输出,多个输出项之间用,隔开。3、掌握运算...

python的指针和对象是什么?python中的的指针和对象课程讲解
3.主要内容第一个会讲Python的变量和内存地址之间到底有没有关系,第二个是为什么Python它不支持指针,第三个是在Python代码里面如何通过ctypes这个模块去调用C的代码。4.这一章的内容会帮助大家去理解在Python里面变量到底是怎么回事,在这个变量里面mutable和immutable的变量为什么会有不同,以及在Python里面...

python中保留两位小数怎么表示
当需要输出的结果要求有两位小数的时候,字符串形式的:'%.2f' % a 方式最好,其次用Decimal。需要注意的:1. 可以传递给Decimal整型或者字符串参数,但不能是浮点数据,因为浮点数据本身就不准确。2. Decimal还可以用来限定数据的总位数。谈谈关于Python里面小数点精度控制的问题 基础 浮点数是用机器上...

python类里面的class是什么意思啊?求
明确答案:在Python中,类是一种定义对象结构、属性和方法的结构。它是对现实世界事物的抽象表示。在类内部使用的“class”是一个关键字,用于定义一个新的类。详细解释:1. 类与对象的基本概念:在编程中,类是创建对象的模板或蓝图。它定义了对象应该拥有的属性和方法。通过类,我们可以创建多个具有...

python怎么删除文件夹以及里面的所有文件
os包的rmdir()函数可以用来删除一个文件夹,但是文件夹必须是空的。一种可行的方法是读取文件夹的文件列表,逐个删除文件夹中的所有文件,然而文件夹中可能还有文件夹,因此这是一个递归的操作。shutil包rmtree()函数就实现了以上功能。shutil是一个高级文件操作的包,实现了文件及文件集合复制与删除的功能...

python怎么单独运行某个函数?
答: 我所知道的有两种方法。第1种方法就是使用Jupyter编写Python代码, 把不同的内容编写在不同的代码块里面,这样的话我们就可以单独运行某一个代码块,而不需运行整个文件;使用Python进行代码编写时,将其设置为科学模式,并在函数前面添加#%%标志,然后也可以达到一个一个代码块的效果。企业可以单独...

python里面request怎么读取html代码?
使用Python 3的requests模块抓取网页源码并保存到文件示例:import requests html = requests.get("http:\/\/www.baidu.com")with open('test.txt','w',encoding='utf-8') as f:f.write(html.text)这是一个基本的文件保存操作,但这里有几个值得注意的问题:1.安装requests包,命令行输入pip ...

老边区15217915936: python中如何定义类 -
洪查舒林: 输入class ......(......处自己写):然后在四个空格后面输入def ......(......)(建议加一个self)

老边区15217915936: 在python里如何动态添加类的动态属性呢 -
洪查舒林: class ToolbarFrame(wx.Frame): def __init__(self,id): self.__dict__['test_%d'%1] = 1

老边区15217915936: python如何使用一个自己定义好的模块中的类? -
洪查舒林: Chain.py是模块(Module), 在代码里定义的Class Chain是在模块里定义的类一种方法是from Chain import Chain还有一种方法是用 a = Chain.Chain() 相当于从模块里索引出这个类两种方法都可以.

老边区15217915936: 在python中怎样重新设定一个类中的函数只需输入这个函数的内容而不需要重新再将类输入一遍? -
洪查舒林: 你指的是在Python解释器里面定义函数吗? 对于这个情况可以通过键盘上下键翻出刚才写的类或函数,在需要修改的地方改好后回车就可以了.对于类比较大的情况还是建议在脚本内写,可以持久保存嘛.

老边区15217915936: python中的函数参数为自定义类对象,如何强 -
洪查舒林: 函数参数有直接变量(如int、char、double等)类型、指针类型和引用类型.如果参数是变量,传递方式是传值,就是将实参的值复制(复制,意味着空间消耗和时间消耗)到“栈”空间中.如果参数是指针,传递方式是传址,需将指针复制(...

老边区15217915936: python怎么用class定义的类 -
洪查舒林: 这里有个二叉树的例子 class TreeNode(object): def __init__(self,data = 0,left = 0,right = 0): self.data = data self.left = left self.right = right class BTree(object): """docstring for BTree""" def __init__(self, root=0): self.root = root def is_empty(self...

老边区15217915936: Python写类? -
洪查舒林: 创建类的方法比较简单,如下: class Person: 注意,类的名称一般用大写字母开头,这是惯例.当然,如果故意不遵循此惯例,也未尝不可,但是,会给别人阅读乃至于自己以后阅读带来麻烦.既然大家都是靠右走的,你就别非要在路中间睡...

老边区15217915936: python编程如何在类中定义file类型的属性 -
洪查舒林: 你可以试着这么写:class clsLog: Name = None File = None def __init(self, spath): Name = spath File = open(Name,'wb')

老边区15217915936: Python如何调用自定义类中的函数? -
洪查舒林: 定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构.这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行.如下实例调用了printme()函数:复制代码 代码如下:#!...

老边区15217915936: python, 怎么为已经建立的类添加“方法”? class A: pass 给这 -
洪查舒林: class A: def func(): print("class A func") B=A() B.func()定义函数会吧,在类下用def定义函数就是类的方法

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网