我可以将计数器置于for循环中(跳过一些迭代次数)吗?

时间:2014-05-04 20:45:50

标签: python loops

我的意思是,如果我们看一下这个:

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循环的这种行为吗?

3 个答案:

答案 0 :(得分:3)

Python的for循环是许多其他语言&#39; foreach循环。在这种情况下,它应该是有意义的:对于某些集合中的每个 x ,对每个 x 执行某些操作。您可以重新绑定循环体内x所指的内容,但这并不会做任何事情,因为您只是让x指向一个新对象(即使你设法改变xforeach循环只是继续下一个项目,不关心你刚刚对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):