打印在生成器表达式中不起作用

Print not working in generator expression

我希望看到数字 1-9 的组合列表,但没有打印任何内容。我错过了什么?

import itertools

def PrintIt(num):
    print(num)
    return True

nums = itertools.permutations(range(1, 10))

x = (num for num in nums if PrintIt(num)) # Prints nothing

如果我 print(list(x)),它会按预期打印所有不同的排列。

发生这种情况的原因是因为您正在将 x 分配给生成器表达式。除非需要,否则生成器表达式不会进行任何计算。要强制计算,更简单的方法是将其强制为列表。在这种情况下,您会强制 Python 列出一个列表,因此 python 必须执行所有计算,包括测试打印位置。所以你可以这样打印:

x = [num for num in nums if PrintIt(num)]

x = (num for num in nums if PrintIt(num))
list(x)

顺便说一下,你不需要打印功能,你可以直接完成:

x = [num for num in nums if print(num)]

但是使用 if 不是为了测试某些条件,而只是为了像您在这里所做的那样的副作用,充其量是值得商榷的。这就是我编写您的程序的方式:

import itertools
nums = itertools.permutations(range(1, 10))
for num in nums:
    print(num)