如何在Python的循环中更改for循环迭代器变量?

时间:2014-09-26 17:02:35

标签: python python-2.7 python-3.x

我想知道是否可以在for-loop中更改迭代器的值?

例如,我想编写一个程序,以下面的方式计算数字的素因子:

def primeFactors(number):
    for i in range(2,number+1):
        if (number%i==0)
            print(i,end=',')
            number=number/i 
            i=i-1 #to check that factor again!

我的问题:是否可以更改最后两行,当我更改i块中的numberif时,它们的值会更改{{1循环!

更新:将迭代器定义为for变量,可以帮到我吗?为什么呢?

5 个答案:

答案 0 :(得分:2)

没有

Python的for循环就像其他语言一样' foreach循环。您的i变量不是计数器,它是列表中每个元素的值,在这种情况下是2和数字+ 1之间的数字列表。即使您更改了该值,也不会更改该列表中的下一个元素。

答案 1 :(得分:2)

简短回答(如Daniel Roseman's):否

答案很长:不,但这可以做你想要的:

def redo_range(start, end):
    while start < end:
        start += 1
        redo = (yield start)
        if redo:
            start -= 2

redone_5 = False
r = redo_range(2, 10)
for i in r:
    print(i)
    if i == 5 and not redone_5:
        r.send(True)
        redone_5 = True

输出:

3
4
5
5
6
7
8
9
10

如您所见,5会重复出现。它使用了一个生成器函数,它允许重复索引变量的最后一个值。有更简单的方法(while循环,要检查的值列表等)但是这个方法与您最接近的代码匹配。

答案 2 :(得分:2)

处理这个问题的标准方法是在i循环本身的主体中用for完全消耗除法:

def primeFactors(number):
    for i in range(2,number+1):
        while number % i == 0:
            print(i, end=',')
            number /= i

一步完成除法和余数的效率稍高一些:

def primeFactors(number):
    for i in range(2, number+1):
        while True:
            q, r = divmod(number, i)
            if r != 0:
                break
            print(i, end=',')
            number = q

答案 3 :(得分:1)

更改下一个值的唯一方法是以某种方式告诉iterable下一个要生成的值应该是。有很多标准的迭代,这是不可能的。但是,您可以使用特殊编码的发生器来实现:

def crazy_iter(iterable):
  iterable = iter(iterable)
  for item in iterable:
    sent = yield item
    if sent is not None:
      yield None  # Return value of `iterable.send(...)`
      yield sent

num = 10
iterable = crazy_iter(range(2, 11))
for i in iterable:
  if not num%i:
    print i
    num /= i
    if i > 2:
      iterable.send(i-1)

我绝对不会认为这比同等的while循环更容易阅读,但它确实展示了向生成器发送内容,这可能会在您下一个本地编程琐事之夜获得您的团队积分。

答案 4 :(得分:1)

你做这件事的方式是不可能的。 for循环变量 可以在每次循环迭代中更改内部,如下所示:

for a in range (1, 6):
    print a
    a = a + 1
    print a
    print

结果输出为:

1
2

2
3

3
4

4
5

5
6

确实在每个 for循环迭代中进行修改。

Python for循环显示行为的原因是,在每次迭代开始时, for循环变量被赋予 指定的迭代器 中的未使用值。因此,您对 for循环变量所做的任何更改都会在每次迭代开始时被有效地销毁。

要实现我认为您可能需要的东西,您应该使用 while循环,提供您自己的计数器变量,您自己的增量代码和任何特殊情况修改对于它你可能需要你的循环。例如:

a = 1
while a <= 5:
    print a
    if a == 3:
        a = a + 1
    a = a + 1
    print a
    print

结果输出为:

1
2

2
3

3
5

5
6