使用包含print语句的Python一行代码生成None`s列表

Using Python one liner containing print statement produce list of None`s

1
2
3
ts_file ="ts_nfl_04_red_zone_conversion"

ts_title = [print(i + ' ', end="") for i in ts_file[7:].upper().split("_")]

结果:

1
04 RED ZONE CONVERSION [None, None, None, None]

什么会产生这个无语句列表,以及如何避免它?多谢。


您可以使用replace代替:

1
>>> ts_file[7:].upper().replace("_","")


您可以用join代替拆分字符串产生的元素:

1
2
ts_title = (' ').join(ts_file[7:].upper().split("_"))
# '04 RED ZONE CONVERSION'


正如其他人提到的,print()不返回任何内容。因此,不打印任何内容。如果您想知道为什么元素被正确打印,然后是4个None,那是因为函数如何工作。

一个函数被调用,一旦内部的每个语句都被执行,就会返回一个值,但前提是该函数返回了一些东西。

在您的例子中,print(i + ...)调用了i上的print函数,print被执行,这意味着它将i打印到控制台,然后返回其值,这是无的,因为print()不返回任何内容。

对于解决方案,您可以使用.join()方法或replace()方法:

1
2
a = ts_file[7:].upper().replace("_","")
print(a)

1
2
a = (' ').join(ts_file[7:].upper().split("_"))
print(a)

输出:

1
04 RED ZONE CONVERSION

你也可以做另一件事,如果你不关心存储在标题中的内容:一旦你指定了你的列表理解的标题:

1
ts_title = [print(i + ' ', end="") for i in ts_file[7:].upper().split("_")]

如果运行脚本,您将在屏幕上得到预期的输出,正如我在回答开始时解释的那样。


您生成了一个None列表,因为您创建了一个。这就是列表理解的目的:创建列表。但是,表达式不会自动打印,除非您在交互式解释器中,并且已将表达式返回到顶层,这意味着您实际上不会看到此输出,因为您要将其保存到变量中。

无论如何,在这种情况下,应该使用一个正则循环,如下所示:

1
2
3
4
ts_file ="ts_nfl_04_red_zone_conversion"

for i in ts_file[7:].upper().split("_"):
    print(i + ' ', end="")

但是,当然,您仍然可以使用理解并通过稍微重新排列列表来创建空列表,将其保存到变量中,这样它就不会自动打印在交互式解释器中:

1
2
3
ts_file ="ts_nfl_04_red_zone_conversion"

ts_title = [None for i in ts_file[7:].upper().split("_") if print(i + ' ', end="")]


如注释所述,print返回None,不用于列表理解。

如果你想要一条直线来达到你想要的结果,你可以做一些类似的事情

1
print(' '.join(ts_file[7:].upper().split("_")))


这里不需要进行列表比较,因为print语句返回None类型。您可以这样循环字符串:

1
for i in ts_file[7:].upper().split("_"): print(i +"", end="")