day15 模块
今日内容概要
- 自定义模块
- time模块
- datetime模块
- random模块
- sys模块
- os模块
昨日回顾
-
有参装饰器:
给装饰器额外增加一个参数来控制装饰器的行为:
def auth(arg): def wrapper(func): def inner(*args, **kwargs): if arg: print(111) ret = func(*args, **kwargs) print(222) else: func(*args, **kwargs) return ret return inner return wrapper @auth(True) def index(): print('is index') index()
-
多个装饰器装饰一个函数:
def wrapper2(func): def inner(*args, **kwargs): print(111) func(*args, **kwargs) print(222) return inner def wrapper1(func): def inner(*args, **kwargs): print(333) func(*args, **kwargs) print(444) return inner @wrapper1 @wrapper2 def func(): print('is func') func()
-
递归
- 不断调用自己本身
- 有明确的结束条件
递归最大深度:官方宣称1000,实测994
修改递归最大深度:
import sys sys.setrecuisionlimit(10000)
今日内容详细
自定义模块
模块的定义:模块就是一个py文件。
模块主要分为三类:
- 内置模块,也称Python标准库,是Python官方已经封装在Python解释器中了,大约有200多个;
- 第三方模块,是一些组织或个人写好的py文件,供我们使用;
- 自定义模块,也就是我们自己写的py文件。
为什么要学习模块:
- 开发效率高
- 拿来主义:同内置函数一样,我们只需要把模块拿来用就好,不必深究它的原理
- 减少重复代码:分文件管理,有助于修改和维护。
怎么使用模块:
import 导入 将模块中所有内容导入
import lib
lib.a # import使用功能需要.操作
from 模块名 import 功能
from 同一个模块 import a,b,c
from lib import a as aa
导入时发生的事情
- 将模块存储到当前名称空间中
- 以模块的名字命名,并开辟空间
- 通过模块名来使用模块中的功能
同一个模块即便写多次导入, 也只执行一次
导入顺序:
内存 ---> 内置 ---> sys.path列表
模块的两种用法:
- 当做普通模块执行
- 被当做脚本执行
if __name__ == "__main__":
pass
在当前文件中执行__name__
获取的值是'__main__'
当前文件被当做模块导入时,__name__
获取的是当前文件名
以后要避免(不能这么写)的问题:
- 循环导入(了解)
import 和 from 的对比:
-
import 全部导入
-
from 指定功能导入
-
import和from都可以支持as
-
from会将之前定义同名的覆盖
-
from 可以一行导入多个功能
-
from lib import * 将lib下所有的功能全部导入
-
import 建议一行导入一个模块
-
推荐是使用from
模块导入的顺序:
- 内存,内置,sys.path、
sys.path # *****
sys.path.append() # 添加一个模块查找路径
__all__=['name','read1'] # 控制form import *
time
模块
time模块,也就是时间模块,用来进行一些与时间有关的操作。其使用方法为:
import time
print(time.time()) # 时间戳 浮点数
print(time.sleep(2)) # 秒 进行睡眠
时间分类:
- 时间戳 --- 用于进行计算
- 结构化时间 --- 给程序员查看使用(命名元组)
- 字符串时间 --- 给用户查看的
时间模块的基本方法有:
t = time.time() # 用于获取当前时间戳
print(time.localtime(t)) # 将时间戳转成结构化时间
t = time.localtime() # 将时间戳转成结构化时间,不写默认是当前时间戳
print(time.mktime(t)) # 将结构化时间转成时间戳
t = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",t)) # 将结构化时间转换成字符串时间
str_time = "2019-9-1 12:23:06"
print(time.strptime(str_time,"%Y-%m-%d %H:%M:%S")) # 将字符串时间转换成结构化时间
print(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())) # 将结构化时间转化为字符串时间
str_time = "2019-9-1 12:23:06"
print(time.mktime(time.strptime(str_time,"%Y-%m-%d %H:%M:%S")))
print(time.localtime()[0])
print(time.localtime().tm_year)
print(time.localtime().tm_yday)
输出的结果为:
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=26, tm_hour=19, tm_min=19, tm_sec=21, tm_wday=3, tm_yday=269, tm_isdst=0)
1569496761.0
2019-09-26 19:19:21
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=1, tm_hour=12, tm_min=23, tm_sec=6, tm_wday=6, tm_yday=244, tm_isdst=-1)
2019-09-26 19:19:21
1567311786.0
2019
2019
269
datetime
模块
datetime模块的作用和time模块类似,都是用来进行时间操作的,其基本操作为:
from datetime import datetime
print(datetime.now()) # 获取到当前是时间,对象
print(type(datetime.now()))
print(datetime(2016,11,13,12,13,14)) # 将指定时间转化为datetime对象
import time
print(datetime.fromtimestamp(time.time())) # 时间戳转换成对象
print(datetime.timestamp(datetime.now())) # 将对象转换成时间戳
print(datetime.strftime(datetime.now(),"%Y-%m-%d %H:%M:%S")) # 将对象转换成字符串
print(datetime.strptime("2019/10/14","%Y/%m/%d")) # 将字符串转换成对象
print(datetime.now() - datetime(9999,11,1,12,13,14)) # 用来计算当前时间相对于指定时间相差多久
from datetime import datetime,timedelta
print(datetime.now())
print(datetime.now() - timedelta(days=400)) # 用来计算400天前时间的datetime对象
print(datetime.now() - timedelta(days=500))
输出的结果为:
2019-09-26 19:32:59.456316
<class 'datetime.datetime'>
2016-11-13 12:13:14
2019-09-26 19:32:59.457314
1569497579.457313
2019-09-26 19:32:59
2019-10-14 00:00:00
-2914671 days, 7:19:45.490226
2019-09-26 19:32:59.490226
2018-08-22 19:32:59.490226
2018-05-14 19:32:59.490226
random
模块
random模块,也就是随机数模块,用来生成一定范围内的随机数。随机数模块可以这样使用:
import random
print(random.random()) # 用来生成0~1之间的小数
print(random.randint(1, 5)) # 随机生成1~5之间(包括1和5)的整数
print(random.randrange(0, 10, 2)) # 随机产生range切片范围内的整数,参数的使用方法与range相同
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(random.choice(lst)) # 从可迭代对象中随机选出一个元素
print(random.choices(lst, k=5)) # 从可迭代对象中选择指定个数的元素,可能会重复选取
print(random.sample(lst, k=5)) # 从可迭代对象中选取指定个数的元素,不会重复选取
random.shuffle(lst) # 将列表顺序打乱
print(lst)
输出的结果为:
0.30540264424342467
2
6
4
[3, 1, 9, 3, 8]
[8, 5, 9, 6, 3]
[3, 5, 1, 8, 4, 6, 9, 7, 2]
os
模块
os模块主要用来进行与操作系统进行交互,它的导入方式为:
import os
os模块主要涉及文件操作、文件夹操作、路径操作和其他操作四个方面。
文件操作
通过os模块对文件直接进行的操作:
os.rename('旧名字', '新名字') # 重命名 非常重要
os.remove('要删除的文件名') # 删除文件 非常重要
文件夹操作
对文件夹进行操作:
os.makedirs('a/b/c/d/e/f') # 递归创建文件夹 非常重要
os.removedirs('a/b/c/d/e/f') # 递归删除文件夹,若文件夹非空,会报错 非常重要
os.mkdir('a') # 创建文件夹 非常重要
os.rmdir('a') # 删除文件夹 非常重要
print(os.listdir('.')) # 查看指定路径下的所有文件 非常重要
路径操作
对路径的操作主要使用os.path下的各种方法:
print(os.getcwd()) # 获取当前工作路径 非常重要
os.chdir('..day14') # 改变当前脚本工作目录,相当于终端下的cd
print(os.path.abspath('lib.py')) # 获取文件的绝对路径
print(os.path.split('C:Python_26day14')) # 对路径进行分割位目录和文件名,返回值为元组
print(os.path.dirname('C:Python_26day14')) # 获取父级目录 非常重要
print(os.path.basename('C:Python_26day14')) # 返回path最后的文件名
# is系列
print(os.path.exists('C:Python_26day14')) # 判断路径是否存在
print(os.path.isabs('day07')) # 判断是否是绝对路径,如果是则返回True
print(os.path.isfile('C:Python_26day15lib.py')) # 判断是否是一个存在的文件,如果是则返回True 非常重要
print(os.path.isdir('C:Python_26day15') # 判断是否是一个存在的目录,如果是则返回True 非常重要
print(os.path.join("C:\User",'Python_26',"day15","lib.py")) # 将多个路径组合后返回 非常重要
print(os.path.getsize('C:Python_26day15lib.py')) # 获取文件大小
其他操作
os方法的其他操作:
print(os.open('dir').read()) # 给终端发送指令
print(os.environ) # 获取环境变量
总结
os模块功能很多很杂,不可能全都记住,但是下面的这些功能我们日后会经常用到,一定要尽量学会使用:
os.getcwd()
os.mkdir()
os.rmdir()
os.makedirs()
os.removedirs()
os.rename()
os.remove()
os.path.abspath()
os.path.dirname()
os.path.basename()
os.path.join()
os.path.isfile()
os.path.isdir()
os.path.getsize()
sys
模块
sys模块用来和Python解释器进行交互,我们只需要记住sys.path功能即可:
import sys
print(sys.path)
除此之外,sys模块还有几个有意思的功能可以稍作了解:
import sys
if sys.platform == 'win32': # sys.platform方法用来查看操作系统平台
print('Windows')
elif sys.platform == 'darwin':
print('Mac')
lst = sys.argv # 在终端中模拟input输入,避免input函数阻塞
print(lst[-1])
print(sys.version) # 用来查看Python的版本
sys.exit(1) # 修改Python结束后的报告代码
print(sys.modules) # 获取所有的模块
sys.setrecuisionlimit() # 设置递归深度