Python 如何将案例排除在理解之外

Python 如何将案例排除在理解之外,python,Python,我试图排除返回“无”的理解上的案例。 下面实现了它,但导致调用函数两次 >>> def func(x): ... if x>10: ... return None ... else: ... return x*2 ... >>> result1=[func(x) for x in l if func(x) is not None] >>> result1 [4, 8, 1

我试图排除返回“无”的理解上的案例。 下面实现了它,但导致调用函数两次

>>> def func(x):
...     if x>10:
...         return None
...     else:
...         return x*2
...         
>>> result1=[func(x) for x in l if func(x) is not None]
>>> result1
[4, 8, 14, 6]
出路是什么

result1[:] = [x for x in map(func, l) if x is not None]
在Python2.x上使用
itertools.imap

注意:
过滤器(无,映射(func,l))
通常会工作,但这也会删除
0
(因为它被认为是空的)

在Python2.x上使用
itertools.imap


注意:
过滤器(无,映射(func,l))
通常会工作,但这也会删除
0
(因为它被认为是空的)

这段代码呢:

print([x*2 for x in l if x <= 10])

那么这个代码呢:

print([x*2 for x in l if x <= 10])
def func(x):
如果x>10:
一无所获
其他:
返回x*2
lst=[2,4,12,7,30,3]
#原创的
结果0=[如果func(x)不是None,则lst中x的func(x)]
#地图。。。在Python2.x上,使用itertools.imap()
结果1=[x表示映射(func,lst)中的x,如果x不是None]
断言结果1==result0
#生成器表达式
结果2=[x代表x(func(y)代表lst中的y),如果x不是无]
断言结果2==result0
#将函数重写为生成器函数
def func_gen(可编辑):
对于iterable中的x:
如果x
def func(x):
如果x>10:
一无所获
其他:
返回x*2
lst=[2,4,12,7,30,3]
#原创的
结果0=[如果func(x)不是None,则lst中x的func(x)]
#地图。。。在Python2.x上,使用itertools.imap()
结果1=[x表示映射(func,lst)中的x,如果x不是None]
断言结果1==result0
#生成器表达式
结果2=[x代表x(func(y)代表lst中的y),如果x不是无]
断言结果2==result0
#将函数重写为生成器函数
def func_gen(可编辑):
对于iterable中的x:

如果x@IUnknown返回一个迭代器而不是列表。因此,它对于大型数据集更为有效,对于小型列表,您不会看到太大的差异。还有一个问题-如何为需要两个附加参数的函数调用映射-def func(x,乘数)。@IUnknown您可以将
映射(func,l)
更改为
(func(x,乘数)表示l中的x)
或使用functools import partial中的
映射(partial(func,multiplier),l)
@IUnknown它返回迭代器而不是列表。因此,它对于大型数据集更为有效,对于小型列表,您不会看到太大的差异。还有一个问题-如何为需要两个附加参数的函数调用映射-def func(x,乘数)。@IUnknown您可以将
映射(func,l)
更改为
(func(x,乘数)表示l中的x)
或使用functools import partial中的
映射(partial(func,multiplier),l)
True-但是我的函数要复杂得多,并且不完全依赖于输入。在这种情况下,您可以分离函数。一个将检查元素是否可以处理,第二个将处理它。是的-但是我的函数要复杂得多,并且不完全依赖于输入。在这种情况下,您可以分离函数。一个将检查元素是否可以处理,第二个将处理它。
def func(x):
    if x>10:
        return None
    else:
        return x*2

lst = [2, 4, 12, 7, 30, 3]

# original
result0 = [func(x) for x in lst if func(x) is not None]

# map... on Python 2.x, use itertools.imap()
result1 = [x for x in map(func, lst) if x is not None]
assert result1 == result0

# generator expression
result2 = [x for x in (func(y) for y in lst) if x is not None]
assert result2 == result0

# rewrite function as a generator function
def func_gen(iterable):
    for x in iterable:
        if x <= 10:
            yield x*2

# no need to filter; filtering happens in generator function
result3 = list(func_gen(lst))
assert result3 == result0


# build a filtering generator out of parts
def fn_x2(x):
    return x * 2

def filter_leq10(x):
    return x <= 10

def make_filtering_gen_func(fn, flt, name="anonymous"):
    def anonymous(iterable):
        for x in iterable:
            if flt(x):
                yield fn(x)
    anonymous.__name__ = name
    return anonymous

func_gen1 = make_filtering_gen_func(fn_x2, filter_leq10)
result4 = list(func_gen1(lst))
assert result4 == result0