繁体   English   中英

从Lambda表达式返回值

[英]Return values from a lambda expression

我正在从SQLite数据库导入值,并希望在其中一列上运行lambda表达式以创建列表。

cur.execute('SELECT p, T FROM W')
data = cur.fetchall()

lst = list()
for row in data:
    p = float(row[0])
    T = float(row[1])
    lst.append(lambda T: p if T < 1 else 0)

运行此命令时,输出为以下列表:

< function <lambda> at 0x00000255E52AA8C8> . 

我想在T <1时为列表添加p的值,而在T > 1时为0。

完全不需要lambda

lst.append(p if T < 1 else 0)

三元表达式本身将起作用。 为了获得lambda函数的返回值,必须调用它们,类似以下几行:

lst.append((lambda: p if T < 1 else 0)())

当然,这是毫无意义的。 Lambda函数只能包含一个表达式。 立即返回到裸表达式,立即调用它会使函数过时。 这就是为什么此类函数通常采用由函数所传递的上下文动态填充的参数的原因。 这个lambda甚至不需要参数,因为所有必需的部分都已准备就绪,可以使用。

另一种解决方案是考虑列表理解以创建最终列表lst 这样,您还可以避免使用中间变量。 当然,这只是解决您的问题的一个班轮。

lst = [float(row[0]) if float(row[1]) < 1 else 0 for row in data]

您已经有2个不错的答案,所以我将建议另一种方法。 假设您实际上仅使用显示给我们的逻辑选择这2列,就可以在查询级别解决此问题。

如果表中有很多行,则有可能获得更好的性能:

cur.execute('SELECT CASE WHEN T < 1 THEN p WHEN T > 1 THEN 0 END FROM W')
data = cur.fetchall()

然后,您不需要循环,因为data已经包含了所需的内容。 请记住,对于T == 1行,此查询将返回None ,但是使用另一个WHEN可以轻松地处理该查询。

您不需要lambda表达式。

您可以这样想:目前,您正在告诉计算机将函数本身添加到列表中;否则,您将无法执行此操作。 您并不是在告诉计算机附加该值的评估值。 如果您摆脱了lambda T:位,则基本上是在做一个内联的if语句,该语句可以评估该值。 Lambda函数用于定义稍后要使用的单行函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM