art*_*hur 3 python lambda python-3.x
我正在尝试使用线性函数进行数据转换(如米到英尺)。
我试图找到一种方法来构建一个返回反函数的 lambda 函数和另一个返回这些函数组合的 lambda 函数
inches_to_meters=lambda x:x*0.0254
inches_to_feets=lambda x:x*(1/12)
miles_to_feets=lambda x:x*5280
composition=lambda x,y,z: lambda x,y: x(y(z))
opposite=lambda x: 1/x
meters_to_inches=opposite(inches_to_meters)
miles_to_inches = composition(feets_to_inches, miles_to_feets)
print(meters_to_inches(10))
Run Code Online (Sandbox Code Playgroud)
我怎样才能做出相反的功能(F^-1(x))?
(例如:y=x/12,则12*y=x,反之为:12*x=y)。
首先,最好使用def ...语句而不是lambda定义命名函数。看看这个SO 问题及其答案以获取更多详细信息。但是,如果我正确理解您想要实现的目标,最好将线性函数定义为一个类(见下文)。
是(谁)给的:
并且取决于斜率a和截距b。这样做的一个重要结果是您需要知道两者a并b以函数形式定义其逆。
在 python 中,例如,如果您定义一类线性函数并将其逆作为其方法之一,则可以实现此目的:
class f_lin:
def __init__(self, a, b=0):
self.a = float(a)
self.b = b
def __call__(self, x):
return self.a * x + self.b
def inv(self, y):
return (y - self.b) / self.a
Run Code Online (Sandbox Code Playgroud)
现在您可以定义:
inches_to_meters = f_lin(0.0254)
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
inches_to_meters(10)
Out[38]: 0.254
inches_to_meters.inv(0.254)
Out[39]: 10.0
inches_to_meters.inv(inches_to_meters(10))
Out[40]: 10.0
Run Code Online (Sandbox Code Playgroud)
或者,您也可以为逆创建一个新对象,因为线性函数的逆仍然是线性函数:
class f_lin:
def __init__(self, a, b=0):
self.a = float(a)
self.b = b
def __call__(self, x):
return self.a * x + self.b
def get_inverse(self):
return self.__class__(1/self.a, - self.b/self.a)
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样定义反函数:
inches_to_meters = f_lin(0.0254)
meters_to_inches = inches_to_meters.get_inverse()
Run Code Online (Sandbox Code Playgroud)
现在您将线性函数及其逆作为对象:
inches_to_meters(10)
Out[43]: 0.254
meters_to_inches(0.254)
Out[44]: 10.0
inches_to_meters(meters_to_inches(10))
Out[45]: 10.0
Run Code Online (Sandbox Code Playgroud)
这些只是两种方法,都没有lambda按要求使用。但是,我建议不要使用lambda.
| 归档时间: |
|
| 查看次数: |
1043 次 |
| 最近记录: |