我有一个与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'语句是否返回值?!?!
感谢和抱歉初学者问题。
答案 0 :(得分:11)
要理解此代码,首先需要了解list comprehensions和generator 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对一些例子有很好的解释。