如何解决在变量中添加“.days”有什么作用?
因此,我正在上一门Python课程,并且正在进行一章测验。第一次回答问题时,我错了,然后我看到了实际答案。这两个未知数是(bday-today).days
。另外,我还想知道"Birthday in %d days" % (diff+365)
的工作原理。
这是代码:
from datetime import *
def main():
today=date.today()
bday=date(today.year,12,13)
diff=(bday-today).days
if diff>0:
print("Birthday in %d days" % diff)
else:
print("Birthday in %d days" % (diff+365))
main()
解决方法
对于(bday-today).days
,当人们看到像(a + b)
这样的表达式上调用的方法时,通常会感到惊讶。 (a + b).method()
永远都行不通。
但是,您不会在括号中调用.method()
;您正在根据a + b
的结果调用它,该结果应该是支持调用.method()
的对象。
考虑以下代码:
a = "Hello,"
b = "World!"
如果要查找组合字符串的长度怎么办?好吧,你可以这样做:
c = a + b
print( len(c) )
但是您可以使用以下方法保存步骤:
print( len(a + b) )
这可能不会让您感到惊讶,但让我们稍微改变一下这个问题:
如果您想要组合字符串的大写等效项怎么办?好吧,你可以这样写:
c = a + b
print( c.upper() )
或者,您可以保存一个步骤并执行以下操作:
print( (a + b).upper() )
由于您可能从未见过用括号括起来的表达式调用过方法,因此这对您来说可能很奇怪。但是,所有发生的事情是(a + b)正在创建一个新对象(这是一个str
对象),然后将其调用的.upper()
方法。
您可能(也可能没有)看到过这样的代码:
some_function().some_action()
那看起来不对,但这是吗?看来我们正在调用函数的方法!
但我们不是。真正发生的事情是some_function()
返回一个对象,并且该对象具有可以调用的.some_action()
方法。基本上,上面的代码实际上与以下代码没有什么不同:
var = some_function()
var.some_action()
(除了返回的some_function()
的值未存储在变量中)。
这不是Python的怪癖;这种行为可以在C ++,Java和几乎所有其他面向Obejct的语言中找到。
(如果您不知道这一点,不会感到难过。我与一位专业的C ++程序员一起工作(有十多年的经验),他不知道C ++可以做到这一点。当我向他解释时他认为这是行得通的,所以最好“安全地玩”而不是使用该构造-因为,您知道“编译器可能不支持它!”但是,此必须得到面向对象的语言-否则,OO的基本属性将被破坏-即,对象(甚至返回的对象)都可以调用其方法。)
对于"Birthday in %d days" % (diff+365)
,这是一种格式化文本的旧方法,已被f-strings
和str.format()
取代。基本上,这些行是等效的:
"Birthday in %d days" % (diff+365) # Usually found in Python 2.X
"Birthday in {} days".format(diff+365) # Usually found in Python 3.X
f"Birthday in {diff+365} days" # Usually found in Python 3.X
如果您习惯于使用Python 3.X编程,那么它对您来说似乎并不陌生。我建议您对其进行一些阅读(以便您可以识别其含义),但是在编写自己的代码时使用其他格式方法。
,第diff = (bday - today).days
行获得bday
的实例today
和datetime.timedelta
之间的差,然后从{ {1}},也就是直到(或自此)生日的天数。括号是必要的,因为如果没有括号,days
将被评估为timedelta
,这是没有道理的。
类似地,bday - today.days
与上面的两行基本上相同,但是在将bday - (today.days)
放在字符串中"Birthday in %d days" % (diff+365)
的天数之前,将356
添加。同样,由于%d
在技术上仍然是“乘法/除法”类型的操作,因此必须有括号,即使它在这里使用的方式不同,因此绑定比加法更强,即如果没有,它将被评估为{{1} },这又没有意义。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。