Python到c#减少函数理解
我正在努力理解下面用python编写的“reduce”调用 我在这里和其他地方都找到了一些资源,它们说明了函数的作用,并且C#中的列表有一个等价的“聚合”,但我无法理解下面的调用究竟是什么-expect-。。。可能是因为我真的搞不清楚“留”的回报是什么 因此: 1-有人能告诉我‘留’回来的是什么吗 2-reduce调用中的Python到c#减少函数理解,c#,python,reduce,C#,Python,Reduce,我正在努力理解下面用python编写的“reduce”调用 我在这里和其他地方都找到了一些资源,它们说明了函数的作用,并且C#中的列表有一个等价的“聚合”,但我无法理解下面的调用究竟是什么-expect-。。。可能是因为我真的搞不清楚“留”的回报是什么 因此: 1-有人能告诉我‘留’回来的是什么吗 2-reduce调用中的,[])是什么意思 非常感谢 TURN_LEFT, TURN_RIGHT, TURN_NONE = (1, -1, 0) def turn(p, q, r): """
,[])
是什么意思
非常感谢
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
\u keep_left
返回一个列表hull
,该列表最初为空。不左转的转弯将从中删除。除非当前点已经是列表中的最后一个元素,否则将向其中添加当前点,[])
是要减少的第三个参数。这是初始累加器值,它将被传递到\u keep_left
,从而使外壳
(最后,lh
和uh
)最初为空lh
和uh
代表下半部分和上半部分),每次扫描时,点累积到列表中。使用reduce
累积点,即结果最初为空,点逐个传递到\u keep\u left
(按排序顺序),并且对于每个点,导致右转的点从累积列表中删除。然后将当前点添加到累积列表中
\u keep\u left
的返回值有点棘手:not len(hull)
如果列表为空,则返回True<代码>船体[-1]!=r检查r
(当前点)是否是列表中的最后一个元素hull.append(r)
是布尔表达式,仅用于将r
附加到列表中的副作用(我觉得有点脏),因此如果hull
的最后一个元素是r
,则将返回hull
,而不附加r
换句话说,由于短路,
hull
将始终返回,但是r
如果不是最后一个元素,将在返回之前附加到它。同样的逻辑应该很容易以更好、更详细的方式实现。感谢您提供了非常清晰的解释。我被“reduce”会为迭代返回一些有意义的东西的期望所欺骗,而真正的操作是由于“append”命令依次左移而发生的!哈!