我正在尝试将一行Python代码转换为JavaScript,但我的Python知识有限,并且很难理解它。
任何人都可以尝试解释以下代码行吗?point_orientation
函数并不重要,它只返回 True/False。
i_extend = next( ( i for i in itertools.chain(range(i_start+1, len(p)), range(0,i_start+1)) if not point_orientation( p[i-1], p[i], p[(i+1) % len(p)] ) ) )
它的意思是"在range(i_start+1, len(p))
或range(0,i_start+1)
(如果第一个范围没有(中查找第一个元素i
,以便point_orientation( p[i-1], p[i], p[(i+1) % len(p)] )
为假"。如果没有这样的i
,它将引发异常。
这是更冗长的Python:
def check(i):
return point_orientation(p[i - 1],
p[i],
p[(i + 1) % len(p)])
def find_i_extend():
for i in range(i_start + 1, len(p)):
if not check(i):
return i
for i in range(0, i_start + 1):
if not check(i):
return i
i_extend = find_i_extend()
chain
将两个迭代器拼接成一个。在这里,它被用来帮助模拟从特定点开始的闭合循环。观察
range(0, len(p)) == chain(range(0, i_start+1), range(i_start+1, len(p))
给定的代码将参数交换到 chain
,以便它将类似 [0,1,2,...,10]
的序列转换为像 [5,6,...,10,0,1,...,4]
这样的序列。谓词的三个参数只是循环中的相邻项,(i+1) % len(p)
在序列的末尾进行环绕。 next
仅用于获取结果序列的第一个元素。
如果您放弃尝试用单行代码表达这一点,则可以编写以下更易于理解的代码:
n = len(p)
for i in range(i_start + 1, i_start + 1 + n):
index_before = (i - 1) % n
index_at = i % n
index_after = (i+1) % n
if not point_orientation(p[index_before], p[index_at], p[index_after])
i_extend = y
break
我们在单个范围内迭代,并对循环中的每个索引进行模块化算术。如果谓词通过,我们将i_extend
设置为当前点并突破。否则,我们将继续迭代,假设其中一个点最终会成功。