rds*_*rds 132 python python-2.7 python-3.x
我想指出一个什么都不做的函数:
def identity(*args)
return args
Run Code Online (Sandbox Code Playgroud)
我的用例是这样的
try:
gettext.find(...)
...
_ = gettext.gettext
else:
_ = identity
Run Code Online (Sandbox Code Playgroud)
当然,我可以使用identity
上面定义的,但内置肯定会运行得更快(并避免我自己引入的错误).
显然,map
与filter
使用None
的身份,但这是具体到它们的实现.
>>> _=None
>>> _("hello")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
Run Code Online (Sandbox Code Playgroud)
rds*_*rds 90
进行更多的研究,没有,在问题1673203中问了一个功能而且Raymond Hettinger表示不会:
最好让人们编写自己的琐碎传递,并考虑签名和时间成本.
所以更好的方法是实现(lambda避免命名函数):
_ = lambda *args: args
Run Code Online (Sandbox Code Playgroud)
要么
_ = lambda x: x
Run Code Online (Sandbox Code Playgroud)
Pau*_*ore 23
https://en.wikipedia.org/wiki/Identity_function中定义的标识函数采用单个参数并将其保持不变:
def identity(x):
return x
Run Code Online (Sandbox Code Playgroud)
你要签名什么你问,当你说的def identity(*args)
是不是严格意义上的标识功能,只要你想它采取多个参数.这很好,但是你遇到了一个问题,因为Python函数没有返回多个结果,所以你必须找到一种方法将所有这些参数塞进一个返回值.
在Python中返回"多个值"的常用方法是返回值的元组 - 从技术上讲,它是一个返回值,但它可以在大多数上下文中使用,就好像它是多个值一样.但这样做意味着你得到
>>> def mv_identity(*args):
... return args
...
>>> mv_identity(1,2,3)
(1, 2, 3)
>>> # So far, so good. But what happens now with single arguments?
>>> mv_identity(1)
(1,)
Run Code Online (Sandbox Code Playgroud)
并且快速解决这个问题会带来其他问题,正如这里的各种答案所示.
因此,总之,Python中没有定义身份函数,因为:
对于您的确切情况,
def dummy_gettext(message):
return message
Run Code Online (Sandbox Code Playgroud)
几乎可以肯定你想要的东西 - 一个具有相同调用约定并返回的函数gettext.gettext
,它返回其参数不变,并且清楚地命名以描述它的作用以及它的用途.如果表演在这里是一个至关重要的考虑因素,我会非常震惊.
tba*_*ack 20
你的工作会很好.当参数的数量修复时,你可以使用这样的匿名函数:
lambda x: x
Run Code Online (Sandbox Code Playgroud)
Ser*_*kov 10
Python 中没有内置的标识函数。对Haskellid
函数的模仿是:
identity = lambda x, *args: (x,) + args if args else x
Run Code Online (Sandbox Code Playgroud)
用法示例:
identity(1)
1
identity(1,2)
(1, 2)
Run Code Online (Sandbox Code Playgroud)
由于identity
除了返回给定的参数之外什么都不做,我认为它不会比本机实现慢。
不,没有。
请注意,您的identity
:
将装箱参数-即
In [6]: id = lambda *args: args
In [7]: id(3)
Out[7]: (3,)
Run Code Online (Sandbox Code Playgroud)因此,lambda arg: arg
如果您需要真正的身份功能,则可能要使用。
注意:此示例将隐藏内置id
函数(您可能永远不会使用)。
小智 5
如果速度不重要,这应该可以处理所有情况:
def identity(*args, **kwargs):
if not args:
if not kwargs:
return None
elif len(kwargs) == 1:
return next(iter(kwargs.values()))
else:
return (*kwargs.values(),)
elif not kwargs:
if len(args) == 1:
return args[0]
else:
return args
else:
return (*args, *kwargs.values())
Run Code Online (Sandbox Code Playgroud)
使用示例:
print(identity())
None
$identity(1)
1
$ identity(1, 2)
(1, 2)
$ identity(1, b=2)
(1, 2)
$ identity(a=1, b=2)
(1, 2)
$ identity(1, 2, c=3)
(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
38635 次 |
最近记录: |