我想知道是否可以在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
块中的number
和if
时,它们的值会更改{{1循环!
更新:将迭代器定义为for
变量,可以帮到我吗?为什么呢?
答案 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