Kec*_*yal 171 python lambda pep
每当我使用lambda表达式时,我都会得到这个pep8警告.是不是建议使用lambda表达式?如果不是为什么?
Gar*_*tty 198
您遇到的PEP-8中的建议是:
始终使用def语句而不是将lambda表达式直接绑定到名称的赋值语句.
是:
Run Code Online (Sandbox Code Playgroud)def f(x): return 2*x
没有:
Run Code Online (Sandbox Code Playgroud)f = lambda x: 2*x
第一种形式意味着生成的函数对象的名称特别是'f'而不是通用的'<lambda>'.这对于一般的回溯和字符串表示更有用.使用赋值语句消除了lambda表达式可以在显式def语句上提供的唯一好处(即它可以嵌入到更大的表达式中)
将lambdas分配给名称基本上只是复制了它的功能def
- 并且通常,最好以单一方式执行某些操作以避免混淆并提高清晰度.
lambda的合法用例是你想要在不指定函数的情况下使用函数的地方,例如:
sorted(players, key=lambda player: player.rank)
Run Code Online (Sandbox Code Playgroud)
对于简单的操作,该operator
模块提供了一些有用的选项attrgetter
,itemgetter
而methodcaller
这往往能代替labmdas那些刚刚访问属性(S),项目(S)和调用方法.
例如,上面的内容可以这样完成operator.attrgetter
:
sorted(players, key=operator.attrgetter('rank'))
Run Code Online (Sandbox Code Playgroud)
ian*_*kit 106
这是故事,我有一个简单的lambda函数,我使用了两次.
a = map(lambda x : x + offset, simple_list)
b = map(lambda x : x + offset, another_simple_list)
Run Code Online (Sandbox Code Playgroud)
这只是为了表示,我遇到了几个不同的版本.
现在,为了保持干燥,我开始重用这个常见的lambda.
f = lambda x : x + offset
a = map(f, simple_list)
b = map(f, another_simple_list)
Run Code Online (Sandbox Code Playgroud)
此时我的代码质量检查器抱怨lambda是一个命名函数,所以我把它转换成一个函数.
def f(x):
return x + offset
a = map(f, simple_list)
b = map(f, another_simple_list)
Run Code Online (Sandbox Code Playgroud)
现在检查器抱怨函数必须由前后一个空行限定.
def f(x):
return x + offset
a = map(f, simple_list)
b = map(f, another_simple_list)
Run Code Online (Sandbox Code Playgroud)
在这里,我们现在有6行代码而不是原始的2行,没有增加可读性,也没有增加pythonic.此时,代码检查器会抱怨没有docstrings的函数.
在我看来,这个规则可以更好地避免和破坏,当它有意义时,运用你的判断.
Elm*_*ise 23
Lattyware是绝对正确的:基本上PEP-8希望你避免像这样的事情
f = lambda x: 2 * x
Run Code Online (Sandbox Code Playgroud)
而是使用
def f(x):
return 2 * x
Run Code Online (Sandbox Code Playgroud)
但是,正如最近的bug报告(2014年8月)中所述,现在符合以下语句:
a.f = lambda x: 2 * x
a["f"] = lambda x: 2 * x
Run Code Online (Sandbox Code Playgroud)
由于我的PEP-8检查器尚未正确实现,我暂时关闭了E731.