人生苦短,我用python-- Day5
本节目录
模块定义
包定义
导入模块方法
导入包的方法
import模块本质
import包本质
路径搜索和搜索路径
导入优化
模块的分类
模块定义#
用来从逻辑上组织python代码(可以在里面定义变量、函数、类等,也可以写一些逻辑),本质上就是一个以.py结尾的python文件,来实现某些功能
eg: 文件名 test.py 模块名 test
包的定义#
用来从逻辑上组织模块,包的本质就是一个目录(必须带一个__init__.py的文件)
导入模块方法#
1 # Author:Sean sir 2 #方法一: 3 #单独导入一个模块 4 import module_test1 5 #使用方法 6 module_test1.fun1() 7 8 #方法二: 9 #同时导入多个模块 10 import module_test1,module_test2 11 #使用方法 12 module_test1.fun1() 13 module_test2.fun1() 14 15 #方法三: 16 #同时导入某个某块中中的所有代码(如:变量、方法、类等),加入模块中有fun1方法 17 from module_test1 import * 18 #使用方法 19 fun1() 20 21 #方法四: 22 #也可是使用from来导入某个方法 23 from module_test1 import fun1 24 #使用方法 25 fun1() 26 27 print(module_test1.name) 28 module_test1.say_hello()
上面的方法三和方法四不建议使用,原因是这样会导致本地的方法会和模块中的方法冲突,如下:
# Author:Sean sir # test1.py中也定义一个名为say_hello的方法 def say_hello(): print('in the test1.py') # 然后调用模块中的所有方法,当然这里是用方法四的方式饮用模块,同样也是这样的 from module_test1 import * # 执行say_hello方法 say_hello() # 输出 in the module_test1.py
为了解决上面的问题,我们来看方法五:
# Author:Sean sir # test1.py中也定义一个名为say_hello的方法 def say_hello(): print('in the test1.py') # 然后调用模块中的所有方法,在用模块中的方法的同时给方法名字重命名 from module_test1 import say_hello as test1_say_hello # 执行say_hello方法 say_hello() # 执行模块中的say_hello方法 test1_say_hello() #输出 in the test1.py in the module_test1.py
答惑解疑:
我们使用方法四可以同时导入两个或者更多的方法,但是我们不能使用方法五来同时对两个或多个方法进行重命名的操作
# 错误的导入方式 from module_test1 import say_hello1,say_hello2 as test1_say_hello,test2_say_hello
导入包的方法#
# 导入一个包 import aa
倒入包且调用包中模块的方法#
########run_test.py文件内容 ''' 需求说明:有两个包,分别为d5/modlue1 d5/modlue2,前者下面有一个fun_test模块, 后者又一个run_test的代码程序文件,在run_test文件引用modlue1包的同时, 执行fun_test里面的run方法 ''' # 调用os和sys模块 import os,sys # 获取d5目录的绝对路径 PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 把d5目录的绝对路径加到搜索路径里面 sys.path.append(PATH) # 引用modlue1包 import modlue1 # 运行modlue1包里面fun_test模块中的run方法 modlue1.fun_test.run()
######modlue1包下的init文件内容 # Author:Sean sir print('in the modlue1 package') # 调用本目录下的fun_test模块 from . import fun_test
# Author:Sean sir # fun_test.py文件内容 def run(): print('in the run')
输出一下执行结果
in the modlue1 package in the run
import模块本质#
导入模块的本质就是把python文件解释一遍,但是使用from和直接使用impor是有本质区别的,我们来看一下:
# Author:Sean sir # 使用这种方式导入,相当于把moule_test1里面的代码运行了一遍,切把代码的执行过程赋值给一个名为module_test1的变量名 import module_test1 # 所以如果使用上述中的方法,直接用module_test1加模块里面的方法名称就可以了,如下 module_test1.say_hello1() # 使用这种方式导入,相当于把moule_test1中的say_hello1方法赋值给say_hello1 from module_test1 import say_hello1 # 调用这个方法,直接使用方法名就可以了 say_hello1()
import包本质#
执行该包下的__init__.py文件
搜索路径和路径搜索 #
我们在python中不管是导入模块还是导入包,python自己会有一个列表,python会根据这个列表的路径进行搜索我们所需要的模块或包名字,如果找到则导入,如果找不到,则抛出异常,我们来看看这个搜索路径是什么呢?
>>># 这就是搜路径
>>> import sys >>> sys.path ['', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages']
当我们导入包或模块的时候,系统就会按照这个路径进行搜索。
下面需求来了,假如我们要导入一个不在同一个目录中的模块,当然这个模块是我们手动定义的且不在上面路径中,我们怎么办呢?
# Author:Sean sir ''' 需求说明: 路径结构 d5/modlue1/fun_test.py d5/modlue2/run_test.py 要在run_test.py文件中调用fun_test.py模块,且运行里面的方法 ''' # 调用os和sys模块 import os,sys # 查找到d5的绝对路径 PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 把d5的绝对路径加到python的搜索路径中 sys.path.append(PATH) # 导入模块d5/modlue1/fun_test模块 from modlue1 import fun_test # 运行d5/modlue1/fun_test模块里的run方法 fun_test.run() # 输出 in the run
解释下上面的代码,__file__显示的是当前文件的相对路径,os.path.abspath()显示的是当前文件的绝对路径,os.path_dirname()显示的是当前文件的所在目录,也就是说上一层的目录
导入优化#
假如有一个方法要被重复调用N次,如果我们还是使用import module_name的方式进行调用的话,那么在找模块的时候会消耗很大的时间,这个时候我们就建议使用from module_name import fun_name as fun_new_name的方式进行调用了。
模块分类#
标准库模块、开源模块、自定义模块
标准库模块#
1.time 和 datetime模块
在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素。由于Python的time模块实现主要
调用C库,所以各个平台可能有所不同。
UTC(Coordinated Universal Time,世界协调时)亦即格林威治天文时间,世界标准时间。在中国为UTC+8。DST(Daylight Saving Time)即夏令
时。
时间戳(timestamp)的方式:通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是
float类型。返回时间戳方式的函数主要有time(),clock()等。
eg:
>>> import time >>> time.time() 1472203851.802466
元组(struct_time)方式:struct_time元组共有9个元素,返回struct_time的函数主要有gmtime(),localtime(),strptime()。下面列出这种方式元
组中的几个元素
eg:
>>> import time >>> time.localtime() time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=17, tm_min=33, tm_sec=51, tm_wday=4, tm_yday=239, tm_isdst=0)
说一下time模块中的方法:
1.daylight
# 测试是否使用了夏令时时间
>>> print(time.daylight) 0
2.time()
#获取过去时间戳 从1970年到现在的秒数
>>> time.time() 1472206530.91158
3.sleep()
# 等待2秒钟在执行下面代码
>>> time.sleep(2)
4.gmtime()
#传入一个时间戳,返回一个元组格式的时间(UTC时间,比北京时间晚8个小时),如果不传的话,默认使用当时时间。 >>> a = time.time() >>> time.gmtime(a) time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=10, tm_min=19, tm_sec=2, tm_wday=4, tm_yday=239, tm_isdst=0) >>> time.gmtime() time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=10, tm_min=19, tm_sec=13, tm_wday=4, tm_yday=239, tm_isdst=0)
5.localtime()
#把时间戳转换成元组格式时间(转换成本地时间,如北京时间),不传默认使用当前时间 >>> a = time.time() >>> time.localtime(a) time.struct_time(tm_year=2016, tm_mon=8, tm_mday=26, tm_hour=18, tm_min=19, tm_sec=2, tm_wday=4, tm_yday=239, tm_isdst=0) >>> time.localtime(19827643) time.struct_time(tm_year=1970, tm_mon=8, tm_mday=18, tm_hour=19, tm_min=40, tm_sec=43, tm_wday=1, tm_yday=230, tm_isdst=0) >>>
作者:屌丝逆袭记
出处:https://www.cnblogs.com/xinzhiyu/p/5809294.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律