TipsPython 针对函数返回值实现列表推导

Posted sting-roc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TipsPython 针对函数返回值实现列表推导相关的知识,希望对你有一定的参考价值。

背景

设想这样一个场景,我们定义函数foo来生成一个大于0的随机code。但是函数执行可能会出现异常,对于异常情况我们指定函数返回-1。

在批量处理的情况下,我们想要得到所有成功执行的foo函数的返回值集合,而忽略返回-1的情况。基本的逻辑如下:

result = []

for item in item_lst:
    code = foo(item)
    if code != -1:
        result.append(code)

 

使用列表推导的解决方案

如果想用列表推导的方式实现,有下面几种解决方案:

Solution 1:

result = [foo(item) for item in item_lst]
result = [code for code in result if code != -1]

先用列表推导获取到了函数的返回值,然后再执行一次筛选,需要执行两次列表推导。

Solution 2:

result = [foo(item) for item in item_lst if foo(item) != -1]

执行一次列表推导,但是很明显,foo函数执行了两次。如果foo函数比较耗时,或者多次执行会产生副作用的话都会有问题。

Solution 3:

result = [code for code in (foo(item) for item in item_lst) if code != -1]

使用 生成器表达式 来处理中间结果,不需要临时列表,并且是基于迭代器的,优于上面两种方法。

 

参考

  1. How to execute a filter by function return value in list comprehension?

以上是关于TipsPython 针对函数返回值实现列表推导的主要内容,如果未能解决你的问题,请参考以下文章

python学习笔记函数return多个值,列表推导式和交换两个变量的值

python之生成器和列表推导式

C++11的新鲜事儿~

ldc

Java 中类似 Python 的列表推导

各种推导式