生成逆时针排序的排序功能

时间:2016-05-16 18:07:42

标签: python python-3.x

作为我正在制作的剧本的一部分,我想围绕中心点以逆时针顺序对一系列点进行排序,我们称之为“#”;

我有一个功能可以确定两点' b'如果c位于光线a-> b的右侧或左侧,则为&c;#。这个函数是right_of(a,b,c),它经过测试和工作。

我想使用此函数对具有二维坐标的元组列表进行排序,例如[(0,0),(0,1),(1,1),......]。但是,每次我排序时,都会有一个不同的观点' a'传递给函数right_of()。我想要的是一个'功能' returnSortFunction(a)将返回一个带有两个参数f(b,c)的函数,并且当我对每个坐标调用f(b,c)时,它应该返回right_of的结果(a, b,c)与' a'已经填写了。

我曾尝试使用工厂实现这一点,但我认为我不能正确理解工厂,或者确定这不是工厂的用途。我该如何构建此功能?

3 个答案:

答案 0 :(得分:1)

你可以让函数返回一个函数,没问题。一个简单的方法就是

def returnSortFunction(a):
    return lambda b,c: right_of(a,b,c)

答案 1 :(得分:1)

你需要一个围绕right_of函数的包装函数。你可以使用lambda,但我认为你的逻辑会比这更复杂。假设你想把一个函数作为比较器传递给你的排序方法,它会看起来像这样:

def returnSortFunction(a):
    def comparator(p1, p2, a = a):
        if p1 == p2:
            return 0
        elif right_of(a, p1, p2):
            return 1
        else:
            return -1
    return comparator

答案 2 :(得分:1)

函数是python中的第一类对象,所以你可以这样做:

def prepare_funcs(number):
    def inc(a):
        return number + a
    def mult(a):
        return number * a
    return inc, mult

inc5, mult5 = prepare_funcs(5)
inc2, mult2 = prepare_funcs(2)

inc5(2) #Out: 7
mult2(10) #Out: 20

对于您的特定上下文,您还应该查看functools模块,特别是部分功能。有了它,你可以“部分”为你的函数准备参数:

right_of_5 = functools(right_of, 5)
right_of_5(b, c)

这将有效,因为right_of_5将自动填充right_of第一个参数 - a - 数字为5.