模块初始与time、datetime及random
模块初始
模块的概念(本质为一个py文件)
python模块可以将代码量较大的程序分割成多个有组织的、彼此独立但又能互相交互的代码片段,这些自我包含的有组织
的代码段就是模块,模块在物理形式上表现为以.py结尾的代码文件
一个文件被看作一个独立的模块,一个模块也可以被看作是一个文件
模块的文件名就是模块的名字加上扩展名.py
每个模块都有自己的名称空间
python允许“导入”其他模块以实现代码重用,从而也实现了将独立的代码文件组织成更大的程序系统
python中,模块也是对象
在一个模块的顶层定义的所有变量都在被导入时成为了被导入模块的属性
模块的分类
分为三部分:内置模块、第三方模块,自定义模块
模块的好处
分模块的好处:
- 避免写重复代码
- 可以多次利用
- 拿来即用
模块的导入(imort)
import time,os # 单行导入
import time #多行导入(推介写法)
import os
模块导入发生的事情
- 当前的名称空间中开辟一个新的空间(test)
- 将模块中所有的代码执行
- 通过模块名.进行查找函数(工具)
模块的别名
import time as t #将time命名为t
t.strftime() # t.可直接调用函数方法# 做一兼容性
choose = input(msg)
if choose == "1":import meet as t
elif choose == "2":import test as tfrom datetime import datetime as t
from import 也支持重新命名
for import
导入模块中的某些方法:
from datetime import datetime
# 导入模块中的某种方法
form import和import的区别:
唯一的区别就是:使用from...import...则是将spam中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了
from...import...的方式有好处也有坏处
- 好处:使用起来方便了
- 坏处:容易与当前执行文件中的名字冲突
form import执行文件与模块同名的变量,会有覆盖效果
from import as *
from import as *导入模块中未限制的所有方法
可以使用__all__进行限制
__all__=['name','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字
模块的导入顺序
内存中已经加载的模块 > 自定义模块 > 内置模块 > 第三方模块
- 在第一次导入某个模块时,会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用(ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看)
- 如果没有,解释器则会查找同名的内置模块
- 如果还没有找到就从sys.path给出的目录列表中依次寻找文件。
# 导入路径:# 使用相对路径:
from day15.t1 import meet # day15.t1 meet相对路径
print(meet.name)# 使用绝对路径:
# 错误示例:# from r"D:\" import meet# from ../# 正确的绝对路径:
from sys import path
path.insert(0,"D:\\") # 将导入模块的绝对路径插入系统路径中
import meet
print(meet.name)
模块的两种用法:
- 作为脚本(在终端中运行python文件)
- 作为模块(导入或使用)
time模块
time模块方法及用法
import time
print(time.time()) # 当前时间,浮点数
time.sleep(2) # 休眠2秒,本质为阻塞
time.strftime("%Y-%m-%d %H:%M:%S",结构化时间) # 将结构化时间转化成字符串时间
time.gmtime(时间戳) # 将时间戳转化成格林尼治结构化时间
time.mktime(结构化时间) # 将结构化时间转化时间戳
time.strptime(字符串时间,"%Y-%m-%d %H:%M:%S") # 将字符串时间转换成结构化时间
time.localtime() # 将时间戳转化成当地的结构化时间
python中时间日期格式化符号:
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
time模块计算两个时间的时间差:
计算时间差:import time
true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time=time_now-true_time
struct_time=time.gmtime(dif_time)
print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,struct_time.tm_mday-1,struct_time.tm_hour,struct_time.tm_min,struct_time.tm_sec))
其他方法:
#结构化时间 --> %a %b %d %H:%M:%S %Y串
#time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
>>>time.asctime(time.localtime(1500000000))
'Fri Jul 14 10:40:00 2017'
>>>time.asctime()
'Fri Jul 26 18:34:59 2019'#时间戳 --> %a %b %d %H:%M:%S %Y串
#time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串
>>>time.ctime()
'Fri Jul 26 18:34:59 2019'
>>>time.ctime(1500000000)
'Fri Jul 14 10:40:00 2017'
datetime模块
获取当前日期和时间:
from datetime import datetime
print(datetime.now()) # 获取对象数据类型为对象
# 结果:
'2019-07-26 18:39:46.300129'
获取指定的时间和日期:
from datetime import datetime
dt = datetime(2018,5,20,13,14)
print(dt)
# 结果:
'2018-05-20 13:14:00'
datetime与时间戳的转换:
from datetime import datetimedt = datetime.now()
new_timestamp = dt.timestamp() # 转化成时间戳
print(new_timestamp)
#结果:1543931750.415896import time
from datetime import datetimenew_timestamp = time.time()
print(datetime.fromtimestamp(new_timestamp)) # 转化成datetime时间
# 结果:
'2019-07-26 18:46:13.833992'
str与datetime的转换:
很多时候,用户输入的日期和时间是字符串,要处理日期和时间,首先必须把str转换为datetime。转换方法是通过datetime.strptime()
实现,需要一个日期和时间的格式化字符串:
from datetime import datetimet = datetime.strptime('2018-4-1 00:00','%Y-%m-%d %H:%M')
print(t)
'''
结果: 2018-04-01 00:00:00
'''# 如果已经有了datetime对象,要把它格式化为字符串显示给用户,就需要转换为str,转换方法是通过`strftime()`实现的,同样# 需要一个日期和时间的格式化字符串:```
from datetime import datetime
now = datetime.now()
print(now.strftime('%a, %b %d %H:%M'))
# 结果:
'Mon, May 05 16:28'
datetime加减:
对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。加减可以直接用+
和-
运算符,不过需要导入timedelta
这个类:
from datetime import datetime, timedelta
now = datetime.now()
now
datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
now + timedelta(hours=10)
datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
now - timedelta(days=1)
datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
now + timedelta(days=2, hours=12)
datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
可见,使用timedelta
你可以很容易地算出前几天和后几天的时刻。
指定datetime时间:
current_time = datetime.datetime.now()
print(current_time.replace(year=1977)) # 直接调整到1977年
print(current_time.replace(month=1)) # 直接调整到1月份
print(current_time.replace(year=1989,month=4,day=25)) # 1989-04-25 18:49:05.898601
random模块
print(random.random()) # 0 ~ 1
print(random.uniform(1,10)) # 1 ~ 10
print(random.randint(1,50)) # 1 ~ 50(闭区间)
print(random.randrange(1,5,2)) # randrange(起始,终止,步长)
print(random.choice([1,2,3,4,5,])) # 选择一个元素
print(random.choices([1,2,3,4,5,],k=2)) # 选择两个元素,会有重复
print(random.sample((1,2,3,4,5),k=2)) # 选择两个元素,不会有重复(除非只有两个)lst = [1,2,3,4,5,6,7,8,9,0]
random.shuffle(lst) # 顺序打乱
print(lst)