我以此代码为例:
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
答案 0 :(得分:1)
您似乎尝试使用i
和count
作为迭代时使用的两个不同值,我认为您不需要这样做才能获得你想要的。
首先 - 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(":(")
编辑:看到原始代码后,看起来您正在尝试生成生成器对象。
将yield
与while
或for
结合使用可以为您创建一个生成器 - 您可以迭代的对象。这是一个基线的例子。
>>> 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
)尚未,您也可以选择将来这样做。