当前位置: 首页 > 知识库问答 >
问题:

python中的迭代器,应打印10个有效id号

齐建安
2023-03-14

下面是我目前为止的代码,代码应该实现一个迭代器,在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并将其打印到屏幕上。以下是您应该收到的输出:

共有1个答案

谭京
2023-03-14

我不明白你想在这里做什么:

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。我希望它只输出它在两个数组中出现的次数。编辑