python全栈开发笔记第二模块
第四章 :常用模块
一、定义:
在程序开发过程中,随着代码越写越多,在一个文件里,代码就会越来越长,越来越不容易维护。
为了编写更好维护的代码,我们把很多函数分组,分别放入不同的文件里。
这样每个文件包含的代码相对减少,很多编程语言都采
用这种组织代码的方式,在 python 中,一个 .py 文件就称为一个模块(Module)。
二、使用模块的作用
1、最大的好处就是提高代码的维护性。
2、可重复使用,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方调用。在编写程
序的时候,也会经常引用其他模块,包括 python 内置的模块和来自第三方模块。
3、使用模块可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此,
相同名字的函数和变量完全可以分别存在不同的
模块中。所以,在编写模块时,名字不会与其他模块冲突。
三、模块分类
1、内置标准模块(又称标准库)
执行help(‘modeules’)查看所有python自带模块列表
2、第三方开源模块
可通过 pip install 模块名联网安装
3、自定义模块
四、模块调用语法
import module (标准语句,导入所有模块)
from module import xx,xx (导入模块内的单个功能加 , 可以同时导入几个单一功能)
from module .xx.xx import xx as rename
(导入函数的文件目录内工具,.xx.xx属于目录层,as rename对当前模块重新命名)
from module .xx.xx import *
(import * 导入工具内所有,不建议重新命名,因为可能导致使用重复,不提倡用此方法)
**注意:模块一旦被调用,就相当于执行了另一个 python文件的 .py 代码
五、自定义模块、模块查找路径
1、自定义模块
自定义模块简单,自己创建一个.py 文件,就可以称为一个模块,在另一个程序被任何人导入调用
C:Users57098PycharmProjectsuntitledpython学习第二模块第四章常用模块>python #进入自定义模块目录运行python Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import my_modules # 导入自定义模块 hello Guoyilong my name is sybue # 已执行
如果不想直接执行,可以把自定义模块内的函数执行命令注销,调用时再执行
C:Users57098PycharmProjectsuntitledpython学习第二模块第四章常用模块>python #进入python交互环境 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import my_modules #导入模块 >>> my_modules.sey_file("Guoyilong") # 执行模块语法 hello Guoyilong >>> my_modules.sey_frt("Guoyilong") my name is Guoyilong
2、查找模块路径
一般自己写的模块只能在当前目录下被调用,不在当前目录调用就会出错,导入模块路径起很大作用
首先要导入python自带工具包(import sys),然后输入(sys.path)可以查看python自带导入模块目录
**路径 分为 【相对路径】和 【绝对路径】
**相对路径:就是在同一个目录下不需要添加多余的路径,直接添加模块上一级的文件名称,
***绝对路径,就是要导入的模块路径地址
C:Program Files>python #先进入python交互器 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys # 导入 sys 模块 >>> sys.path # 模块内查询路径的语法 ['','C:\Users\57098\AppData\Local\Programs\Python\Python36\python36.zip', # 最前面的空目录代表当前目录 'C:\Users\57098\AppData\Local\Programs\Python\Python36\DLLs', 'C:\Users\57098\AppData\Local\Programs\Python\Python36\lib', 'C:\Users\57098\AppData\Local\Programs\Python\Python36', # 这些都是安装python时的默认查找路径 'C:\Users\57098\AppData\Local\Programs\Python\Python36\lib\site-packages'] # 发现最后一个目录 site-packages 这个目录是装第三方模块和自定义模块
最后一行的(site-packages)这个目录是安装第三方模块和自定义模块的内存地址。
自己写的模块怎么执行呢?
可以看到,sys.path 的安装路径是一个列表,可以先进入模块的上一级,把自定义的模块添加进去
C:Users57098PycharmProjectsuntitledpython学习第二模块第四章>python
# 一定要在模块所在文件夹的上一级进入python运行环境 Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import sys # 导入自带模块sys >>> sys.path # 查看下默认文件路径 ['', 'C:\Users\57098\AppData\Local\Programs\Python\Python36\python36.zip',
'C:\Users\57098\AppData\Local\Programs\Python\Python36\DLLs',
'C:\Users\57098\AppData\Local\Programs\Python\Python36\lib',
'C:\Users\57098\AppData\Local\Programs\Python\Python36',
'C:\Users\57098\AppData\Local\Programs\Python\Python36\lib\site-packages'] >>> sys.path.append("常用模块")# 追加上相对路径 >>> sys.path # 再次查看已经追加 ['', 'C:\Users\57098\AppData\Local\Programs\Python\Python36\python36.zip',
'C:\Users\57098\AppData\Local\Programs\Python\Python36\DLLs',
'C:\Users\57098\AppData\Local\Programs\Python\Python36\lib',
'C:\Users\57098\AppData\Local\Programs\Python\Python36',
'C:\Users\57098\AppData\Local\Programs\Python\Python36\lib\site-packages', '常用模块'] >>> import my_modules # 导入模块 >>> my_modules.sey_file("Guoyilong")# 执行模块 hello Guoyilong >>> my_modules.sey_frt("Guoyilong") # 执行模块 my name is Guoyilong
python模块查找路径顺序是按照由左至右查找的,首先查找的是当前目录,往后依次查找。
如果一个电脑上安装多个 python 版本,它们的导入模块路径是不同的,
在不同的版本,要用不同版本的路径,否则会找不到,
六、开源模块的安装与应用
https//pypi.python.org/pypi 是 python 的开源模块库,已收录世界上几十万个开发者贡献的模块,
几乎覆盖想用 python 做任何事情都能用的境界,只要注册一个账号,就可以往平台贡献自己的模块,
以供平台所有人共享
1、下载安装模块(不常用方法)
去网站下载一个第三方模块,下载后,先手动安装
C:Users57098DownloadsPyTyrion-1.0.1>python #找到下载目录运行python Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. C:Users57098DownloadsPyTyrion-1.0.1>python setup.py build # 创建模块路径语法 creating build #此处省略代码 copying Tyrion__init__.py -> buildlibTyrion C:Users57098DownloadsPyTyrion-1.0.1>python setup.py install # 安装模块语法 running install #此处省略代码 Finished processing dependencies for PyTyrion==1.0.1
注意:安装模块先输入(python setup.py build),然后再次输入(python setuo.py install)就安装成功了。
2、导入模块:安装成功后,进入任意路径运行 python,导入模块
C:Users57098>cd.. # 回退目录 C:Users>python # 任意路径运行 python Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import Tyrion # 导入模块
3、删除第三方模块
想删除第三方模块,首先退出 python 环境,输入(pip install PyTyrion),系统自动寻找安装路径,
再次输入(pip uninstall PyTyrion)会弹出 Proceed (是否删除 )(y / n)选择 Y 系统会自动删除
>>> exit() # 退出 python 运行环境 C:Users>pip install PyTyrion # 输入查找路径语法 Requirement already satisfied: PyTyrion in c:users57098appdatalocalprogramspython
python36libsite-packagespytyrion-1.0.1-py3.6.egg You are using pip version 9.0.3, however version 19.0.3 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command. C:Users>pip uninstall PyTyrion # 再输入删除语法 Uninstalling pytyrion-1.0.1: c:users57098appdatalocalprogramspythonpython36libsite-packagespytyrion-1.0.1-py3.6.egg Proceed (y/n)? y # 选择输入Y Successfully uninstalled pytyrion-1.0.1 Traceback (most recent call last): File "c:users57098appdatalocalprogramspythonpython36lib unpy.py", line 193, in _run_module_as_main # 此处省略代码 mtime = os.stat(path).st_mtime FileNotFoundError: [WinError 2] 系统找不到指定的文件。:
'c:\users\57098\appdata\local\programs\python\python36\lib\site-packages\pytyrion-1.0.1-py3.6.egg' # 删除成功
3、在程序内自动安装第三方模块(常用方法)
直接在CMD 环境内(退出 python 运行环境)直接输入( pip install PyTyrion ) 系统自动安装
C:Users>pip install PyTyrion # 此语法要在 cmd 环境下运行 Collecting PyTyrion Downloading https://files.pythonhosted.org/packages/c4/22
/167ec8e203b0f930582a82a1bfcf7faf9d14af3a0d6abc807dbb22ed52f8/PyTyrion-1.0.1.tar.gz Installing collected packages: PyTyrion Running setup.py install for PyTyrion ... done Successfully installed PyTyrion-1.0.1 You are using pip version 9.0.3, however version 19.0.3 is available. You should consider upgrading via the 'python -m pip install --upgrade pip' command. # 系统自动安装成功
七、使用国内源下载模块的方法
下载模块时,如果遇见下载的文件太大,或者多个文件共同下载,会出现卡顿很长的现象,
国内源可以通过一些简单的方法,实现快速安装模块(由于老师的模块说明已经没有,无法代码实现)
图例:
上图明白原因,注意图片上半部分的输入语法
八、包和模块的导入
当模块文件越来越多的时候,就需要对模块文件进行划分,把类型相似或者相同,把执行效果相似的文件放在一个文件夹。
比如把负责跟数据库交互的都放在一个文件夹,把与页面交互相关的放一个文件夹。
1、包的概念
一个文件夹管理多个模块文件,(如图)这个文件夹就叫做 包
2、跨模块调用---不同包的相互导入与应用
****由于这两节课涉及的交互(pycharm写代码)
首先,创建好目录(红线内)(__init__.py)是一个文件内应该存在的空 py'文件,
但是不能删除,删除了如果用python2运行会出错,但是python3的运行环境不会出问题,
所以安全起见尽量不删除,这样 py2 和 py3 就可以实现通用。
创建好目录在目录文件内写进不同的代码,便于互相调用时分辨,
(1)在大文件夹下 tst.py 文件执行同级别的 2 个文件内代码(不跨级别)
需要pycharm 在 tst.py 文件夹内写入以下代码
# 这个1级 .py 文件,不是用来写程序,而是用来互相调用和执行2个包内任意模块 from asar import my_def # 导入同级别下第 1 个包内的模块 my_def.sye() # 执行第1个包内模块 from astr import my_py # 导入同级别下第 2 个包内的模块 my_py.hello() # 执行第2个包内模块
# 执行的代码结果 hello,my name is yilong 你好,我是毅龍 # 用pycharm 执行
下面用cmd 的 python 运行环境执行
# 注意,用 cmd 的运行环境执行,必须先用 cmd 程序的语法进入代码所在的路径文件夹内,才能调用,否则会找不到调用模块 C:Users57098PycharmProjectsuntitledpython学习第二模块第四章常用模块包的解析与应用>python #进入文件路径再运行 python Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import tst # 导入模块 hello,my name is yilong 你好,我是毅龍 #执行效果
(2)在第一个包asar内my_sye导入第二个包astr内的模块(pycharm执行)(跨级别)
需要在asar包内的模块里写导入另一个包内模块的代码
# 只需要把导入模块的代码写在这个模块内 from astr import my_py # 导入第2个包内模块 my_py.hello() def sye(): # 原有模块 print("hello,my name is yilong")
# 再次执行 sts.py (sts.py内的代码不能有重复代码,否则会执行2次) 你好,我是毅龍 hello,my name is yilong
(3)在第二个包内的模块导入第一个包内模块(跨级别)
同上,只需要哦在astr包内模块里写导入另一模块的代码
from asar import my_def # 调用第1个包内模块语法 my_def.sye() def hello(): # 原有代码 print("你好,我是毅龍")
# 执行结果 (执行sts.py前去掉重复代码) hello,my name is yilong 你好,我是毅龍
****需要注意的是,用 cdm 执行时,需要进入相应路径内才能运行 python 并导入执行
3、跨模块调用-----自动识别安装路径
上一节通过一个包下最高等级 .py 程序可以实现跨模块,但那都是自己一个人使用时的方法。
怎么才能让其他人也能正常使用,这就需要自动识别内存路径
# 其他人也能正常调用模块的方法 import sys,os # 导入sys,是为了给环境变量内添加当前路径 # 导入os,新学的语法(自动识别动态路径) # 自动识别内存路径 print(dir()) # 获取路径方法的包 print(__file__) # 获取路径语法 print(os.path.abspath(__file__)) # 获取绝对路径的方法 FIS_FILE = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# 每套一层,就会返回上一层路径(需要到当前包和被调用包都在的层级) # 只要把获取绝对路径添加在最内层括号就可以在所有地方执行都没问题 sys.path.append(FIS_FILE) # 把路径变量添加到环境变量内 from astr import my_py # 再次调用执行 my_py.hello() def sye(): print("hello,my name is yilong")
#执行结果 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', 'os', 'sys'] # 打印 dir() 结果 C:/Users/57098/PycharmProjects/untitled/python学习第二模块/第四章/常用模块/包的解析与应用/asar/my_def.py # 打印__file__结果 C:Users57098PycharmProjectsuntitledpython学习第二模块第四章常用模块包的解析与应用asarmy_def.py # 打印os.path.abspath(__file__)结果 (真实绝对路径) 你好,我是毅龍 # 调用其他包内模块执行结果
4、模块的相对导入(不常用)
之所以不常用,是因为这个功能对路径关系要求非常严格,处理不当就会出错,所以不建议大量使用此功能
(多数用于图解)
本节相互导入模块很多,所以 不便于写代码解释,上图
*注: 这个小节使用不广泛,但是模块相对导入要了解,一般人不会用这样的方法,
特殊遇见此格式也需要掌握其中的原理
九 time模块详解
首先要 导入模块 (import time)下面是它的方法:
1、time.time() 返回当前时间戳
import time # 先导入模块 s = time.time() print(s) #返回时间戳 print(s/365/24/3600) # 计算python运行时间
1555227183.0868871 # 以秒为单位计算(每个时间都不一样) 49.31593046318135 # 计算python运行时间(时间都不一样)
2、time.localtime() 打印本地时间 (可以在括号内填写参数数值,以秒为单位也可以是负数)
w = time.localtime() # 打印本地时间(电脑显示为准)如果修改电脑时间,这个时间也会被修改 print(w) # 这个元祖内的值是可以自由拼接的 print('%s-%s-%s' % (w.tm_year, w.tm_mon, w.tm_mday)) # 通过占位符,来实现日期随意拼接
time.struct_time(tm_year=2019, tm_mon=4, tm_mday=14, tm_hour=15,
tm_min=55, tm_sec=12, tm_wday=6, tm_yday=104, tm_isdst=0) 2019-4-14 # 拼接后的效果
3、time.gmtime() 和 localtime() 类似,返回 UTC (世界网络时间标准)
print(time.localtime(149999999)) # 从 python 计时开始向后推算时间(要计算的时间,以秒为单位) s = time.gmtime() # 和localtime()类似,返回 UTC (世界网络时间标准) print(s)
time.struct_time(tm_year=1974, tm_mon=10, tm_mday=3, tm_hour=10, tm_min=39, tm_sec=59, tm_wday=3, tm_yday=276, tm_isdst=0) # 计算的时间 time.struct_time(tm_year=2019, tm_mon=4, tm_mday=14, tm_hour=8, tm_min=15, tm_sec=24, tm_wday=6, tm_yday=104, tm_isdst=0) # 当前的时间
4、time.mktime() 把固定的时间戳传进去,实现反转得出结果(如果传进去的数值是未知数用到 )
s = time.localtime(149999999) k = time.mktime(s) # 把固定的时间戳传进去,实现反转得出结果(如果传进去的数值是未知数用到) print(k)
149999999.0 # 得出结果和传进去的相同
5、time.sleep(指定时间) 把线程推向指定时间运行( 以秒为单位 )
time.sleep(10) # 把下面的程序推迟10秒运行(单位是秒) s = time.localtime(149999999) k = time.mktime(s) # 把固定的时间戳传进去,实现反转得出结果(如果传进去的数值是未知数用到) print(k)
.....10秒后 149999999.0 # 10秒后运行结果
6、time.asctime()把表示时间的格式转换为国外模式(周-月-日-时-分-秒-年)
f = time.asctime() print(f)
Sun Apr 14 16:43:12 2019
7、time.ctime() 按照国外计时法转换时间(和刚刚的 time.mktime()一个用法)
8、time.strftime("%Y-%m-%d %H:%M:%S")
把时间格式转换成自己设定格式,与上面对应格式 :(年-月-日 时:分:秒)
注意占位字母的大小写区分,(月、日)的字母要小写,其他全大写,这些好像与字母占的字节有关
9、time.strptime() 把转好格式的时间,参照转换格式再转回原型
e = time.strftime("%Y-%m-%d %H:%M:%S") # 有一个转换好格式的时间,怎么让他好计算,需要转成时间戳(就是按秒计算的数字) r = time.strptime(e, "%Y-%m-%d %H:%M:%S") # 把转好格式的时间,参照转换格式再转回原型,便于转时间戳 q = time.mktime(r) # 把转回原型的时间传给 mktime 做参数即可得出时间戳 print(q)
1555234713.0
如果记不住,下图以解释此原理
红的为字符串转为时间戳,蓝的为时间戳转为字符串(时间格式)
十、datetime模块详解
和 time 模块相比,datetime 模块接口更直观,更容易调用
1、datetime.date:表示日期的类,常用于属性有 year,month,day;
2、datetime.time:表示时间的类,常用的属性有 hour,minute,second,microsecond;
3、datetime.datetime: 表示日期时间;
4、datetime.timedelta:表示时间间隔,既两个时段之间的时差
5、datetime.tzinfo:与时区有关的相关信息,
需要记住方法仅需以下几个:
写代码之前需先导入 datetime()模块
import datetime d = datetime.datetime.now() # 返回当前的日期类型默认(年-月-日 时:分:秒) f = time.time() # 获取时间戳 d2 = datetime.date.fromtimestamp(f) # 能快速的通过时间戳拿到日期 d3 = d2.timetuple() # 快速转回原始日期对象(只显示日期,不会有时间显示)
这个模块可以进行时间的加减运算、日期的替换
# 用 datetime 进行时间运算(短时间运算) g = datetime.timedelta(1) # 回到 1天前的现在时间 # 减法运算 g2 = datetime.datetime.now()-g # 直接拿当前时间减去1天的时间 # 也可指定关键参数这样写(days=天数) g3 = datetime.datetime.now() - datetime.timedelta(days=2) # 返回前两天的同一时间 # 按小时写(hours=小时) g4 = datetime.datetime.now() - datetime.timedelta(hours=12) # 返回12小时前的时间 # 还可进行加法运算 g5 = datetime.datetime.now() + datetime.timedelta(hours=6) # 返回6小时后的时间 # 按分钟运算(minutes=分钟) g6 = datetime.datetime.now() + datetime.timedelta(minutes=30) # 返回30分钟后的时间 # 按照秒运算(seconds=秒) g7 = datetime.datetime.now() + datetime.timedelta(seconds=120) # 返回120秒之后的时间 # 日期替换(指定关键参数)注意格式的写法,在 mow()后面 gf = datetime.datetime.now().replace(year=1999, month=3, day=28)
A、random(随机模块)和 string (生成随机验证码的数据源) 模块详解
random 随机模块的作用主要应用于抽奖、随机验证码、随机打乱顺序等作用
string 数据源模块,主要为随机模块提供验证码的数据源
首先导入这2个模块便于后面调用
1、random 的用法
import random h = random.randrange(10) # 返回10以内的随机数字(不包括10) h1 = random.randint(1, 10) # 返回包括10在内的随机数字(包括10但语法略微不同需要2个数值确定区域) h2 = random.random() # 返回1以内的随机浮点数(小数) h3 = random.choice("asdfgwerw*&@^%!") # 返回参数内字符串的随机字符 (做随机验证码有可能会用到) h4 = random.sample("asdfwerw*&%!", 4) # 列表形式返回参数内字符串的多个随机值(要返回几个值,需要自己在最后面设置数字)
2、string 的用法
import string i = string.digits # 显示所有数字 i2 = string.ascii_letters # 显示所有大小写字母 i3 = string.hexdigits # 显示 16 进制数 i4 = string.octdigits # 显示 8 进制数 i5 = string.ascii_lowercase # 只显示小写字母 i6 = string.punctuation # 显示所有的特殊字符 i7 = i5 + i # 把小写字母和数字拼在一起,就组成了验证码的所有字符
3、random 和 string 的组合用法
# 生成随机验证码的方法 h5 = random.sample(i7, 4) # 随机格式,设置好参数的数据源和返回值位数 h6 = "".join(h5) # 处理掉返回值多余的格式 # 洗牌(就是打乱顺序) h7 = [i for i in range(20)] # 创建列表(数字有序) random.shuffle(h7) # 随机打乱列表内数字,这些可以用作抽奖使用