Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在条件列表理解中使用函数调用结果?_Python 3.x_List Comprehension - Fatal编程技术网

Python 3.x 如何在条件列表理解中使用函数调用结果?

Python 3.x 如何在条件列表理解中使用函数调用结果?,python-3.x,list-comprehension,Python 3.x,List Comprehension,我想将此代码转换为一个列表: l = list() for i in range(10): j = fun(i) if j: l.append(j) 这意味着我只想将truthyfun()结果值添加到列表中。如果没有对该函数调用的真实检查,列表理解将是: l = [fun(i) for i in range(10)] 在列表理解中添加一个if-fun(i)将导致每次迭代对fun()进行两次评估(实际上,似乎并不总是如此!),因此,如果fun()不是纯粹的,则会

我想将此代码转换为一个列表:

l = list()
for i in range(10):
    j = fun(i)
    if j:
        l.append(j)
这意味着我只想将truthy
fun()
结果值添加到列表中。如果没有对该函数调用的真实检查,列表理解将是:

l = [fun(i) for i in range(10)]
在列表理解中添加一个
if-fun(i)
将导致每次迭代对
fun()
进行两次评估(实际上,似乎并不总是如此!),因此,如果
fun()
不是纯粹的,则会导致意外的副作用


我是否可以捕获
fun(I)
的结果,并在相同的理解中使用它,如果j,则本质上添加
?(相关问题)

您可以在列表comp中创建一个内部生成器,以便查看func的结果

l = [j for j in (func(i) for i in range(10)) if j]

或者结合两种建议的解决方案:

filter(None, (func(i) for i in range(10)))
编辑 简单得多:

[res for res in map(func, range(10)) if res]
谢谢你给福斯特的提示

旧答案 另一个选项是使用辅助生成器函数:

def call_iter(func, iterable):
    for arg in iterable:
        yield func(arg)

[res for res in call_iter(func, range(10)) if res]

l=filter(None,map(fun,range(10))
l=[x代表x in(fun(i)代表i代表范围(10)),如果x]
@falsetru:您的第一条语句返回一个iterable
filter
对象而不是列表,而您的第二条语句是一个习惯用法和一个实际列表。是的,您需要将第一条语句用
列表(…)
获取列表。@falsetru:这将导致总共两次迭代,除非全部迭代,并且延迟操作(根据需要)。
map
filter
在Python 3.x中延迟操作(返回迭代器)。这将返回一个
过滤器对象
iterable,而不是列表本身。但在大多数情况下,这可能无关紧要。这是一个问题,但与返回iterable
filter
对象的习惯用法不同,
l
是请求的列表。虽然这会起作用,但它与我对一行程序的痴迷相矛盾,并努力实现最大的代码密度;-)嗯,你可以重复使用这个功能。因此,将它放入一个模块
tools
,只需一次导入即可获得一行程序。您不需要
调用iter
。你可以重用
map
@falsetru,这很明显。有时事情太简单,无法识别它们。固定的。