理解诸如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,我意识到我正在改变状态。你的意思是我的问题很紧张。然而,可能{}
作为一个参数来减少内存中不同的位置,因此有好处。