【问题标题】:How could I make an infinite "For" loop able to save values, without using "while"?如何在不使用“while”的情况下创建一个能够保存值的无限“For”循环?
【发布时间】:2018-03-27 12:51:56
【问题描述】:

我正在学习 Python(使用 3.6.2),在上一堂课上,他们要求我做一些我需要创建无限 for 循环的事情。出于某种原因,老师不希望我们在整个练习中使用while。 这就是复杂的地方......

所以,我一直在寻找一种方法来做到这一点。但是,这也很困难,因为老师不希望我们使用我们在课堂上没有见过的任何命令。所以我不能使用.append, sys functions,好吧,我什至不能使用break。我必须找到一种方法来处理 "simple" 命令。

我以为我可以这样做;

x=1
    for i in range(x):
    do_something()
    x += 1

但是,它似乎不起作用。我认为这是因为 Python 不再读取范围的值?

我找不到方法,但经过数小时的思考,我发现自己可以使用一个小解决方法:

def ex():
    print("Welcome")
    for i in range(1):
        math = int(input("Please insert grades obtained at Math, or insert 666 to exit" ))
        if(math > 0 and math < 60):
            print("Sorry. You failed the test")
            return ex():
        elif(math >= 60 and math <= 100):
            print("Congratulations. You passed the test")
            return ex():
        elif(math == 666):
            return exit()
        else:
            print("ERROR: Please insert a valid number")
            return ex():

def exit():
     pass

如您所见,它“无限”的原因在于它一次又一次地返回函数,直到您告诉程序“退出”,通过输入“666”。我也想有一个更合适的方法来退出函数。

我仍然想知道是否有更好的方法让我的 for 循环无限直到用户调用它停止。但是,通过一种或另一种方式,我让这个练习奏效了。当我开始使用第二个时,问题就出现了,它或多或少是这样的:

想象一下过去的相同程序,但这一次,它不会只显示您是否通过了测试。它希望通过输入收集您输入的尽可能多的成绩,然后计算所有成绩的平均值。我无法保存这些值(成绩),因为我每次都“重新启动”我自己的功能。

而且根据我老师的指示,我不能问用户他要我计算多少分。它必须是无限的,并且一直要求输入,直到用户选择不这样做。

我真的迷路了。这是非常困难和令人沮丧的,因为如果我们可以使用 while's 会更容易:(而且更难的是因为我们不能使用我们没有见过的任何选项......

所以,我有 3 个问题:

  • 如何创建适当的“无限”for 循环?
  • 我该如何以正确的方式“完成”它?
  • 如何使它能够保存值?

非常感谢任何愿意提供帮助的人,并为我的无知感到抱歉。
我是社区的新手,所以任何关于我的问题、问题格式或任何内容的建议都会受到好评:)

编辑:我和我的老师谈过,他允许我使用itertools 或者只是一个大到无法达到的范围。现在我想知道,如何将这些值保存在 for 中以供以后操作?

【问题讨论】:

  • 这很难回答,因为我们不知道您在课堂上看到了什么 - 但是导入和使用 itertools.count (docs.python.org/2/library/itertools.html#itertools.count) 会解决这个问题吗?
  • 你没有什么可道歉的。这是一项愚蠢的任务,被分配不是你的错。
  • 我预计会发生这种情况:/ 是的,不幸的是我不能使用它。我在论坛上发现了这一点,但我无法使用itertools。不过,感谢您尝试提供帮助。这对我来说也很困难,因为我知道很难以这种方式找到解决方案,但我不知道我还能做什么:/
  • 老师不希望我们使用我们在课堂上没有见过的任何命令 - 这太荒谬了。有什么办法可以解雇你的白痴老师?
  • Infinite for loops possible in Python? 的可能重复项。显然,一切都是骗局……

标签: python for-loop


【解决方案1】:

如果您不允许使用itertools,并且您仅限于基本的语言结构,并且不允许使用while,那么我要告诉您一些不幸的消息;

这可能是不可能的。至少不使用 python for 循环。

我建议您与班主任联系,让他们澄清要求。这些知识没有实际应用,所以我很想知道这个作业的目标是什么。

注意;在支持实际 for 循环(即,而不是 foreach 循环)的其他语言中,这是可能的,所以也许这个任务的分配者从不同的语言类移植了这个问题?


编辑;现在您可以使用 itertools,我建议您使用我最初在 cmets 中给出的答案;

from itertools import count
for i in count():
    pass  # this will loop for longer than you will live.

有了这个,再加上在循环之前创建的列表,你应该可以毫不费力地跟踪成绩和计算他们的平均成绩。

【讨论】:

  • 我明白了...嗯,很遗憾我花了好几个小时想办法找到解决办法...但我认为你是对的。我不确定他对我们有什么期望,但我会及时通知你们我们得到的任何信息。非常感谢您的帮助。我应该关闭问题吗?
  • 不-保持打开状态。如果确实没有适合的解决方案,请给我打勾 - 但如果您找到一个或老师让您知道,请随时将其发布为您自己的答案。这个问题稍后可能会被清理干净,但如果没有别的,我很好奇这位老师的意图。
  • 使用常规的for 循环当然可能这样做,但我不推荐它。
  • 我怀疑我也不会教它:P 这是我认为这位老师可能的唯一意思。
  • 谢谢你们的帮助,伙计们。今天我没有和那个老师上课,但我去找他,这样我们就可以谈谈了。似乎他理解了,他告诉我我可以使用 itertools 或者只是一个足够大的范围(他告诉我们不要——不过,在他给我们分配任务的那天)。所以现在,如果没有太多要问的问题,您能否指导我一些关于如何使用这些选项中的任何一个来解决问题,例如我的问题中黄色块中的问题?大多数情况下,我不知道如何保存这些值以便以后计算平均值。
【解决方案2】:

你能试试这样的吗:

for i in iter(int, 1):
    print("Infinite for loop executing")

有关更多信息,请参阅this 关于不带while 的无限迭代器的问题。

【讨论】:

  • “出于某种原因,老师不希望我们在整个练习过程中使用 while。” - 此答案无效。
  • 不幸的是,我无法将while 用于任何事情:(。不过,感谢您的帮助
  • @oScarDiAnno 你能用iter()函数吗?
  • @akhilsp 谢谢老兄。我们还没有在课堂上看到这个功能,但是看到没有任何我可以使用的选项,我想我会使用这个或itertools 解决方案并告诉我的老师我试过但我找不到其他方法。
【解决方案3】:

我讨厌这样的“技巧”问题,这些问题与您在现实世界中如何使用 Python 几乎没有关系。不过不管怎样……

这里的技巧是遍历您在for 循环中修改的列表。这通常被认为是一种不好的做法,但我们可以在这里利用它来完成这个人为的分配。

我们要求用户在函数内输入,因此我们可以使用return 退出循环,因为您不允许使用break。

def get_data(prompt):
    lst = [None]
    for i in lst:
        s = input(prompt)
        if not s:
            return lst[1:]
        lst += [int(s)]
        print(lst)

print('Enter data, one number at a time. Enter an empty line at the end of the data')
lst = get_data('Number: ')
print('Data:', lst)

演示

Enter data, one number at a time. Enter an empty line at the end of the data
Number: 3
[None, 3]
Number: 1
[None, 3, 1]
Number: 4
[None, 3, 1, 4]
Number: 1
[None, 3, 1, 4, 1]
Number: 5
[None, 3, 1, 4, 1, 5]
Number: 9
[None, 3, 1, 4, 1, 5, 9]
Number: 
Data: [3, 1, 4, 1, 5, 9]

【讨论】:

  • 非常感谢,这是一个聪明而有趣的解决方案,我同意你的观点,这是一个“人为”的任务。从您的代码中,我唯一看到的是我们还没有看到append。但是,我会收集这些解决方案并向我的老师展示我的发现,以便他可以看到我们确实尝试过,但我们发现如果不使用 whiles 或 anything we have' 就无法做到这一点没见过。所以这很有帮助,另外,学习新东西总是好的:)。再次感谢!
  • 太棒了!我将尝试使我的代码与它一起工作并将其呈现给我的老师,希望它能够满足他的期望,哈哈。谢谢你:)
  • 谢谢您,我接受了您的回答并尝试了该程序。但是,现在我获得了使用 itertools 或大范围的许可。我有兴趣使用此解决方案或其他解决方案之一,以更合适的为准,但我仍然需要一些帮助来了解如何在 foo 循环中存储来自输入的值。如果您有任何建议,我将不胜感激,如果您愿意在那里回复,我创建了一个新的question,以防您有任何建议。再次感谢伙计! :)
  • @oScarDiAnno 如果我的代码中有您不理解的内容,请在此处询问。
  • 谢谢你。我又运行了一次代码,在运行和阅读代码时,我想我理解得更好了。我将解释代码,看看我是否明白,如果我错了,请纠正我。我们在范围内使用 [None],它是一个列表,因为如果它是空的,它将不会启动循环。但是, • 问:函数内部的(提示)和“s”输入是什么,为什么需要它?然后,我们通过“s”输入插入数字,然后list = list + integer of s,就是我们刚刚输入那个变量的数字...
【解决方案4】:

基于类的 Python 3.x 无限循环:

class loop_iter(object):
    def __iter__(self):
        return self
    def __next__(self):
        # for python2.x rename this method to `next`

        # Return the next item from the container.
        # If there are no further items, raise the StopIteration exception.
        # Because this is infinite loop - StopIteration is not raised
        return None

class infinite_loop(object):
    def __iter__(self):
        # This method is called when an iterator is required for a container. 
        # This method should return a new iterator object that can iterate over all the objects in the container.
        # For mappings, it should iterate over the keys of the container, and should also be made available as the method keys().

        # Iterator objects also need to implement this method;
        # they are required to return themselves.
        # For more information on iterator objects, see Iterator Types.
        return loop_iter()

x = []
# thx PM 2Ring for text
print('Enter data, one number at a time. Enter an empty line at the end of the data')  

for _ in infinite_loop():
    line = input('Number: ')

    if line:
       x += [int(line)]
       continue

    print('Average:', sum(x)/len(x))  # average
    exit()

【讨论】:

  • 大声笑。基本概念我落后。
  • @MadPhysicist 但为什么呢?
  • 也许他的意思是它们不是“基本概念”,因为他知道我不能使用很多我们在学校课堂上没见过的东西,而且,老实说我们还没有见过 class , 例如。但是,我很感激你试图提供帮助 :) 谢谢伙计!
  • @Yaroslav。在 OP 理解的意义上,我的评论是幽默的。从功能上讲,您的答案很好。我没有赞成它只是因为它不属于原始问题的限制。
  • @MadPhysicist 很公平
猜你喜欢
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
相关资源
最近更新 更多