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'语句是否返回一个值?!?!
感谢和抱歉的初学者问题。
答
要了解此代码,您首先需要了解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与一些例子很能说明问题。
这个函数的第一行是一个非常可怕的编码风格。对于xrange(len(pts))中的t:m = 2 ** 2 ** t'更快,更短并且更容易阅读。 –