理解诸如reduce之类的python内置代码

理解诸如reduce之类的python内置代码,python,functional-programming,Python,Functional Programming,我从以下内容重构代码: def get_ana(word): return ''.join(sorted(word.lower())) def combine_anagrams(words): sets = {} for word in words: ana = get_ana(word) sets[ana] = sets.get(ana, []) + [word] return sets.values() def combi

我从以下内容重构代码:

def get_ana(word):
    return ''.join(sorted(word.lower()))

def combine_anagrams(words):
    sets = {}
    for word in words:
        ana = get_ana(word)
        sets[ana] = sets.get(ana, []) + [word]

    return sets.values()
def combine_anagrams(words):
    return reduce(add_ana, words, {}).values()

def add_ana(sets, word):
    ana = ''.join(sorted(word.lower()))
    sets[ana] = sets.get(ana, []) + [word]
    return sets
对这样的事情:

def get_ana(word):
    return ''.join(sorted(word.lower()))

def combine_anagrams(words):
    sets = {}
    for word in words:
        ana = get_ana(word)
        sets[ana] = sets.get(ana, []) + [word]

    return sets.values()
def combine_anagrams(words):
    return reduce(add_ana, words, {}).values()

def add_ana(sets, word):
    ana = ''.join(sorted(word.lower()))
    sets[ana] = sets.get(ana, []) + [word]
    return sets
我知道这被认为更实用

但是(在python中)更改的真正好处是什么


内存使用,GC,不管它是什么。

for循环的
实际上是递归在函数式编程语言中提供的相同抽象。Python中的
reduce
函数要求您在用户定义的函数中打包
for
循环的主体,这样的函数会产生一层影响性能的开销

Python没有像大多数函数式语言那样优化递归(实际上,它根本没有针对递归进行优化),因为函数式语言选择将递归作为递归的唯一(或至少主要)方式,而Python同时提供了
for
while
循环来高效地迭代数据结构


最后,使用
reduce
很少像简单的
for
循环那样易读,永远不会有更好的性能,并且由于需要提供一个要重复调用的函数,通常会有更差的性能。它只允许您以函数式风格的外观进行编程,而不需要函数式语言所提供的任何常规好处来支持它。

for
循环实际上与递归在函数式编程语言中提供的抽象相同。Python中的
reduce
函数要求您在用户定义的函数中打包
for
循环的主体,这样的函数会产生一层影响性能的开销

Python没有像大多数函数式语言那样优化递归(实际上,它根本没有针对递归进行优化),因为函数式语言选择将递归作为递归的唯一(或至少主要)方式,而Python同时提供了
for
while
循环来高效地迭代数据结构


最后,使用
reduce
很少像简单的
for
循环那样易读,永远不会有更好的性能,并且由于需要提供一个要重复调用的函数,通常会有更差的性能。它只允许您以函数式风格的外观进行编程,而不需要函数式语言提供的任何通常的好处来支持它。

我认为第一个代码更好。它更具可读性,并且它们在计算上是相似的。您的“功能性”代码违反了这样一个理想,即函数不应使用
集合[ana]=…
行更改对象的状态,因此它没有“更可预测”的优势。可读性降低?;)FWIW,尤其是当其函数arg不具有关联性,并且不再是Python 3中的内置函数时:它已降级为
functools
。Guido想将它完全移除,但在抗议之后被迫保留。@Jared,我意识到我正在改变状态。你的意思是我的问题很紧张。然而,可能
{}
作为一个参数来减少内存中的位置不同,因此有好处。我认为第一个代码更好。它更具可读性,并且它们在计算上是相似的。您的“功能性”代码违反了这样一个理想,即函数不应使用
集合[ana]=…
行更改对象的状态,因此它没有“更可预测”的优势。可读性降低?;)FWIW,尤其是当其函数arg不具有关联性,并且不再是Python 3中的内置函数时:它已降级为
functools
。Guido想将它完全移除,但在抗议之后被迫保留。@Jared,我意识到我正在改变状态。你的意思是我的问题很紧张。然而,可能
{}
作为一个参数来减少内存中不同的位置,因此有好处。