我有时会发现自己想让占位符“无所事事”的lambda表达式,类似于说:
def do_nothing(*args):
pass
但是以下语法是非法的,因为lambda表达式尝试返回冒号后面的内容,并且您无法返回pass
。
do_nothing = lambda *args: pass
所以我想知道,以下表达式是否适合替代上述?
do_nothing = lambda *args: None
由于上面的do_nothing
函数在技术上返回None
,是否可以创建一个返回None
的lambda表达式作为占位符lambda表达式?或者这是不好的做法?
答案 0 :(得分:63)
此:
def do_nothing(*args):
pass
相当于:
lambda *args: None
有一些细微的差别,一个是lambda
,一个不是。 (例如,__name__
将在函数上为do_nothing
,在lambda上为<lambda>
。)如果对您而言,请不要忘记**kwargs
。return <x>
。 Python中的函数没有明确的None
返回def long_running_code(progress_function=lambda percent_complete: None):
# Report progress via progress_function.
。这是here:
一个调用总是返回一些值,可能是None,除非它引发异常。
我使用了类似的函数作为默认值,例如:
{{1}}
答案 1 :(得分:27)
如果你真的想要一个完整无效的功能,请务必采取*args
和 *kwargs
。
noop = lambda *args, **kwargs: None
在其所有光荣的行动中
>>> noop = lambda *args, **kwargs: None
>>> noop("yes", duck_size="horse", num_ducks=100)
>>>
为未来做好准备并包括**kwargs
处理。如果您曾尝试在代码中的某个地方使用它而忘记了没有采用kwargs
,那么无所作为就是例外:
In [2]: do_nothing('asdf', duck="yes")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-efbd722f297c> in <module>()
----> 1 do_nothing('asdf', duck="yes")
TypeError: <lambda>() got an unexpected keyword argument 'duck'
答案 2 :(得分:9)
有时lambda函数用于数据转换,在这种情况下“什么也不做”&#39;表示返回输入,即
lambda x: x
要返回无,您可以写
lambda x: None
答案 3 :(得分:5)
这是最简单的lambda表达式:
const { spawn } = require('child_process');
const ls = spawn('proxy');//@see https://nodejs.org/api/child_process.html#child_process_class_childprocess
ls.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}. We should stop the child_process`);
ls.kill('SIGTSTP');
});
ls.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
不需要参数和最低要求回报。
答案 4 :(得分:-1)
在 Python 3 中,您甚至不需要为此定义任何函数。调用type(None)
将返回NoneType
构造函数,您可以使用该构造函数执行以下操作:type(None)()
。请记住,NoneType
构造函数仅接受0个参数。
但是在 Python 2 中,创建NoneType
的实例是不可能的,因此lambda: None
才是最有意义的。