了解 Python 的 itertools.chain 和下一步



我正在尝试将一行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设置为当前点并突破。否则,我们将继续迭代,假设其中一个点最终会成功。

相关内容

最新更新