我正在努力理解下面用python编写的“reduce”调用。
我在这里和其他地方都找到了一些资源,这些资源说明了函数的作用,并且在C中有一个与列表等价的“聚合”,但是我无法理解下面的调用实际上是什么-expect-。。。可能是因为我真的想不出“你留着你”的回报是什么?
所以:
有人能告诉我“你留下来”是什么吗?
2., [])
在reduce调用中是什么意思?
非常感谢。
TURN_LEFT, TURN_RIGHT, TURN_NONE = (1, -1, 0)
def turn(p, q, r):
"""Returns -1, 0, 1 if p,q,r forms a right, straight, or left turn."""
return cmp((q[0] - p[0])*(r[1] - p[1]) - (r[0] - p[0])*(q[1] - p[1]), 0)
def _keep_left(hull, r):
while len(hull) > 1 and turn(hull[-2], hull[-1], r) != TURN_LEFT:
hull.pop()
return (not len(hull) or hull[-1] != r) and hull.append(r) or hull
def _graham_scan(points):
"""Returns points on convex hull of an array of points in CCW order."""
points.sort()
lh = reduce(_keep_left, points, [])
uh = reduce(_keep_left, reversed(points), [])
return lh.extend(uh[i] for i in xrange(1, len(uh) - 1)) or lh
最佳答案
_keep_left
返回最初为空的列表。不向左的转弯将从中删除。当前点将被添加到其中,除非它已经是列表中的最后一个元素。hull
是要减少的第三个参数。它是初始累加器值,将传递给, [])
,从而使_keep_left
(最后,hull
和lh
)最初为空。
它首先对点进行排序,然后对所有点进行两次(uh
和lh
表示下半部分和上半部分)来执行Graham scan操作,每次扫描时,点都会累积到列表中。这些点用uh
累加,即结果最初为空,然后一个接一个地(按排序顺序)传递给reduce
,并且对于每个点,导致右转的点从累加列表中移除。然后将当前点添加到累积列表中。_keep_left
的返回值有点棘手:_keep_left
如果列表为空,则返回True。not len(hull)
检查hull[-1] != r
(当前点)是否是列表中的最后一个元素。r
在布尔表达式中只用于将hull.append(r)
附加到列表的副作用(对我来说有点脏),因此如果r
的最后一个元素是hull
,则返回r
而不附加hull
。
换言之,由于短路,r
将始终返回,但如果不是最后一个元素,则在返回之前,hull
将被附加到它。同样的逻辑应该很容易以更好、更详细的方式实现。
关于c# - Python到C#减少对函数的理解,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8019079/