模块的基础
模块的定义
一个模块就是以.py结尾的python 文件,用来从逻辑上组织python代码。注意,模块名和变量名一样开头不能用数字,可以是双下划线和字母。
为什么要用模块? 将一些复杂的需要重复使用的功能进行分类,分别放到一个py文件中,需要调用的时候直接拿来用就可以了。
模块的导入方法
##模块导入的方法 1 import 模块名 可以导入多个模块,中间用逗号,但是不建议这么用。 适用范围:需要导入一个模块中的多个函数变量时。 2.from 模块名 import 函数 可以跟多个函数 适用范围:需要导入一个模块的一个函数时,这样比上个方法,节省内存。 3. from 模块名 import * 导入这个模块的所有函数,变量,这个方法不建议使用,如果有重名的就会覆盖。它一般和__all__配合使用。__all__,是一个列表,他会把,*中的所有的变量名,方法名放进去。(这个了解一下就可以了)。 4. from 模块名 import 函数 as 另一个函数名 给函数重新命名 注意:当重新命名后,原函数名不能使用了。 使用范围:1.函数名特别长,2,模块函数名和程序中的函数名重名是。 5.__import__: 同import语句同样的功能,但__import__是一个函数,并且只接收字符串作为参数,所以它的作用就可想而知了。其实import语句就是调用这个函数进行导入工作的,import sys <==>sys = __import__('sys')
import 的本质是:把要导入的模块中的内容运行了一遍。
from module import function 的本质:只把该模块中的该函数运行了一遍,这样就大大的提高了效率。
介绍下sys.modules ,首先来说sys.modules是一个全局字典.python解释器启动的时候会把一些模块名加载进来放到字典中,注意这里加载的只是模块的名字,而不是模块,只有你import的时候才会加载模块(这里有个例外内建模块builtins中的内容可以直接使用),还要注意一点,并不是把所有的内建的模块都加载进来,而是一部分,比如说re模块就没有加载进来,time模块就就被加载进来了。
sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules都将记录这些模块。
字典sys.modules对于加载模块起到了缓冲的作用。当某个模块第一次导入,字典sys.modules将自动记录该模块。当第二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。
如果你想导入re模块其实他正确的搜索顺序是这样的:首先在sys.modules中找,没有找到,然后再去sys.path(sys.path是python的搜索模块的路径集,是一个list)中找,先找列表中的第一个路径,这个路径就是保存着的你自己写的模块,如果这时候正好你也写了一个re模块,它就会先执行你写的这个RE模块,而不是真正的RE模块,这就是为什么你自己的模块的名字不能和内建的模块名字相同的原因。python内置的模块放在了python36目录下Lib中。第三方模块放在python36目录下Lib中的site-packages 。
介绍下sys.path, sys.path是python的搜索模块的路径集,是一个列表
['C:\\Users\\stickerzhang\\PycharmProjects\\untitled3\\算法',
'C:\\Users\\stickerzhang\\PycharmProjects\\untitled3\\算法',
'C:\\Users\\stickerzhang\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip',
'C:\\Users\\stickerzhang\\AppData\\Local\\Programs\\Python\\Python36\\DLLs',
'C:\\Users\\stickerzhang\\AppData\\Local\\Programs\\Python\\Python36\\lib',
'C:\\Users\\stickerzhang\\AppData\\Local\\Programs\\Python\\Python36',
'C:\\Users\\stickerzhang\\AppData\\Roaming\\Python\\Python36\\site-packages',
'C:\\Users\\stickerzhang\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages']
可以在python 环境下使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失!
解决方案点击
介绍下内建模块builtins(python3) 在python2中是__builtin__ 注意在python3中没有__builtins__模块
Python解释器启动时会自动执行:
from builtins import *
这就是为什么内建函数不用导入就可以使用的原因吧.
这里边有149个内容
包含7个模块相关
'__build_class__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__'
4个特殊名字
欢迎界面里的copyright,credits,help,license:
6个内建常数
'True', 'False', 'None', 'Ellipsis', '__debug__', 'NotImplemented'
68个内建函数
61+3个异常
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
模块导入的顺序:内置模块先从sys.modules 中寻找,找不到再从sys.path给的路经依次中寻找。
所有的内置函数都放在了builtints(python3)模块中,在python解释器启动时,这个模块就被加载过了。
pyc:是这个代码编译后的文件。当一个py文件被当做模块导入时会生成一个pyc文件,这个文件 把代码编译成字节码,再次运行该模块时会直接运行pyc文件而不需要重新在编译,这样就大大提高加载模块的速度,强调强调强调:提高的是加载速度而绝非运行速度。
我们推荐所有的模块应该这样导入:
python标准库模块
python第三方模块
python自己写的模块
需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。虽然每次都说,但是仍然会有人不停的犯错。
if __name__ == "__main__:"
在很多python脚本中在最后的部分会执行一个判断语句if __name__ == "__main__:",之后还可能会有一些执行语句。那添加这个判断的目的何在?
在python编译器读取源文件的时候会执行它找到的所有代码,而在执行之前会根据当前运行的模块是否为主程序而定义变量__name__的值为__main__还是模块名。因此,该判断语句为真的时候,说明当前运行的脚本为主程序,而非所引用的模块。这在当你想要运行一些只有在将模块当做主程序运行时而非当做模块引用时才执行的命令,只要将它们放到if __name__ == "__main__:"判断语句之后就可以了。
举个例子,比如说你要在text2中引用text1模块,在text1模块中写入a="hello worlf">>> print(a),然后你导入text1,然后运行text2,这时候你会发现,我还没有调用text1.a,它就会打印hello Word,但是你不想这样啊,你想什么时候调用text1.a才会打印helloWord,这该怎么办?
方法:在text1程序中,写入if __name__ == "__main__:",然后把print(a),放入这条件语句后,就可以 了。这样我只有运行text1程序的时候才会直接打印helloWord,导入text1程序时,只有调用text1 .a 才会打印helloWord。你会问为什么会这样?
因为当你想要运行你当前的模块而非引用的模块时,__name__的值就是"__main__",当你在另外一个模块中导入该模块时该模块中的__name__值就变为该模块的模块名了。
举个列子:假设你在text1中写入print(__name__)>>>你会得到 "__main__". 然后你在text2文件中导入text1模块,运行text2文件,你会得到>>>text2,这个模块的文件名,这就是__name__的作用。
说了这么多废话,官方这样解释:确保服务器只会在该脚本被python解释器直接执行的时候,才会被运行,而不是作为模块导入的时候.
time模块
表示时间的三种方式
在Python中,通常有这三种方式来表示时间:时间戳、元组(struct_time)、格式化的时间字符串:
(1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
(2)格式化的时间字符串(Format String): ‘1999-12-06’ 注意这个的数据类型是字符串
%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 当前时区的名称 %% %号本身 python中时间日期格式化符号: