命名 lambda 表达式是否符合 Python 风格
- 2024-12-18 08:39:00
- admin 原创
- 127
问题描述:
我开始意识到 Python 中 lambda 表达式的价值,特别是在函数式编程、map
函数返回函数等方面。但是,我也一直在函数内命名 lambda,因为:
我需要多次相同的功能并且不想重复代码。
该功能特定于它出现的功能;其他地方不需要它。
当我遇到满足上述条件的情况时,我会编写一个命名的 lambda 表达式,以便 DRY 和缩小功能范围。例如,我正在编写一个对某些numpy
数组进行操作的函数,并且需要对传递给该函数的所有数组进行一些相当繁琐的索引(这很容易放在一行中)。我编写了一个命名的 lambda 表达式来进行索引,而不是编写整个其他函数或在整个函数定义中多次复制/粘贴索引。
def fcn_operating_on_arrays(array0, array1):
indexer = lambda a0, a1, idx: a0[idx] + a1[idx]
# codecodecode
indexed = indexer(array0, array1, indices)
# codecodecode in which other arrays are created and require `indexer`
return the_answer
这是否滥用了 Python 的 lambda?我是否应该忍受并定义一个单独的函数?
編輯
可能值得在函数内部链接函数。
解决方案 1:
这不符合 Python 风格,而且PEP8 也不鼓励这样做:
始终使用 def 语句,而不是将 lambda 表达式直接绑定到标识符的赋值语句。
是的:
def f(x): return 2*x
不:
f = lambda x: 2*x
第一种形式意味着结果函数对象的名称是特定的,
'f'
而不是通用的'<lambda>'
。这对于回溯和字符串表示通常更有用。赋值语句的使用消除了 lambda 表达式相对于显式 def 语句的唯一好处(即它可以嵌入更大的表达式中)
对此的经验法则是思考其定义:lambda 表达式是匿名函数。如果你命名它,它就不再是匿名的了。:)
解决方案 2:
我编写了一个命名的 lambda 表达式来进行索引,而不是编写整个其他函数
嗯,你正在编写一个完整的其他函数。你只是用 lambda 表达式编写它。
为什么不使用def
?这样可以获得更好的堆栈跟踪和更多的语法灵活性,而且不会丢失任何东西。这并不意味着def
不能在另一个函数内发生:
def fcn_operating_on_arrays(array0, array1):
def indexer(a0, a1, idx):
return a0[idx] + a1[idx]
...
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD