Python编程功能式与命令式代码对比

18

所以我正在上一门学习三种主要编程范式的课程。我知道Python使用了函数式和命令式编程范式。在明天的考试之前,我想要寻找Python中每个编程范式的简短示例代码,以更好地理解它们。谢谢!

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函数可以有效地执行与这两个函数相同的操作。)


3
Pythonдёӯзҡ„operator.addжҳҜеҠ жі•з¬ҰеҸ·+зҡ„жӣҝд»ЈеҗҚз§°гҖӮ - Yuri Syro
这些对话中让我困惑的一件事是,reduce 在幕后不是属于命令式编程吗? - tim.rohrer

16

想要理解命令式范式和函数式范式之间的差别,一种方式是,在命令式范式中,你必须显式地编写操作的顺序(我在这里使用非常宽泛的语言来使它更简单)。相比之下,函数式编程不是定义顺序,而是声明你正在尝试建模的内容(这就是为什么它有时被称为声明式编程风格)。

因此,在下面的示例中,如果我想确定列表中哪些数字是偶数,当以命令式方式编码时,我必须明确编写循环并检查每个数字是否是偶数。但在函数式示例中,我不需要那样做。在该示例中,我只定义了偶数的含义,然后将这个抽象/函数应用于列表中。一个简单的一行代码。

两种范式之间还有更多的区别,但这应该让你有一个基本的了解。

命令式:

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

声明式编程和函数式编程并不完全相同。 - Will Vousden
这是一个非常奇怪的回答。算法是命令式还是声明式并不会真正影响它是否是函数式、过程式或面向对象的。你可能会因为熟悉某些偶然是声明式和函数式的语言而感到困惑。 - Jamie Marshall

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

虽然它并不是真正的函数式编程,但它提供了一种不同的思考问题的方式,这也是我认为你的老师试图要达到的目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接