20220810-Python学习
time模块
计算机的系统时钟设置为特定的日期、时间和时区。内置的time模块让Python程序读取系统时钟的当前时间。
time.time()函数
time.time()函数返回自那一刻以来的秒数,它是一个浮点数。这个数字称为UNIX“纪元时间戳”。
>>> import time >>> time.time() 1659850839.793136
返回值是UNIX纪元的那一刻与time.time()被调用的那一刻之间的秒数。
time.time()函数的返回值是有用的,但不是人类可读的。time.ctime()函数返回一个关于当前时间的字符串描述。
>>> import time >>> time.ctime() 'Mon Aug 8 13:10:07 2022' >>> thisMoment = time.time() >>> time.ctime(thisMoment) 'Mon Aug 8 13:10:10 2022'
time.sleep()函数
如果需要让程序暂停一下,就调用time.sleep()函数,并传入系统程序暂停的秒数。
>>> import time >>> for i in range(3): ... print('Tick') ... time.sleep(1) ... print('Tock') ... time.sleep(1) Tick Tock Tick Tock Tick
数字四舍五入
Python内置的round()函数按照指定的精度四舍五入一个浮点数。只要传入要处理的数字,再加上可选的第二个参数,指明需要传入小数点后多少位即可。
>>> import time >>> now = time.time() >>> now 1659936296.9454935 >>> round(now, 2) 1659936296.95 >>> round(now, 4) 1659936296.9455 >>> round(now) 1659936297
datetime模块
time模块用于取得UNIX纪元时间戳,并加以处理。但是,如果以更方面的格式显示日期或对日期进行算术运算,就应该使用datetime模块。
datetime模块有自己的datetime数据类型。datetime值表示一个特定的时刻。
>>> import datetime >>> datetime.datetime.now() datetime.datetime(2022, 8, 10, 14, 4, 50, 937575) >>> dt = datetime.datetime(2022, 8, 10, 14, 4, 50, 937575) >>> dt.hour, dt.minute, dt.second (14, 4, 50)
UNIX纪元时间戳可以通过datetime.datetime.fromtimestamp()转换为datetime对象。datetime对象的日期和时间将根据本地时区转换。
>>> import datetime, time >>> datetime.datetime.fromtimestamp(1000000) datetime.datetime(1970, 1, 12, 21, 46, 40) >>> datetime.datetime.fromtimestamp(time.time()) datetime.datetime(2022, 8, 10, 14, 9, 32, 113796)
datetime对象可用比较操作符进行比较。
>>> halloween2019 = datetime.datetime(2019,10,31,0,0,0) >>> newyears2022 = datetime.datetime(2022,8,31,0,0,0) >>> oct31_2019 = datetime.datetime(2019,10,31,0,0,0) >>> halloween2019 == oct31_2019 True >>> halloween2019 > newyears2022 False >>> newyears2022 > halloween2019 True >>> newyears2022 != oct31_2019 True
timedelta数据类型
datetime模块还提供了timedelta数据类型,它表示一个“时段”,而不是一个“时刻”。
>>> delta = datetime.timedelta(days=11, hours=10, minutes=9, seconds=8) >>> delta.days, delta.seconds, delta.microseconds (11, 36548, 0) >>> delta.total_seconds() 986948.0 >>> str(delta) '11 days, 10:09:08'
算术运算符可以用于对datetime值进行“日期运算”。
>>> dt = datetime.datetime.now() >>> dt datetime.datetime(2022, 8, 10, 14, 32, 54, 848033) >>> thousandDays = datetime.timedelta(days = 1000) >>> dt + thousandDays datetime.datetime(2025, 5, 6, 14, 32, 54, 848033)
暂停直至特定日期
time.sleep()方法可以暂停程序若干秒。利用一个while循环,可以让程序暂停一段特定的时间。
import datetime, time halloween2022 = datetime.datetime(2022, 8, 10, 0, 0, 0) while datetime.datetime.now() < halloween2022: time.sleep(1)
time.sleep(1)调用将暂停你的Python程序,这样计算机就不会浪费CPU处理周期来一遍又一遍地检查时间。相反,while循环只是每秒检查一次,再2022年8月10日后继续执行后面地程序。
将datetime对象转换为字符串
利用strftime()方法将datetime对象显示为字符串。
strftime指令 | 含义 |
---|---|
%Y | 带世纪的年份,例如'2014' |
%y | 不带世纪的年份,'00'至'99'(1970至2069) |
%m | 数字表示的月份,'01'至'12' |
%B | 完整的月份,例如'November' |
%b | 简写的月份,例如'Nov' |
%d | 一月中的第几天,'01'至'31' |
%j | 一年中的第几天,'001'至'366' |
%w | 一周中的第几天,'0'(周日)至'6'(周六) |
%A | 完整的周几,例如'Monday' |
%a | 简写的周几,例如'Mon' |
%H | 小时(24小时时钟),'00'至'23' |
%I | 小时(12小时时钟),'01'至'12' |
%M | 分,'00'至'59' |
%S | 秒,'00'至'59' |
%p | 'AM'或'PM' |
%% | 就是'%'字符 |
strftime()将返回一个格式化地字符串,以表示datetime对象的信息。
>>> oct21st = datetime.datetime(2019, 10, 21,16, 29, 0) >>> oct21st.strftime('%Y/%m/%d %H:%M:%S') '2019/10/21 16:29:00' >>> oct21st.strftime('%I:%M %p') '04:29 PM' >>> oct21st.strftime("%D of '%y") "10/21/19 of '19"
将字符串转换成datetime对象
strptime)函数与strftime()函数相反,自定义的格式字符串使用的指令与strftime()的相同,必须将改革是字符串传入strptime(),这样它就知道如何解析和理解日期字符串。
>>> datetime.datetime.strptime('October 21, 2019', '%B %d, %Y') datetime.datetime(2019, 10, 21, 0, 0) >>> datetime.datetime.strptime('2019/10/21 16:29:00', '%Y/%m/%d %H:%M:%S') datetime.datetime(2019, 10, 21, 16, 29) >>> datetime.datetime.strptime("October of '19", "%B of '%y") datetime.datetime(2019, 10, 1, 0, 0) >>> datetime.datetime.strptime("November of '63", "%B of '%y") datetime.datetime(2063, 11, 1, 0, 0)
多线程
要得到单独的线程,首先要调用threading.Thread()函数来生成一个Thread对象。
import threading, time print('Start of program.') def takeANap(): time.sleep(5) print('Wake up!') threadObj = threading.Thread(target=takeANap) threadObj.start() print('End of program.')
我们定义了一个希望用于新线程的函数。为了创建一个Thread对象,我们调用threading.Thread(),并传入关键字参数target=takeANap。这意味着我们要在新调用的函数是takeANap()。请注意,关键字参数target=takeANap,而不是target=takeANap()。这是因为你想将takeANap()函数本身作为参数,而不是调用takeANap()并传入它的返回值。
输出如下:
Start of program.
End of program.
Wake up!
Wake up!再最后输出,是因为当threadObj.start()被调用时,threadObj的目标函数再一个新的执行线程中运行,将它看作出现在takeANap()函数的开始处的第二条路。主线程则继续执行print('End of program.')。同时,新线程已执行了time.sleep(5)调用,暂停5秒中。之后它从5秒"小睡"中醒来,输出了"Wake up!",然后从takeANap()函数返回。按时间顺序,"Wake up!"是程序最后输出的内容。