[英]How to fix the __iter__ method
from collections import defaultdict
from goody import type_as_str
class Bag:
def __init__(self, i=None):
self.bag = []
if i == None:
pass # i is None, do nothing after create empty bag
elif type(i)==list:
self.bag.extend(i) # append whole list i into bag with extend method
else:
self.bag.append(i) # append single item i into bag
def __repr__(self):
for s in self.bag :
return s
def __str__(self):
for s in self.bag :
return s
def __len__ (self):
if 'Bag()' in self.bag:
return 0
else:
return len(self.bag)
def unique(self):
l = []
if len(self.bag) == 0:
return 0
else:
for x in self.bag:
if x not in l:
l.append(x)
else:
continue
return len(l)
def __contains__ (self,i):
if i in self.bag:
return True
else:
return False
def count(self,i):
return self.bag.count(i)
def add(self,i):
self.bag.append(i)
def __add__(self,i):
for x in i:
self.bag.append(x)
def remove(self,i):
if i not in self.bag:
raise ValueError
for x in self.bag:
if x == i:
self.bag.remove(x)
break
def __eq__ (self,i):
return self.bag == i
def __ne__ (self,i):
return self.bag != i
def __iter__(self):
class PH_iter:
def __init__(self,i):
self.l = i
def add(self,i):
self.l.append(i)
def remove(self,i):
self.l.pop(i)
return PH_iter(self.l)
if __name__ == '__main__':
#driver tests
import driver
driver.default_file_name = 'bsc1.txt'
# driver.default_show_exception= True
# driver.default_show_exception_message= True
# driver.default_show_traceback= True
driver.driver()
Bag 函数一般返回一个列表。 编写 Bag() 构造一个空包。 写作 Bag(['d','a','b','d','c','b','d']) 用一个 'a'、两个 'b's、一个 'c' 构造一个包,和三个'd'。
应该在 bag 类中定义iter方法以从列表中添加或删除项目。
输入是:
# Test iterator
e-->[i for i in sorted(b)]-->['a', 'b', 'b', 'c', 'd', 'd', 'd']
c-->i = iter(b)
c-->b.add('d')
c-->b.remove('a')
e-->[i for i in sorted(b)]-->['b', 'b', 'c', 'd', 'd', 'd', 'd']
e-->[i for i in sorted(x for x in i)]-->['a', 'b', 'b', 'c', 'd', 'd', 'd']
我得到的错误是:
94 # Test iterator
95 *Error: [i for i in sorted(b)] raised exception AttributeError: 'Bag' object has no attribute 'l'
96 *Error: i = iter(b) raised exception AttributeError: 'Bag' object has no attribute 'l'
99 *Error: [i for i in sorted(b)] raised exception AttributeError: 'Bag' object has no attribute 'l'
100 *Error: [i for i in sorted(x for x in i)] raised exception NameError: name 'i' is not defined
谁能帮我修复iter函数以使其正常工作? 非常感谢。
在__iter__
,这一行导致了运行时错误
return PH_iter(self.l)
它应该是
return PH_iter(self.bag)
而且这个实现会在迭代之后给你一些惊喜,因为它实际上修改了self.bag
的数据内容
您可以通过以下方式改进它
def __iter__(self):
class PH_iter:
def __init__(self,i):
self.l = list(i) # make a copy of the list i
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.