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
不依赖row
,some_other_number
不依赖value
。否则你什么都做不了。
请注意,这需要 array
和 row
对象都支持 __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
鉴于您在计算中不需要 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
函数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
不依赖row
,some_other_number
不依赖value
。否则你什么都做不了。
请注意,这需要 array
和 row
对象都支持 __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
鉴于您在计算中不需要 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