意外的Python打印行为

意外的Python打印行为,python,Python,刚刚遇到了以下我无法理解的蟒蛇行为: names = ["Paul", "Mary", "Susan"] names.sort() def valuate(string): print ord('A') return sum(ord(s) for s in string) i = 1 for name in names: print i, name, valuate(name) i += 1 我希望输出: 65 1 Mary 409 65 2 Paul 40

刚刚遇到了以下我无法理解的蟒蛇行为:

names = ["Paul", "Mary", "Susan"]
names.sort()

def valuate(string):
    print ord('A')
    return sum(ord(s) for s in string)

i = 1
for name in names:
    print i, name, valuate(name)
    i += 1
我希望输出:

65
1 Mary 409
65
2 Paul 402
65
3 Susan 522
但相反,输出:

1 Mary 65
409
2 Paul 65
402
3 Susan 65
522
似乎print语句已经尝试输出3个元素,当调用print ord'A'时,会将其作为第三个语句吗

我没有找到任何关于这种行为的参考资料,也不知道如何用谷歌搜索。顺便说一下,我在这里使用的是Python 2.7.3。不管怎样,我在这里很困惑。

这不仅仅是print语句,而是函数调用

print i, name, valuate(name)
Prints i,然后name,然后调用valuate,valuate打印65和一个新行,然后在返回时print语句继续打印返回值和另一个新行。

这不仅仅是print语句,它是函数调用

print i, name, valuate(name)

打印i,然后是name,然后调用valuate,它打印65和一个新行,然后在返回时,print语句继续打印返回值和另一个新行。

这非常简单。print语句对参数进行惰性计算。它首先打印i,然后是name,然后调用evaluate。估价印刷品65。然后,您的print语句将打印评估结果。

这非常简单。print语句对参数进行惰性计算。它首先打印i,然后是name,然后调用evaluate。估价印刷品65。然后,print语句将打印求值结果。

事件顺序如下:

print i,
print name,
val = valuate(name) # prints ord('A')
print val
通过查看为打印i、名称、评估名称生成的字节码,可以确认这一点:


我不知道这张评估单是否能保证快速搜索没有发现任何东西。我绝对不会依赖它,因此也不会编写这样的代码。

事件顺序如下:

print i,
print name,
val = valuate(name) # prints ord('A')
print val
通过查看为打印i、名称、评估名称生成的字节码,可以确认这一点:


我不知道这张评估单是否能保证快速搜索没有发现任何东西。我绝对不会依赖它,因此也不会编写这样的代码。

我认为一个小小的“,”会让事情变得更容易掌握

names = ["Paul", "Mary", "Susan"]
names.sort()

def valuate(string):
    print ord('A'),
    return sum(ord(s) for s in string)

i = 1
for name in names:
    print i, name, valuate(name)
    i += 1
现在,输出:

1 Mary 65 409
2 Paul 65 402
3 Susan 65 522

打印后的逗号不允许在末尾打印新行字符。现在您可以看到,valuate首先打印ord'A',然后返回外部打印的输出。我还缩进了I+=1行

我认为一个小的“,”会使事情更容易掌握

names = ["Paul", "Mary", "Susan"]
names.sort()

def valuate(string):
    print ord('A'),
    return sum(ord(s) for s in string)

i = 1
for name in names:
    print i, name, valuate(name)
    i += 1
现在,输出:

1 Mary 65 409
2 Paul 65 402
3 Susan 65 522

打印后的逗号不允许在末尾打印新行字符。现在您可以看到,valuate首先打印ord'A',然后返回外部打印的输出。我还缩进了I+=1行

您遇到的惊喜是,在计算下一个表达式之前,它会打印出给出的每个表达式。也就是说,像print a、B、C这样的语句相当于:

print A, # note, the trailing comma suppresses the newline
print B,
print C
正如您从单独的语句中所期望的那样,在计算B或C之前先写出A

这一意外可能是Python3放弃print语句而使用内置print函数的部分原因,该函数的行为更像您期望在函数运行之前对其所有参数进行求值

在Python 2中,如果希望使用将来的导入,可以获得Python 3样式的打印:


您所遇到的令人惊讶的是,在计算下一个表达式之前,将打印出它给出的每个表达式。也就是说,像print a、B、C这样的语句相当于:

print A, # note, the trailing comma suppresses the newline
print B,
print C
正如您从单独的语句中所期望的那样,在计算B或C之前先写出A

这一意外可能是Python3放弃print语句而使用内置print函数的部分原因,该函数的行为更像您期望在函数运行之前对其所有参数进行求值

在Python 2中,如果希望使用将来的导入,可以获得Python 3样式的打印:


事实上,我对print函数的概念模型是在打印发生之前对所有参数进行求值。但现在我了解了它的执行方式,以及它将来的行为。事实上,我对print函数的概念模型是,所有参数都是在打印发生之前计算的。但现在我了解了它的执行方式,以及它在未来的表现。