Python itertools.chain与next用法解析及代码转JavaScript咨询
解析Python代码:寻找符合条件的索引
i_extend 咱们一步步拆解这段代码的逻辑,其实它就是在列表p里按特定顺序找第一个满足条件的索引i,然后把这个索引赋值给i_extend:
遍历顺序:绕列表循环一圈
代码里用了itertools.chain(range(i_start+1, len(p)), range(0,i_start+1)),这部分的作用是把两个索引范围拼在一起,生成一个连续的迭代序列:- 第一部分:从
i_start的下一个位置(i_start+1)开始,一直遍历到列表p的最后一个索引(len(p)-1) - 第二部分:接着从列表开头(索引0)遍历到
i_start
说白了就是:从i_start的下一个位置出发,绕着列表完整走一圈,最后回到i_start的位置。
- 第一部分:从
筛选条件:检查点的方向判断
遍历每个索引i的时候,会执行not point_orientation(p[i-1], p[i], p[(i+1) % len(p)]):p[i-1]、p[i]、p[(i+1) % len(p)]是列表里连续的三个点(因为(i+1) % len(p)处理了最后一个点的下一个索引回到开头的情况,而Python里索引-1对应列表最后一个元素,所以i=0时i-1就是最后一个点,完美实现循环取点)point_orientation会返回布尔值,我们要找的是这个函数返回False的那个i(因为前面加了not)
取第一个符合条件的索引
最外层的next(...)会直接从生成器里取出第一个满足筛选条件的i,把它赋值给i_extend——也就是说,只要找到第一个符合要求的索引,就停止遍历,不会继续往后找了。
举个简单例子:假设p的长度是5,i_start=2,那么遍历顺序是3→4→0→1→2。逐个检查每个i对应的三个点的point_orientation结果,第一个返回False的i就是最终的i_extend。
内容的提问来源于stack exchange,提问作者Even A. Rognlien
相关产品推荐
相关产品推荐

