我已经看到一些有关打印样的声明,
print('%d' % (b, ))
但是,当我实现这一点时,输出是相同的
print('%d' % b)
那有什么区别,我可以只使用第二个吗?
我是初学者,非常感谢您的帮助。
答案 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