Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中更改循环中的循环迭代器变量?_Python_Python 2.7_Python 3.x - Fatal编程技术网

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

如何在Python中更改循环中的循环迭代器变量?,python,python-2.7,python-3.x,Python,Python 2.7,Python 3.x,我想知道是否有可能在for循环中更改迭代器的值 例如,我想写一个程序,用下面的方法计算一个数的素数因子: 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! 我的问题:当我在

我想知道是否有可能在for循环中更改迭代器的值

例如,我想写一个程序,用下面的方法计算一个数的素数因子:

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!
我的问题:当我在
if
块中更改
I
number
时,最后两行的值是否可以在
for
循环中更改

更新:将迭代器定义为
global
变量可以帮助我吗?为什么?没有

Python的
for
循环与其他语言的
foreach
循环类似。您的
i
变量不是计数器,它是列表中每个元素的值,在本例中是介于2和number+1之间的数字列表。即使您更改了该值,也不会更改该列表中的下一个元素。

简短回答(如Daniel Roseman的):否

长回答:不,但这正是你想要的:

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

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

处理这一问题的标准方法是通过
循环本身的
体中的
i
完全耗尽分区:

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

改变下一个收益值的唯一方法是以某种方式告诉iterable下一个收益值应该是什么。对于许多标准的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
循环更容易阅读,但它确实演示了将内容发送到生成器,这可能会在下一个本地编程琐事之夜为您的团队赢得分数。

您这样做是不可能的。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
1
2

2
3

3
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

我希望有人会用代码回答你所说的你想做的事情,但简短的回答是“不”。。。当您更改
number
的值时,它不会更改此处的值:
range(2,number+1)
,因为这是一个已经计算过的表达式,并且返回了一个正在循环的数字列表,而不是您在此处编写的内容。有很多方法,但至少可以说是很棘手的。使用while循环代替。(更难看,但适用于您正在尝试做的事情。)在python思想列表中有一些关于
continue with
语句的讨论,该语句允许注入到迭代器中,但是在迭代器周围编写一个自定义包装器是相当简单的,它已经允许这样的行为了。将迭代器定义为
global
变量对我没有帮助吗?我记得C++中可以在它的块中改变for循环迭代器的值!TheGoodUser:请尽量避免修改globals:几乎总是有更好的方法来做事情。
1
2

2
3

3
5

5
6