不使用%的打印语句中的(,)有什么区别

时间:2019-02-25 09:28:17

标签: python-3.x

我已经看到一些有关打印样的声明,

print('%d' % (b, ))

但是,当我实现这一点时,输出是相同的

print('%d' % b)

那有什么区别,我可以只使用第二个吗?

我是初学者,非常感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

结果没有差异。但是所使用的基本机制有所不同。在第一种情况下,您将传递一个元组。在第二个-一个数字。需要逗号来指定您打算精确通过元组。

您还可以通过:

print('%d' % (b))

此变体等于第二个变体-(b)被解释为数字。

还值得一提的是,这是旧的格式化机制。您可以在这里阅读更多内容:

https://docs.python.org/3/library/stdtypes.html#old-string-formatting

但是有一个新的:

https://docs.python.org/3/library/stdtypes.html#str.format

甚至更新的版本(python3.6):

https://docs.python.org/3/whatsnew/3.6.html#whatsnew36-pep498

答案 1 :(得分:0)

在使用旧格式的情况下,您遇到了处理1长度元组的特殊情况。两者的最终结果是相同的,因为%格式处理1个长度元组的方式有多旧。

还要注意,关于python允许尾随逗号的问题,还有另一个问题。我已经在this answer上进行了更多讨论,但要点是python也允许在参数中使用生活质量尾随逗号,这随后导致必须通过某种方式解决的1长度元组的歧义。

  

问题在于python如何解释函数参数,   同时允许“生活质量”结尾的逗号。功能是   用括号括起来,并用逗号分隔参数。当你通过   type(1,),以逗号分隔的参数与   末尾的逗号和一个实际的元组。

下面的示例应有助于使区分更加清楚。

one_number = 3 #creates an int object

one_item_tuple = (3,) #creates a 1 length tuple that contains an int object

type(one_item_tuple)
Out[3]: tuple

one_item_tuple[0] == one_number
Out[4]: True

print("%d hello" % one_number)
3 hello

print("%d hello" % one_item_tuple) #here is the edge case behaviour.
3 hello

请注意,您确实应该使用较新的格式化工具。使用%格式化字符串是一种非常过时的方法。

您可以使用.format

print("{} hello".format(one_number))
3 hello

print("{} hello".format(one_item_tuple)) #more obvious and graceful with tuples
(3,) hello

print("{} hello".format(3,)) #but this runs into the 1-argument with trailing comma vs 1 length tuple ambuigity corner case
3 hello

或者在Python 3.6之后是f-strings

print(f"{one_number} hello")
3 hello

print(f"{one_item_tuple} hello")
(3,) hello

print(f"{3,} hello") #robust even in this case, because it has to interpret the contents inside `{}` first
(3,) hello