下面是我目前为止的代码,代码应该实现一个迭代器,在check_id函数的条件下打印10个有效ID。
https://www.codepile.net/pile/b1PVdbBq
输出应该是:123456782 123456790 123456808 123456816 123456824 123456832 123456840 123456857 123456865 123456873但不知何故我的输出是错误的...帮助...
import string
letters = string.ascii_letters
digits = string.digits
class NumNotNineLong(Exception):
def __init__(self):
pass
def __str__(self):
return "The number you provided is not nine digits long."
class NotNumber(Exception):
def __init__(self):
pass
def __str__(self):
return "The input you provided is not an integer"
class IDIterator():
increment = 1
def __init__(self,_id):
self._id = _id
def __iter__(self):
return self
def __next__(self):
while check_id_valid(str(self._id)[-9::]) == False:
self._id *= 2
self._id += IDIterator.increment
IDIterator.increment += 1
if check_id_valid(str(self._id)[-9::]):
result = str(self._id)[-9::]
self._id *= 2
self._id += 1
IDIterator.increment = 2
return result
def check_id_valid(id_number): #A function that checks whether ID number are valid or not
for letter in str(id_number):
if letter not in string.digits:
raise NotNumber
numbers = [int(i) for i in str(id_number)]
if len(numbers) != 9:
raise NumNotNineLong
set_numbers = []
for i in range(len(numbers)):
if i % 2 == 0:
set_numbers.append(numbers[i])
else:
set_numbers.append(numbers[i] * 2)
true_numbers = []
for num in set_numbers:
if num > 9:
temp = [int(i) for i in str(num)]
true_numbers.append(sum(temp))
else:
true_numbers.append(num)
if sum(true_numbers) % 10 == 0:
return True
else:
return False
def main():
result = IDIterator(123456780)
for _ in range(10):
print(result.__next__())
if __name__ == "__main__":
main()
练习如下所示:一个名为check\u id\u valid的布尔函数,定义为:def check\u id\u valid(id\u number):该函数作为id number(integer)参数获取,并返回真布尔值(true),否则返回假值(false)。当check\u id函数是自包含的时,它工作得很好
然后应该实现一个类来表示名为IDIterator的迭代器。
此类有一个名为id_的属性,表示0到999999999范围内的ID号(此属性在创建迭代器实例时初始化)。
在上述类中必须使用返回迭代器实例的iter方法。
在上述类中,必须使用下一个方法,该方法返回ID\ uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
要检查您编写的代码是否正常工作,请使用您创建的类中的迭代器编写一个主程序。
具有下一个ID值的迭代器必须初始化为123456780,生成10个新ID并将其打印到屏幕上。以下是您应该收到的输出:
我不明白你想在这里做什么:
def __next__(self):
while check_id_valid(str(self._id)[-9::]) == False:
self._id *= 2
self._id += IDIterator.increment
IDIterator.increment += 1
if check_id_valid(str(self._id)[-9::]):
result = str(self._id)[-9::]
self._id *= 2
self._id += 1
IDIterator.increment = 2
return result
下面是您尝试使用的代码(但我不建议使用它,因为这不是他们要求的!):
class IDIterator:
def __init__(self, _id):
self._id = _id
self.ok = ""
def __iter__(self):
return self
def __next__(self):
x = self.ok
while not check_id_valid(str(self._id)[-9:]):
self._id += 1
else:
self.ok = self._id
self._id += 1
return x
我建议您使用以下代码:
class IDIterator:
def __init__(self, _id=0, range=999999999):
self._id = _id
self.range = range
self.count = 0
def __iter__(self):
return self
def __next__(self):
while self.count < self.range:
x = self._id
if not check_id_valid(x):
self._id += 1
else:
self._id += 1
self.count += 1
return x
else:
raise StopIteration
迭代器并不是Ruby发明的.它广泛地运用于各种面向对象语言.在Lisp中也有,只是不这么叫罢了.尽管如此,迭代器的概念并不为许多人熟悉,因此我们将在此做较为详细的介绍. 你知道,动词 iterate 的意思是做同一件事许多遍,因此,iterator就是用来将同一件事做许多次的东西. 当我们写代码时,我们需要各种环境下的循环.在C里,我们用for或者while.比如, char *str; for
问题内容: 您能想到一种很好的方法(也许使用itertools)将迭代器拆分为给定大小的块吗? 因此,with成为迭代器 我可以想到一个小程序来做到这一点,但是使用itertools并不是一个好方法。 问题答案: 在 从配方文件的食谱来靠近你想要什么: 但是,它将使用填充值填充最后一个块。 较不通用的解决方案仅适用于序列,但可以根据需要处理最后一个块 最后,一种可在一般迭代器上运行且其行为符合预期
问题内容: Python迭代器没有方法吗? 问题答案: 不,没有这样的方法。迭代结束由异常指示。请参阅文档。
前面章节中,已经对列表(list)、元组(tuple)、字典(dict)、集合(set)这些序列式容器做了详细的介绍。值得一提的是,这些序列式容器有一个共同的特性,它们都支持使用 for 循环遍历存储的元素,都是可迭代的,因此它们又有一个别称,即迭代器。 从字面来理解,迭代器指的就是支持迭代的容器,更确切的说,是支持迭代的容器类对象,这里的容器可以是列表、元组等这些 Python 提供的基础容器,
上面简单的介绍了一下迭代,迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。现在正式进入主题:迭代器,迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。 迭代器只能往前不会后退。 迭代器有两个基本的方法:iter() 和 next(),且字符串,列表或元组对象都可用于创建迭代器,迭代器对象可以使用常规 for 语句进行遍历,也
我尝试使用布尔值来仅显示是否找到我使用的代码: 然后在两个打印语句中,我输入: 并在底部放置: 并且仍然在为每个循环的每一次迭代获取输出。我试图做的是在中的每一次获得一个输出,该数字出现在已排序和未排序的中,然后是数组列表中所有数字的总和。 编辑1:我得到的当前输出是,它表示有多少个数字,因此它输出的是 time的数量,其中 是numOfNumbers。我希望它只输出它在两个数组中出现的次数。编辑