Python 用lambda重构部分函数
在官方文件中 关于局部 大致相当于:Python 用lambda重构部分函数,python,Python,在官方文件中 关于局部 大致相当于: def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newkeywords = keywords.copy() newkeywords.update(fkeywords) return func(*args, *fargs, **newkeywords) newfunc.func = func n
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*args, *fargs, **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
我试图理解同义功能的普遍结构
partial = lambda func, *args, **kwargs: func(*args, **kwargs)
我的理解有意义吗?你错过了两件大事
首先,您的版本不会传递关键字参数。要做到这一点,您还需要将它们展开:
lambda *args, **kwargs: func(*args, **kwargs)
但让我们暂时忽略这一点。更大的问题是缺少部分参数,这是
partial
的全部要点。例如:
>>> def f(a, b):
... return a + b
>>> add2 = partial(f, 2)
>>> add2(3)
5
>>> add2 = lambda *args: f(*args)
>>> add2(3)
f() missing 1 required positional argument: 'b'
要执行相同的操作,您需要执行以下操作:
>>> add2 = lambda *args: f(2, *args)
>>> add2(3)
5
…或者,相当于:
>>> add2 = lambda *args: f(*((2,) + args))
>>> add2(3)
5
此外,这里没有很好的理由使用
lambda
。lambda
的要点是:(a)您不必给出名称,(b)您可以在表达式中使用它。如果您只是想在赋值语句中使用它来命名,最好使用def
:
def add2(*args): return f(*((2,) + args))
你错过了两件大事
首先,您的版本不会传递关键字参数。要做到这一点,您还需要将它们展开:
lambda *args, **kwargs: func(*args, **kwargs)
但让我们暂时忽略这一点。更大的问题是缺少部分参数,这是
partial
的全部要点。例如:
>>> def f(a, b):
... return a + b
>>> add2 = partial(f, 2)
>>> add2(3)
5
>>> add2 = lambda *args: f(*args)
>>> add2(3)
f() missing 1 required positional argument: 'b'
要执行相同的操作,您需要执行以下操作:
>>> add2 = lambda *args: f(2, *args)
>>> add2(3)
5
…或者,相当于:
>>> add2 = lambda *args: f(*((2,) + args))
>>> add2(3)
5
此外,这里没有很好的理由使用
lambda
。lambda
的要点是:(a)您不必给出名称,(b)您可以在表达式中使用它。如果您只是想在赋值语句中使用它来命名,最好使用def
:
def add2(*args): return f(*((2,) + args))
顺便说一句,
lambda
是用来创建匿名函数的,所以通常认为将lambda分配给名称是不好的风格。请参见.BTW,lambda
是用来创建匿名函数的,因此通常认为将lambda分配给名称是不好的风格。看见