2014-09-26 43 views
2

我想知道是否有可能改變它的for循環中的迭代器的值?如何在Python中循環中更改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! 

我的問題:是否有可能改變最後兩行的方式,當我改變inumberif塊中,它們的值在for循環中變化!

更新:將迭代器定義爲global變量,可以幫助我嗎?爲什麼?

+3

我希望有人會用代碼回答你說你想做的事,但簡短的回答是「不」 ......當你改變'number'的值在這裏不會改變這個值:'range(2,number + 1)',因爲這是一個表達式,它已經被評估並且返回了一個正在循環的數字列表 – Anentropic 2014-09-26 17:07:04

+0

不是,不是與你在這裏寫的東西。有辦法,但至少可以說很棘手。 – mgilson 2014-09-26 17:07:39

+0

改爲使用while循環。 (Uglier,但適用於你正在嘗試做的工作)。 – vanza 2014-09-26 17:08:12

回答

2

簡短回答(像丹尼爾·羅斯曼的):沒有

龍答:沒有,但這個你想要做什麼:

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

Python的for循環就好其它語言的foreach循環。你的i變量不是計數器,它是列表中每個元素的值,在這種情況下是2和數字+ 1之間的數字列表。即使您更改了值,也不會改變該列表中的下一個元素。

+0

將該迭代器定義爲「全局」變量無法幫助我?我記得在C++中可以改變block中的for循環迭代器的值! – TheGoodUser 2014-09-26 17:37:26

+1

@TheGoodUser:請儘量避免修改全局變量:幾乎總是有更好的方式來做事情。 – 2014-09-26 21:13:56

2

處理這個問題的標準方法是完全ifor循環本身的身體排出的分歧:

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 
1

改變未來價值的唯一方法產生是以某種方式告訴什麼可迭代的下一個值,以產生應該。有了大量的標準迭代,這是不可能的。但是,你可以用一個特殊編碼發生器做到這一點:

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循環讀取,但它確實表明發送的東西可以爲團隊發生器指向你下一個當地節目的瑣事之夜。

1

這是不可能的,你這樣做。該爲循環變量可以改變內部每次循環迭代,像這樣:

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

產生的輸出是:

1 
2 

2 
3 

3 
4 

4 
5 

5 
6 

確實獲取每個用於內部改性循環迭代。

其原因由Python的for循環顯示的行爲是,在每次迭代開始時,爲循環變量被assinged從指定迭代未使用的值。因此,無論您對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 
相關問題