Python 有条件的循环

Python loops with conditions

函数f将进行不必要的迭代。

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

好吧,你可以随时使用 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__(例如,当两者都是真实列表时)。它不适用于发电机。

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

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

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

<b>from itertools import islice</b>

def f(array):
    for (i, row) in <b>islice(</b>enumerate(array)<b>,some_number)</b>:
        for (j, value) in <b>islice(</b>enumerate(row)<b>,some_other_number+1,None)</b>:
            # 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