8.模块定义导入优化time datetime内置模块

1.模块(module)的定义:本质就是.py的python文件
用来从逻辑上组织python代码(变量\函数\类\逻辑:实现一个功能)
包(package)的定义:用来从逻辑上组织模块的,本质就是一个文件夹,里面必须带有一个__init__.py文件

2.导入方法:
(1) import module_name 导入单个模块
(2) import module_name,module2_name,....,modulex_name 导入多个模块,pep8不推荐
以上两种导入模块方法,调用时需要用module_name.method_name()调用
(3) from module_name import * 导入module中所有方法变量等 慎用
(4) from module_name import m1,m2,m3
用from导入,调用时不需要用module_name,直接 method_name()就能调用模块中的方法,如果运行文件内有同名方法,那么模块的方法会被覆盖,所以不建议用这种方法
(5) import module_name as another_module_name 模块定义别名,调用时用 别名.method_name()调用
(6) form module_name import method_name as another_name 把从模块导入的方法起一个别名,在本文件内好记易用,调用时直接another_name()


3.import本质(路径搜索和搜索路径)
导入一个模块,python解释器会按照顺序搜索模块名
1.当前目录
2.如果不在当前目录,则搜索shell变量pythonpath下的每个目录
3.如果都找不到,python会查看默认路径.unix下,默认路径一般为/usr/local/lib/python/ #一般不涉及到默认路径
★模块搜索路径存储在sys模块的sys.path变量中,变量里包含当前目录和pythonpath和由安装过程决定的默认目录,修改sys.path就能修改模块搜索路径及顺序
注意:
1.自己的文件名不要和已有模块名重复,否则导致模块功能无法使用
2.使用form module import method 的时候,如果功能名字重复,调用的是最后导入或定义的功能
3.如果使用import module_name导入的模块,不用担心功能名字重复,因为调用的时候需要用 module_name.method_name()
4.模块名也会被重名变量名代替,所以变量起名时也要注意不要与模块名重复

导入模块的本质就是把导入的python文件解释(运行)一遍 ()

import test test="test.py all code"
frome test import name name="code"
sys.path 包含寻找模块或包的所有路径,是个列表,可以在这个列表中添加路径
示例:
import sys,os
os.path.abspath(__file__) #获取当前文件的绝对路径
os.path.dirname(os.path.abspath(__file__)) #获取当前文件所在文件夹的绝对路径
file_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #获取当前文件所在的文件夹的父文件夹的绝对路径
sys.path.insert(0,file_path) #按照需求找好要导入的文件夹,插入到sys.path的最前面

__all__(__all__是个列表)
如果一个模块文件中有__all__变量,当使用from xxx import *导入时,只能导入这个列表中的元素,所以可以用__all__列表来控制import *时被导入的功能
__all__ = ["方法名1","方法名2"]

包(package)
包将有联系的模块组织在一起,即放到同一文件夹下,并且文件夹内有__init__.py文件,name这个文件夹就称为包
__init__,py控制包的导入行为,导入包的本质就是执行该包下的__init__.py文件
导入包
方法1 导入:import 包名.模块名 调用: 包名.模块名.目标
方法2 导入:from 包名 import * 调用: 模块名.目标 (注意:必须在__init__.py中添加__all__=[],控制允许导入的模块列表

4.导入优化
import 模块名 每次使用都得查找模块名,执行效率低
可以用from 模块名 import 目标 直接使用目标,省略

5.模块的分类
1.标准库(内置模块):如time,sys等
2.开源模块(第三方模块):
3.自定义模块

====================================================
time模块
表示时间方式:
1.时间戳:time.time()获取当前的时间戳,返回一个浮点数为1970.1.1:00:00到现在的秒数
2.格式化的时间字符串
3.元组(struct_time)共九个元素.由于python的time模块实现主要调用C库,所以各个平台可能有所不同
time.localtime() #返回time.struct_time(tm_year,tm_mon,tm_mday,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)最后一个表示是否夏令时
返回的struct_time,可以用元组里面的各键取到各属性值如:x=time.localtime x.tm_year #取到年
中国时区为UTC+8,比标准时间早8小时

time模块的方法:
time.time() time.time()获取当前的时间戳,返回一个浮点数为1970.1.1:00:00到现在的秒数
time.sleep(x) 延迟x秒时间
time.gmtime(seconds) 传入一个时间戳,返回utc的struct_time,如果不加参数则返回当前utc标准时间的struct_time,
★time.localtime(seconds) 传入一个时间戳,返回当前时区的struct_time,不加参数则转换当前时间戳,返回一个本时区的struct_time
time.mktime(struct_time) 传入一个时间元组,返回一个时间戳
time.strftime("%Y-%m",struct_time) 传入自定义格式化字符串和元组,返回自定义时间字符串,不加元组则返回当前时间的字符串
%Y(年) %m(数字月) %d(日) %H(时) %M(分) %S(秒) %z(时区) %a(三字母简写星期几) %A(星期几全名)
time.strftime("%Y-%m-%d %H:%M:%S %A") # "2020-1-29 16:17:32 Wednesday"

time.strptime("2020-1-29 16:17:32 Wednesday","%Y-%m-%d %H:%M:%S %A") strftime的反向操作,返回struct_time
第一个参数放时间字符串,第二个参数放表示格式字符串,第一个参数必填,第二个参数省略则用默认('%a %b %d %H:%M:%S %Y'),这时候
第一个参数的字符串必须按照默认格式编写
也可以用来得到一个符合需求的struct_time
%a - 简写的星期几
    %A - 完整的星期几
    %b - 缩写的月份名称
    %B - 完整的月份名称
    %c - 首选日期和时间表示
    %C - 世纪值(年份除以100,范围从00到99)
    %d - 该月的第几天(01?31)
    %D - 类似 %m/%d/%y
    %e - 该月的一天(1?31)
    %g - 类似于%G,但是没有世纪
    %G - 对应于ISO周数4位数的年份(参见%V)
    %h - 类似于 %b
    %H - 小时,使用24小时制(00?23)
    %I - 小时,使用12小时制(01?12)
    %j - 一年中的哪一天(001?366)
    %m - 月份(01?12)
    %M - 分钟
    %n - 换行符
    %p - 根据给定的时间值am或pm
    %r - 时间在上午和下午的符号:am/pm
    %R - 时间以24小时制
    %S - 秒
    %t - 制表符
    %T - 当前时间,等于 %H:%M:%S
    %u - 工作日为数字(1到7),星期一= 1。警告:在Sun Solaris上周日=1
    %U - 当年的周数,第一个星期日作为第一周的第一天
    %V - 本年度ISO 8601的周数(01到53),其中,第1周是在本年度至少4天的第一个星期,星期一作为一周的第一天
    %W - 当年的周数,与第一个星期一作为第一周的第一天
    %w - 星期为一个小数,星期日=0
    %x - 没有时间的日期表示
    %X - 无日期首选的时间表示
    %y - 一年无世纪(范围从00到99)
    %Y - 今年,包括世纪
    %Z or %z - 时区或名称或缩写
    %% -文字%字符

time.asctime([struct_time]) 传入一个struct_time,返回一个python默认的日期时间字符串('%a %b %d %H:%M:%S %Y'),如果不传参数,则默认当前的时间元组
time.ctime(seconds) 传入一个时间戳,其他同上

========================================================
datatime 基于time模块的高层封装
日期时间相关 具体参考https://blog.csdn.net/cmzsteven/article/details/64906245

6.测试模块
模块完成后,在模块内写一段测试代码,测试模块能否完成我们的需求
# 只在当前文件中运行测试代码,在其他导入的文件内不符合条件,不执行测试代码
if __name__ == '__main__':
测试代码
# __name__是本文件的python默认的标识符,如果__name__使用的位置是在自身文件内,那么它的值就是'__main__'
# 如果不是在自身文件内,那么它的值就是自身文件名
#上面的if代码意思是:如果自身文件被运行,就符合if条件,就运行测试代码,如果在被导入的文件内运行,那么__name__ == 模块名
#不符合条件,就不运行测试代码

猜你喜欢

转载自www.cnblogs.com/huohu121/p/12241074.html