理解 Python 的 itertools.chain 和 next

Posted

技术标签:

【中文标题】理解 Python 的 itertools.chain 和 next【英文标题】:Understanding Python's itertools.chain and next 【发布时间】:2018-04-21 17:51:38 【问题描述】:

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

【问题讨论】:

chain 基本上是泛化到任意迭代器的列表连接。 list(chain(list1, list2)) == list1 + list2. 我不知道为什么这被否决了。这段代码需要python知识才能破译。它查看两个整数范围并返回第一个满足if not point_orientation 要求的整数。它使用next 完成,因此操作在第一次匹配时停止。这可以在 javascript 中通过几个 for 循环来获得不同的范围,并在每个循环中复制测试。 【参考方案1】:

这意味着“在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()

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于理解 Python 的 itertools.chain 和 next的主要内容,如果未能解决你的问题,请参考以下文章

如何理解这段python程序

python基础知识的学习和理解

Python装饰器的通俗理解

python中self cls init的理解

简单理解python的垃圾回收机制

Python中的多态如何理解?(转帖,让我很理解。)