Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python到c#减少函数理解_C#_Python_Reduce - Fatal编程技术网

Python到c#减少函数理解

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): """

我正在努力理解下面用python编写的“reduce”调用

我在这里和其他地方都找到了一些资源,它们说明了函数的作用,并且C#中的列表有一个等价的“聚合”,但我无法理解下面的调用究竟是什么-expect-。。。可能是因为我真的搞不清楚“留”的回报是什么

因此:

1-有人能告诉我‘留’回来的是什么吗

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
  • \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”命令依次左移而发生的!哈!