Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 还有什么更像蟒蛇呢:小羔羊还是无羔羊?_Python_Python 3.x_Coding Style - Fatal编程技术网

Python 还有什么更像蟒蛇呢:小羔羊还是无羔羊?

Python 还有什么更像蟒蛇呢:小羔羊还是无羔羊?,python,python-3.x,coding-style,Python,Python 3.x,Coding Style,当函数接受函数参数(或类具有函数槽)时,可以在两种方法之间进行选择: def foo(..., my_func=None, ...): ... if my_func: my_func(...) ... 及 还有什么更具Pythonic/清晰/可读性 什么更快?一个额外的布尔检查还是一个简单的函数调用?使用此选项时: >>> def bar(): ... print("Goodbye, World!") ... 我觉得这很有可读

当函数接受函数参数(或类具有函数槽)时,可以在两种方法之间进行选择:

def foo(..., my_func=None, ...):
    ...
    if my_func:
        my_func(...)
    ...

还有什么更具Pythonic/清晰/可读性

什么更快?一个额外的布尔检查还是一个简单的函数调用?

使用此选项时:

>>> def bar():
...     print("Goodbye, World!")
...
我觉得这很有可读性:

>>> def foo(my_func = lambda : None):
...     my_func()
...
>>> foo()
>>> foo(bar)
Goodbye, World!
我觉得这毫无意义地令人讨厌

>>> def baz(my_func = None):
...     if my_func is not None:
...         my_func()
...
>>> baz()
>>> baz(bar)
Goodbye, World!
试着在你的生活中不留支票。当你想让它做得好的时候,不要使用None:对着你的脸吹。不要要求它安静。不管怎样,如果你使用它,它都会制造恼人的噪音

什么更快-一个额外的布尔检查还是一个简单的函数调用

看在上帝的份上,你为什么在乎


作为记录,我认为这是可读的,但过于宽容:

>>> def buz(my_func = lambda **k:None):
...     my_func()
...
>>> buz(bar)
Goodbye, World!

x不是None
可能比
(lambda:None)(
快。当然,这对你自己来说是非常简单的。出于可读性原因,我更喜欢None检查(使用
is
)而不是默认的lambda,这是一种常见的Python习惯用法,我认为这实际上取决于您的其余代码在做什么。如果没有一个稍微具体一点的例子,我真的不能说完全同意@OlivierMelançon,这取决于实际情况,我们的假设可能会改变。我倾向于使用
None
作为默认参数,因为调用方不必考虑如何启用默认行为——只要使用
None
。如果默认参数不是
None
,则要获得默认行为,调用方不得指定参数(或必须知道其默认值)。@juanpa.arrivillaga:您似乎不同意ATM提供的唯一答案。这是否意味着没有共识?!;-)是否需要将一些参数传递到函数中?lambda函数应该是
lambda*args,**kwargs:None
。这不是也很烦人吗?不
def foo(my_func=lambda x:None):my_func(“残酷世界!”)
但这不是唯一的情况,如果
my_func
的签名是
my_func(a,b,c,d=xxx,e=xxx)
。然后,您必须按照我给出的那样编写一个通用lambda。@Sraw您混淆了函数允许的内容和我如何使用它。我只需要公布我如何使用它。如果我将三个参数传递给我的_func,那么我的lambda只需要请求三个参数函数。如果你的函数可以处理我的三个参数,那么不管它有多少个选项,它都适合我的三个参数lambda。。。我真的很困惑。我的意思是,有时候你无法预先确定my_func需要多少参数。或者有时您有多个不同的
foo
,它们接受不同的
my_func
,因此您需要为每个
foo
编写不同的lambda函数。或者您可以编写一个适合所有情况的最终版本
lambda*args,**kwargs:None
>>> def buz(my_func = lambda **k:None):
...     my_func()
...
>>> buz(bar)
Goodbye, World!