2015-12-15 28 views
0

我正在做这个教程,我遇到了这个奇怪的错误。我打印日期。为什么我得到这个python连接错误?

因此,样本代​​码之前,你需要有:

from datetime import datetime 
now = datetime.now() 

这将打印

print "%s" "/" "%s" "/" "%s" % (now.month, now.day, now.year) 

那么这将会

print "pizza" + "pie" 

所以将这个

print "%s/%s/%s" % (now.month, now.day, now.year) 

但是,当我介绍串联运营商:

#Traceback (most recent call last): 
# File "python", line 4, in <module> 
#TypeError: not all arguments converted during string formatting 
print "%s" + "/" + "%s" + "/" + "%s" % (now.month, now.day, now.year) 

它的某种级联问题。我不明白的是代码将在我连接其他字符串时以及当我不使用与我想要的字符串串联时打印。

+1

因为它试图所有值格式化到最后'“%S”'。你需要用parens来包装字符串。 –

+1

这是一个运算符优先级的简单问题 – njzk2

回答

2

你是运算符优先级引起的遇到的问题。

以下行可行,因为这是string literal concatenation,它的优先级高于%运算符。

print "%s" "/" "%s" "/" "%s" % (now.month, now.day, now.year) 

下列不工作,因为+操作符比%运算符的优先级低。

print "%s" + "/" + "%s" + "/" + "%s" % (now.month, now.day, now.year) 

要解决它,所以它首先被执行加括号拼接,就像这样:

print ("%s" + "/" + "%s" + "/" + "%s") % (now.month, now.day, now.year) 
+0

我接受了这个,因为尽管第一个答案帮助我解决了这个问题,但解释更加彻底,尽管我自己看了一会儿,却花了一段时间。当我拥有1个权力时,我会加1个第一个答案。 – user3452783

5

正因为如此:

print "%s" + "/" + "%s" + "/" + "%s" % (now.month, now.day, now.year) 

是与此相同,由于operator precedence(注意额外的括号)

print "%s" + "/" + "%s" + "/" + ("%s" % (now.month, now.day, now.year)) 
+0

我没有关注。这是抛出它的优势,另外有更高的优先?不应该这样做,因为它假设它们正在被“打印”%s“”/“”%s“”/“”%s“%(now.month,now.day,now.year) 级联?认为你可以多解释一下? – user3452783

+0

再想一想,我现在明白了。空格实际上不会将这些字符串连接在一起,而只是将这些字符串打印在一起。附加标志作为运营商以及百分比符号,并将其顺序混淆。 – user3452783