条件的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
您可以使用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
鉴于你不需要i
和j
在你的计算(你只需要他们对于边界检查,你甚至可以忽略它们)。
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
不依赖于row
和some_other_number
不依赖于value
。否则,你什么都不能做。
请注意,这需要array
和row
对象支持__getelement__
(例如,当两者都是真实列表时)。它不适用于发电机。
然而,只有'array'和'row'支持'__getelement__'时,这才会起作用。不是生成器等,但+1(也许值得一提)。 –
@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
参数,你可以尝试
即使这是可能的,同样会反复做 –
但是由于'i'总是增加'break'可能是有用的在这里。 – BallpointBen
为什么不使用while循环? – rassar