【问题标题】:Python programming functional vs. imperative codePython 编程函数式与命令式代码
【发布时间】:2014-03-20 16:06:25
【问题描述】:

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

【问题讨论】:

    标签: python functional-programming imperative-programming


    【解决方案1】:

    给定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 函数将有效地执行与其中任何一个相同的事情。)

    【讨论】:

    • Python 将operator.add 作为+ 的符号名称。
    【解决方案2】:

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

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

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

    命令式:

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

    【讨论】:

    • 声明式和函数式编程不是一回事。
    • 这是一个非常奇怪的答案。如果算法是功能性的、程序性的还是 OOO 的,天气是命令性的还是声明性的并不会真正产生影响。您可能会对某些恰好是声明式和函数式的语言的熟悉程度感到困惑。
    【解决方案3】:

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

    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
    

    这不是真正的函数式编程,但它确实提供了一种解决问题的不同方式,我认为这正是你的老师试图达到的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2015-12-26
      • 2010-12-19
      • 2011-01-19
      相关资源
      最近更新 更多