理解Python的itertools.chain和下一个

时间:2018-04-21 17:51:39

标签: python for-loop itertools next code-translation

我正在尝试将一行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)] ) ) )

3 个答案:

答案 0 :(得分:2)

这意味着“找到outreg2reg <- lm(imbd_score ~ budget + duration + year + cast_total_facebook_likes, data = imbd) summary(reg) 中的第一个元素i(如果第一个范围没有),使range(i_start+1, len(p))为假”。如果没有这样的range(0,i_start+1),则会引发异常。

这里有更详细的Python:

point_orientation( p[i-1], p[i], p[(i+1) % len(p)] )

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

这里的itertools.chain只是从两个范围中制作一个列表,在这个上下文中可以更好地表达为(*range(i_start+1, len(p)), *range(i_start+1))。 (拆包:https://codeyarns.com/2012/04/26/unpack-operator-in-python/

next()只需获得下一个&#39;可迭代的项目,因为它直接在生成器表达式上运行,它用于获取第一个项目;同样,next(iter([1, 2, 3]))将返回1

如果它有帮助,可以用这种方式写一点惯用语 -

next(i for i in (*range(i_start+1, len(p)), *range(i_start+1)) if not point_orientation(p[i-1], p[i], p[(i+1) % len(p)]))

- 或者,如果next()仍然给您带来麻烦,您可以这样查看(请注意最后的[0]):

[i for i in (*range(i_start+1, len(p)), *range(i_start+1)) if not point_orientation(p[i-1], p[i], p[(i+1) % len(p)])][0]