16

所以我目前正在上课学习 3 种主要的编程范式。我知道python同时使用函数式和命令式范式。在明天的考试之前,我一直在寻找每个范例的 Python 中的简短示例代码,以便更好地理解这一点。谢谢!

4

3 回答 3

18

鉴于L = [1, 2, 3, 4, 5]我们可以通过两种方式计算总和。

至关重要的:

sum = 0
for x in L:
    sum += x

函数式(局部函数):

def add(x, y):
    return x + y
sum = reduce(add, L)

函数式(lambda 表达式):

sum = reduce(lambda x, y: x + y, L)

(当然,内置sum函数将有效地做与其中任何一个相同的事情。)

于 2014-02-20T00:27:46.393 回答
15

思考命令式和函数式范式之间区别的一种方法是,对于命令式,您必须明确编码操作的顺序(我在这里使用非常松散的语言来简化您的操作)。相反,在函数式编程中,您不是在定义序列,而是在声明您要建模的内容(这就是为什么它有时被称为声明式编程风格的原因)。

所以在下面的例子中,如果我想确定哪些数字在列表中是偶数,我必须显式地对循环进行编码,并在命令式编码时检查每个数字是否是偶数。在功能示例中我不需要这样做。在那个例子中,我刚刚定义了一个数字是偶数的含义,然后我只是将这个抽象/函数应用于列表。一个简单的班轮。

两种范式之间存在更多差异,但这应该会给您一个想法。

至关重要的:

naturalNumbers = [0,1,2,3,4,5,6,7,8,9]

def printEvenNumbers (listOfNumbers):
    for x in listOfNumbers:
        if x % 2 == 0:
            print True
        else:
            print False

功能:

def evenNumber (x):
    return (x % 2) == 0

print(map(evenNumber, naturalNumbers))
于 2014-02-20T00:46:10.397 回答
4

您可以通过两种方式反转字典:

def reverse_mapping1(map):
    return {v:k for k, v in map.items()}

def reverse_mapping2(map):
    inverse = {}
    for k, v in map.iteritems():
        inverse[v] = inverse.get(v, [])
        inverse[v].append(k)
    return inverse

这不是真正的函数式编程,但它确实提供了一种不同的方式来思考解决问题,这就是我认为你的老师正在努力解决的问题。

于 2014-02-20T00:33:00.347 回答