Python3:可以使用命名函数定义进行列表理解吗?

Python3:可以使用命名函数定义进行列表理解吗?,python,list-comprehension,Python,List Comprehension,我使用的是html请求库,但库特定的知识在这个问题上并不重要 results = asession.run(*[lambda m=j: get_size(m) for j in i]) asession.run(f1,f2,f3,…)异步运行f1(),f2(),f3(),等等,返回[f3(),f1(),f2()](返回的列表顺序不同) 问题是,我的get\u size函数可能会抛出错误 所以我想设置一些回退值。 但对于lambda表达式,除了块之外,无法插入try。(lambda函数只允许在以

我使用的是html请求库,但库特定的知识在这个问题上并不重要

results = asession.run(*[lambda m=j: get_size(m) for j in i])
asession.run(f1,f2,f3,…)
异步运行
f1()
f2()
f3()
,等等,返回
[f3(),f1(),f2()]
(返回的列表顺序不同)

问题是,我的
get\u size
函数可能会抛出错误

所以我想设置一些回退值。 但对于lambda表达式,除了块之外,无法插入try。(lambda函数只允许在以下项之后返回值,不允许表达式)

而不是

[lambda m=j: get_size(m) for j in i]
下面的代码是不可能的吗?(当然,以下代码在语法上是错误的)

以下是唯一的方法吗

def fn(m):
    try:
        return get_size(m)
    except:
        return 0
[lambda m=j: fn(m) for j in i]

在我的例子中,我喜欢一些单行列表理解,我想知道有没有办法在列表理解中使用命名函数定义(除了lambda之外的任何东西,因为lambda只允许返回值,因此是有限的)。

如果你知道是什么值
m
导致了错误(例如
len(m)
是0),即
条件
,然后你可以像这样使用lambda表达式

f = lambda m : get_size(m) if not Condition else 0
[f(j) for j in i]

如果您知道是什么值的
m
导致了错误(例如
len(m)
为0),即
条件
,那么您可以像这样使用lambda表达式

f = lambda m : get_size(m) if not Condition else 0
[f(j) for j in i]


我希望有这样的异常回退行:
a=f1()或lse 8
。为什么这种事情不存在?因为这是一个坏主意,或者可能不是肾盂?为什么?事实上,这是存在的。你可以在一行中完成“或”、“和”,如果不是的话<代码>>>x=lambda:0;a=x()或1;打印(a)
>a=x(),如果x()否则1;打印(a)
。如果这是您想要的,我可以设计出一个与您的用例相匹配的答案。@ThuYeinTun我知道
,但在出现异常的情况下,这并没有帮助。我错了吗?据我所知,当遇到异常时,try-except块是必须的,没有其他快捷方式…是的,try-except是处理异常所必需的,并且是唯一的方法。您需要有一个处理异常和返回值的函数,而不是异常。然后,您可以使用
选择值,或
如果
。我也相信,您所述的最新选项是使用异常的唯一可能方式。我希望有异常回退一行代码,如下所示:
a=f1()或lse 8
。为什么这种事情不存在?因为这是一个坏主意,或者可能不是肾盂?为什么?事实上,这是存在的。你可以在一行中完成“或”、“和”,如果不是的话<代码>>>x=lambda:0;a=x()或1;打印(a)
>a=x(),如果x()否则1;打印(a)
。如果这是您想要的,我可以设计出一个与您的用例相匹配的答案。@ThuYeinTun我知道
,但在出现异常的情况下,这并没有帮助。我错了吗?据我所知,当遇到异常时,try-except块是必须的,没有其他快捷方式…是的,try-except是处理异常所必需的,并且是唯一的方法。您需要有一个处理异常和返回值的函数,而不是异常。然后你可以使用
来选择值,或者
如果
。我也相信你说的最新选项是使用例外的唯一可能的方法。我想OP想知道是否有EAFP方法而不是LBYL方法。。。但是,是的,您所建议的可能在那个特定的条件下工作。我想知道有一种方法可以编写能够使用2个以上表达式(而不仅仅是返回)的匿名函数。Javascript拥有它。Python没有?我需要匿名函数的原因是什么?因为我想把函数放在列表理解中。你的代码不等于
[lambda m=j:get_size(m)for j in I if not Condition else 0]
?python中的匿名函数称为lambda表达式。一个lambda表达式只能有一个表达式,所以不是。是的,它是等价的。但是你的语法是错误的,也就是说你的代码会出错。我认为OP想知道是否有EAFP方法而不是LBYL方法。。。但是,是的,您所建议的可能在那个特定的条件下工作。我想知道有一种方法可以编写能够使用2个以上表达式(而不仅仅是返回)的匿名函数。Javascript拥有它。Python没有?我需要匿名函数的原因是什么?因为我想把函数放在列表理解中。你的代码不等于
[lambda m=j:get_size(m)for j in I if not Condition else 0]
?python中的匿名函数称为lambda表达式。一个lambda表达式只能有一个表达式,所以不是。是的,它是等价的。但是你的语法是错误的,也就是说,你的代码会出错。