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:
如果xdef 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