我的意思是,如果我们看一下这个:
for i in range(0,10):
print i
if i == 5:
i += 1
#j = randint(6, 9)
#i = j
假设,j似乎是1.我希望跳过6。现在结果是0,1,2,3,4,5,6,7,8,9。我想要0,1,2,3,4,5,7,8,9。
请不要向我提供'继续'。 j可以在运行中计算。
我无法理解这里的行为。我在Java之后学习Python。我已经模仿了这个:
public class Test {
public static void main(String[] args){
for (int i = 0; i < 10; i++){
System.out.println(i);
if (i == 5){
i++;
}
}
}
}
这对我来说完全可以理解(6被跳过)。
你能评论一下Python循环的这种行为吗?
答案 0 :(得分:3)
Python的for
循环是许多其他语言&#39; foreach
循环。在这种情况下,它应该是有意义的:对于某些集合中的每个 x ,对每个 x 执行某些操作。您可以重新绑定循环体内x
所指的内容,但这并不会做任何事情,因为您只是让x
指向一个新对象(即使你设法改变x
,foreach
循环只是继续下一个项目,不关心你刚刚对x
做了什么。)
因此,您可以将while
循环与in the linked thread in the comments一起破解。这是一种方式。 (实际上,&#34; c风格&#34; for
循环只是编写while
循环的语法糖
或者,你可以写一个coroutine。生成器非常酷,而协程只是一个可以发送值的生成器 - 例如,如果你想告诉xrange
它应该完全迭代一些不同的数字:
def co_range(*args):
_range = iter(xrange(*args))
while True:
sent = yield next(_range)
if sent:
_range = iter(xrange(*sent))
yield
co = co_range(10)
for x in co:
print x
if x == 5:
co.send((15,20))
0
1
2
3
4
5
15
16
17
18
19
很明显,你可以进一步抽象出来并将任意迭代发送到你的生成器 - 正如你所看到的,如果语法中有点笨拙,协同程序就非常强大。对于简单的&#34;这是肯定过度杀戮;我想跳过一个数字&#34;但可能适合一些更复杂的跳到12然后可能回到4但后来给我15到20型逻辑的费用。
答案 1 :(得分:0)
在Python中没有意义,因为你遍历一个对象。 i
的当前值是迭代器中的下一个值。最好的解决方案是预先删除值,但跳过动态计算数据的正确解决方案是使用continue
。
答案 2 :(得分:-1)
假设您的问题是对您要实现的目标的完整描述:
for i in range(0, 10).remove(6):