time.localtime() 是如何工作的?使用方法也很简单的简要问题!
time.localtime() 是怎么工作的呢?我可以调用它返回的“数组”(我想它叫元组,因为它是不可变的?)并引用或索引其中的组件。例如:
>>> time.localtime()[0]
2010
但是如果我这样做:
print time.localtime()
time.struct_time(tm_year=2010, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=46, tm_sec=58, tm_wday=6, tm_yday=38, tm_isdst=0)
首先:time.localtime() 是怎么知道要返回 time.struct_time() 的?
其次:如果我输入 print time.struct_time(),它需要我传入额外的值(所以它给我的值和 time.localtime() 返回的值不一样)——我怎么知道那些值可能是什么呢?我查了 Python 的文档,但看得一头雾水。其实我只是想要一个例子...
第三:当我索引 time.localtime() 返回的元组时,它返回了正确的关联值,比如“2010”,而不是“tm_year=2010”——它是怎么知道这样做的(我只是想大致了解,不想问太多)。
第四:如果我想从 time.localtime() 中“调用” tm_year,我该怎么做?我现在做的(但感觉不太对)是:
tm_year = str(time.localtime()[0])
tm_mon = str(time.localtime()[1])
tm_mday = str(time.localtime()[2])
tm_hour = str(time.localtime()[3])
tm_min = str(time.localtime()[4])
注意:我把它们保存为字符串是出于其他原因,这里不详细说明,只是想指出我创建了自己的变量(名字和元组中的完全一样),然后引用我想要的值的索引。
有没有办法直接调用 time.localtime(tm_year)(我知道这样不行,但只是随便想想...)
提前谢谢你...(我看过 "http://docs.python.org/library/time.html",但我肯定漏掉了一些重要信息...有什么建议吗?)
-J
4 个回答
print
这个命令会尝试把它所有的参数都转成字符串形式。对于一个struct_time
对象来说,它的__repr__
或__str__
方法会返回这样的结果:time.struct_time(tm_year=2010, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=46, tm_sec=58, tm_wday=6, tm_yday=38, tm_isdst=0)
你可以查看Python文档了解更多信息。
不要使用它。它是一个内部数据结构。
当你使用索引操作符
[]
时,它的表现就像一个元组。
你可以自己创建“命名元组”,也就是可以通过索引或属性访问的元组子类,这个功能可以通过collections.namedtuple来实现(在Python 2.6或更高版本中)。其实,命名元组并没有什么“神奇”的地方,尤其是那些在time
模块中返回的实例(它们稍微有点不同,因为它们是在collections.namedtuple
之前就存在的)。
举个例子,time.localtime().tm_year
会给你想要的年份(当然,你可以把它传给str
,或者赋值给你想要的任何东西)。
不过,由于你也可以把结果当作元组来访问,所以你还有其他选择,比如切片、元组解包等等。
当你调用time.struct_time
时,你是在创建它的一个实例——你需要传入一个参数,这个参数是一个包含正好九个项目的序列。(如果是一个普通的命名元组,类似的情况你需要传入九个参数——当然,如果你有一个九个元素的序列foo
,传九个参数是很简单的,比如你可以调用bar(*foo)
;-)。
顺便提一下,你关注的是localtime
,但这并不是唯一返回struct_time
的函数,gmtime
和strptime
也会返回同类型的实例!-)
time.localtime()[0]
这个调用实际上是在对 time.struct_time
这个实例使用 __gettiem__()
方法。这样就能让它表现得像一个列表或元组。下面是一个非常简单的例子:
>>> class MyTime(object):
... def __init__(self, year, month, mday, hour, minute):
... self.data = year, month, mday, hour, minute
... def __getitem__(self, idx):
... return self.data[idx]
... def __str__(self):
... return "MyTime(tm_year=%s, tm_mon=%s, tm_mday=%s, tm_hour=%s, tm_min=%s)"%self.data
...
>>> x=MyTime(2010,2,7,14,46)
>>> x[0]
2010
>>> x[1]
2
>>> print x
MyTime(tm_year=2010, tm_mon=2, tm_mday=7, tm_hour=14, tm_min=46)
time.struct_time
是一个类。time.localtime()
会返回这个类的一个实例,这就是你在打印它们时看到的不同之处。
你可以这样加载你的5个变量:
>>> tm_year,tm_mon,tm_mday,tm_hour,tm_min=map(str,time.localtime()[:5])