2017-02-21 80 views
1

函數f將做不必要的迭代。條件的Python循環

def f(array): 
    for (i, row) in enumerate(array): 
     for (j, value) in enumerate(row): 
      if i < some_number and j > some_other_number: 
       do_something 

for循環中是否存在一種強制執行條件的慣用方法?

def f(array): 
    for (i < some_number, row) in enumerate(array): 
     for (j > some_other_number, value) in enumerate(row): 
      do_something 
+1

即使這是可能的,同樣會反覆做 –

+0

但是由於'i'總是增加'break'可能是有用的在這裏。 – BallpointBen

+0

爲什麼不使用while循環? – rassar

回答

3

您可以使用itertools.islice(iterable,start,stop[,step])爲:

from itertools import islice 

def f(array): 
    for (i, row) in islice(enumerate(array),some_number): 
     for (j, value) in islice(enumerate(row),some_other_number+1,None): 
      # do_something 
      pass

鑑於你不需要ij在你的計算(你只需要他們對於邊界檢查,你甚至可以忽略它們)。

from itertools import islice 

def f(array): 
    for row in islice(array,some_number): 
     for value in islice(row,some_other_number+1,None): 
      # do_something 
      pass 
3

好了,你可以隨時使用range

def f(array): 
    for i in range(some_number, len(array)): 
     row = array[i] 
     for j in range(some_other_number, len(row)): 
      value = row[j] 
      # do_something 

提供some_number不依賴於rowsome_other_number不依賴於value。否則,你什麼都不能做。

請注意,這需要arrayrow對象支持__getelement__(例如,當兩者都是真實列表時)。它不適用於發電機。

+0

然而,只有'array'和'row'支持'__getelement__'時,這纔會起作用。不是生成器等,但+1(也許值得一提)。 –

+0

@WillemVanOnsem True。 – freakish

1

您不能內聯該條件,但可以防止輸入內循環。

def f(array): 
    for (i, row) in enumerate(array): 
     if i < some_number: 
      for (j, value) in enumerate(row): 
       j > some_other_number: 
        do_something 

enumerate確實有start參數,你可以嘗試