【问题标题】:Python conversion madnessPython转换疯狂
【发布时间】:2011-12-22 13:11:37
【问题描述】:

我有一个与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 是另一个的左侧赋值?

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

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

【问题讨论】:

  • 这个函数的第一行是一种非常可怕的编码风格。 for t in xrange(len(pts)): m = 2 ** 2 ** t 更快、更短且更易于阅读。

标签: python syntax for-loop list-comprehension


【解决方案1】:

要理解这段代码,首先需要理解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 有一些例子很好的解释。

【讨论】:

  • 哈,太好了!它开始变得有意义。最后一件事:你能说出 pts[i:i + m] 是什么意思吗?我猜这是一个子数组吗?
  • @roamcel - 请参阅我的编辑,该语法称为切片,它完全按照您的想法执行 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多