Python转换疯狂

时间:2011-11-05 06:45:05

标签: python syntax for-loop list-comprehension

我有一个与python相关的代码理解问题:

def convex_hull(pts):
    """Returns the points on the convex hull of pts in CCW order."""
    for m in (2 ** (2 ** t) for t in xrange(len(pts))):
        hulls = [_graham_scan(pts[i:i + m]) for i in xrange(0, len(pts), m)]
//more code

我无法弄清楚这两个'for'应该如何工作。

可悲的是,命令参考没有显示这样的用法示例,我无法确定它是否真的 - 意味着一个是另一个的左侧分配?

此外,底部任务可能意味着什么? 'for'语句是否返回值?!?!

感谢和抱歉初学者问题。

1 个答案:

答案 0 :(得分:11)

要理解此代码,首先需要了解list comprehensionsgenerator expressions。这是一个简单的列表理解的例子:

>>> [str(i) for i in range(5)]
['0', '1', '2', '3', '4']

如您所见,这一行与以下常规for循环相同:

lst = []
for i in range(5):
    lst.append(str(i))

基本上,它是创建列表的简写。生成器表达式是类似的,除了返回一个生成器而不是返回一个列表,它将产生与列表推导相同的值,而不实际创建完整列表。当您要循环遍历值时,这会更有效。

现在背景已经不在了,以下是使用常规for循环扩展代码的方法:

def convex_hull(pts):
    """Returns the points on the convex hull of pts in CCW order."""
    for t in xrange(len(pts)):
        m = 2 ** (2 ** t)
        hulls = []
        for i in xrange(0, len(pts), m):
            hulls.append(_graham_scan(pts[i:i + m]))
    # more code

至于你的评论,pts[i:i + m]正在从索引i到索引i + m获取一小部分列表,你基本上可以读取这样的片段:

[first index to include : first index to exclude : step]

This answer对一些例子有很好的解释。