Python的转换疯狂

问题描述:

我有相关的Python代码的认识问题: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'语句是否返回一个值?!?!

感谢和抱歉的初学者问题。

+0

这个函数的第一行是一个非常可怕的编码风格。对于xrange(len(pts))中的t:m = 2 ** 2 ** t'更快,更短并且更容易阅读。 –

要了解此代码,您首先需要了解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与一些例子很能说明问题。

+0

哈,太棒了!它开始有意义。最后一件事:你能说出pts [i:i + m]是什么意思吗?这是我猜的子阵列吗? – roamcel

+0

@roamcel - 查看我的编辑,该语法被称为切片,并且它的确如你所想的那样:) –

+0

真棒,谢谢! – roamcel