循环里面循环?

时间:2014-04-02 03:44:21

标签: python loops while-loop

我以此代码为例:

for i in func(x):
    count = 1
    while i > 0:
        if count % 2 == 0:
            print("(:")
            count += 2
        else:
            print("(:")
            count += 2

或者这个:

for i in func(x):
    count = 0
    if count % 2 == 0:
        print("(:")
        count += 1
    else:
        print(":(")
        count += 1

它们无法正常工作,因为我希望它们能够正常工作。

第一个只是进入一个无限循环,第二个只打印出快乐的笑脸 我希望它打印出幸福的笑脸,然后是悲伤的笑脸,等等。

这是原始code

2 个答案:

答案 0 :(得分:1)

您似乎尝试使用icount作为迭代时使用的两个不同值,我认为您不需要这样做才能获得你想要的。

首先 - while语句基本上是一个循环,直到它为False。所以,如果你有

green = True
while green:
    print("Hello")

......这永远不会结束。将while置于for循环中并不会改变这种情况;它只是等待while my_condition变为假。

此外,在您的第一个循环中,您正在递增count - 但while循环正在查看i的值,因为while永远不会有机会更改永远不会变得不真实!

最后 - 在第二个循环中,您在每次迭代开始时设置count!这意味着count永远不会以有意义的方式实际进步;你将它设置为0,打印表情符号,将其递增2,然后继续for循环 - 将count重置为0!

基本上,只要意识到您可以直接使用i,也不需要count变量。 for i in something将迭代something中的任何内容(如果它是可迭代的东西)。例如:

for i in range(0, 10):
    if i % 2 == 0:
        print(":)")
    else:
        print(":(")

编辑:看到原始代码后,看起来您正在尝试生成生成器对象。

yieldwhilefor结合使用可以为您创建一个生成器 - 您可以迭代的对象。这是一个基线的例子。

>>> def baz(x):
...     i = 0
...     while i > x:
...             yield i
...             i += 1
>>> baz(4)
<generator object baz at 0x1004935a0>
>>> me = baz(4)
>>> me.next()
0
>>> me.next()
1
>>> me.next()
2
>>> me.next()
3
>>> me.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> 

在您只想生成一定数量的对象的情况下,您可以跳过while并只写一个for,这样可以节省几行。例如,以下代码与上面的代码相同:

def foo(x):
    for i in range(0, x):
        yield i

但是,在您向我展示的示例中,while循环期间似乎有更多涉及的数学运算,因此有时使用while是有意义的。想象一下当i成为素数时你想要退出循环的情况,例如......

def until_prime(x):
    while is_not_prime(x): ## or, 'while not is_prime(x)', whatever our imaginary function does
        x = x * (x + 1)
        yield x

我不知道上面的代码是否会产生一个素数,所以请不要太严厉地判断它。 :D然而,这是一个你不能写for循环的情况的一个例子,所以你需要等到出现这种情况。

答案 1 :(得分:1)

您可能需要enumerate()功能。似乎永远不会使用i,但这实际上是无关紧要的。

枚举函数采用可迭代(所以你可以循环的任何东西)并返回一个带有计数和每个项目的元组。

for index,item in func(x):
    if index % 2 == 0:
        print("(:")
    else:
        print(":(")

这样,即使您不使用i(或上述情况item尚未,您也可以选择将来这样做。