20220810-Python学习

本篇文章代码来自《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!"是程序最后输出的内容。

 
posted @ 2022-08-10 17:30  Diligent_Maple  阅读(66)  评论(0编辑  收藏  举报