我正在尝试将一行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)] ) ) )
答案 0 :(得分:2)
这意味着“找到outreg2
或reg <- 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]