条件的Python循环

条件的Python循环

问题描述:

函数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

您可以使用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 

好了,你可以随时使用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

您不能内联该条件,但可以防止输入内循环。

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参数,你可以尝试