1. time 模块
内置的 time 模块让 Python程序能读取系统时钟的当前时间。
1) time.time()函数
Unix 纪元是编程中经常参考的时间:1970 年 1 月 1 日 0 点,即协调世界时(UTC)。time.time()函数返回自那一刻以来的秒数,是一个浮点值(回想一下,浮点值只是一个带小数点的数)。这个数字称为 UNIX 纪元时间戳。示例:
>>> import time
>>> time.time()
1521155982.183911
注:另一种剖析代码的方法是利用 cProfile.run()函数。与简单的 time.time()技术相比,它提供了详细的信息。
2) 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
Tock
2. 数字四舍五入:round()
可以用 Python 内置的round()函数按照指定的精度四舍五入到一个浮点数。只要传入要舍入的数字,再加上可选的第二个参数,指明需要传入到小数点后多少位。如果省略第二个参数,round()将数字四舍五入到最接近的整数。示例:
>>> import time
>>> now = time.time()
>>> now
1425064108.017826
>>> round(now, 2)
1425064108.02
>>> round(now, 4)
1425064108.0178
>>> round(now)
1425064108
3. datetime 模块
time模块用于取得Unix纪元时间戳,但是如果要更方便的取得日期,就需要使用datetime模块。调用 datetime.datetime.now()返回一个 datetime 对象,表示当前计算机的日期和时间。这个对象包含当前时刻的年、月、日、时、分、秒和微秒。示例:
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 3, 16, 8, 56, 44, 895652)
>>> dt = datetime.datetime(2018, 2, 15, 7, 55, 43)
>>> dt.year, dt.month, dt.day
(2018, 2, 15)
>>> dt.hour, dt.minute, dt.second
(7, 55, 43)
Unix 纪元时间戳可以通过 datetime.datetime.fromtimestamp(),转换为datetime对象。示例:
>>>datetime.datetime.fromtimestamp(11111111111)
datetime.datetime(2322,2, 6, 3, 45, 11)
>>>datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2018,3, 16, 9, 12, 39, 662010)
datetime对象可以用比较操作符进行比较。示例:
>>>halloween2015 = datetime.datetime(2015, 10, 31, 0, 0, 0)
>>>newyears2016 = datetime.datetime(2016, 1, 1, 0, 0, 0)
>>>oct31_ _2015 = datetime.datetime(2015, 10, 31, 0, 0, 0)
>>>halloween2015 == oct31_ _2015
True
>>>halloween2015 > newyears2016
False
>>>newyears2016 > halloween2015
True
>>>newyears2016 != oct31_ _2015
True
1) timedelta 数据类型
datetime 模块还提供了timedelta 数据类型,它表示一段时间,而不是一个时刻。
a) 使用datetime.timedelta()函数创建timedelta数据。接受关键字参数 weeks、days、hours、minutes、seconds、milliseconds 和 microseconds。没有 month 和 year 关键字参数
b) timedelta 对象拥有的总时间以天、秒、微秒来表示。这些数字分别保存在 days、seconds 和microseconds 属性中。
c) total_seconds()方法返回只以秒表示的时间。
d) 将一个 timedelta 对象传入 str(),将返回格式良好的、人类可读的字符串表示。
示例:
>>> import datetime
>>> 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'
e) 利用+和-运算符,timedelta 对象与 datetime 对象或其他 timedelta 对象相加或相减。利用*和/运算符,timedelta 对象可以乘以或除以整数或浮点数。示例:
计算当前时间后的100天日期。
>>> import datetime
>>> dt = datetime.datetime.now()
>>> hundredDays =datetime.timedelta(days = 100)
>>> dt + hundredDays
datetime.datetime(2018, 6, 24, 11, 13, 3,828899)
2) 将 datetime 对象转换为字符串
时间戳和datetime对象对人来说都不是友好可读的。利用strftime()方法可以将datetime对象转为适合人可读的字符串。(strftime()函数名中的f 表示格式,format)。
示例:
>>>oct21st = datetime.datetime(2015, 10, 21, 16, 29, 0)
>>>oct21st.strftime('%Y-%m-%d %H:%M:%S')
'2015-10-21 16:29:00'
3) 将字符串转换成 datetime 对象
使用strptime()函数可以将字符串转换成datetime对象(strptime()函数名中 p 表示解析,parse)。示例:
>>>datetime.datetime.strptime('October 21, 2015','%B %d, %Y')
datetime.datetime(2015, 10, 21, 0, 0)
4. 多线程
1) 向线程的目标函数传递参数
如果想在新线程中运行的目标函数有参数,可以将目标函数的参数传入threading.Thread()。常规参数可以作为一个列表,传递给threading.Thread()中的 args 关键字参数。关键字参数可以作为一个字典,传递给threading.Thread()中的kwargs 关键字参数。示例:
>>> import threading
>>> threadObj = threading.Thread(target=print,args=['Cats', 'Dogs', 'Frogs'],
kwargs={'sep': ' & '})
>>> threadObj.start()
Cats & Dogs & Frogs
2) 并发问题
为了避免并发问题,绝不让多个线程读取或写入相同的变量。当创建一个新的Thread 对象时,要确保其目标函数只使用该函数中的局部变量。这将避免程序中难以调试的并发问题。
5. 从 Python 启动其他程序
使用subprocess模块的Popen()函数,Python 程序可以启动计算机中的其他程序(Popen()函数名中的 P 表示process,进程)。如果你打开了一个应用程序的多个实例,每个实例都是同一个程序的不同进程。
每个进程可以有多个线程。不像线程,进程无法直接读写另一个进程的变量。
示例(打开计算器):
>>>import subprocess
>>>subprocess.Popen('C:\\Windows\\System32\\calc.exe')
<subprocess.Popenobject at 0x000001878919E0F0>
Popen() 方法返回Popen()对象,它有两个有用的方法poll()和wait().
可以认为 poll()方法是问你的朋友,她是否执行完毕你给她的代码。如果这个进程在 poll()调用时仍在运行,poll()方法就返回 None。如果该程序已经终止,它会返回该进程的整数退出代码。退出代码用于说明进程是无错终止(退出代码为 0),还是一个错误导致进程终止(退出代码非零,通常为 1,但可能根据程序而不同)。
wait()方法就像是等着你的朋友执行完她的代码,然后你继续执行你的代码。wait()方法将阻塞,直到启动的进程终止。如果你希望你的程序暂停,直到用户完成与其他程序,这非常有用。wait()的返回值是进程的整数退出代码。示例:
>>>calcProc = subprocess.Popen('c:\\Windows\\System32\\calc.exe')
>>>calcProc.poll()
0
>>>calcProc.wait()
0
1) 向 Popen()传递命令行参数
用 Popen()创建进程时,可以向进程传递命令行参数。要做到这一点,向 Popen()传递一个列表,作为唯一的参数。该列表中的第一个字符串是要启动的程序的可执行文件名,所有后续的字符串将是该程序启动时,传递给该程序的命令行参数。实际上,这个列表将作为被启动程序的 sys.argv 的值。示例:
>>>subprocess.Popen(['C:\\Windows\\notepad.exe', 'C:\\hello.txt'])
<subprocess.Popenobject at 0x00000000032DCEB8>
2) Task Scheduler、launchd 和 cron