欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

day15 模块

程序员文章站 2022-06-15 15:07:38
...

day15 模块

今日内容概要

  1. 自定义模块
  2. time模块
  3. datetime模块
  4. random模块
  5. sys模块
  6. os模块

昨日回顾

  1. 有参装饰器:

    给装饰器额外增加一个参数来控制装饰器的行为:

    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()
    
  2. 多个装饰器装饰一个函数:

    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()
    
  3. 递归

    1. 不断调用自己本身
    2. 有明确的结束条件

    递归最大深度:官方宣称1000,实测994

    修改递归最大深度:

    import sys
    sys.setrecuisionlimit(10000)
    

今日内容详细

自定义模块

模块的定义:模块就是一个py文件。

模块主要分为三类:

  1. 内置模块,也称Python标准库,是Python官方已经封装在Python解释器中了,大约有200多个;
  2. 第三方模块,是一些组织或个人写好的py文件,供我们使用;
  3. 自定义模块,也就是我们自己写的py文件。

为什么要学习模块:

  1. 开发效率高
  2. 拿来主义:同内置函数一样,我们只需要把模块拿来用就好,不必深究它的原理
  3. 减少重复代码:分文件管理,有助于修改和维护。

怎么使用模块:

import 导入 将模块中所有内容导入
import lib
lib.a # import使用功能需要.操作

from 模块名 import 功能
from 同一个模块 import a,b,c
from lib import a as aa

导入时发生的事情

  1. 将模块存储到当前名称空间中
  2. 以模块的名字命名,并开辟空间
  3. 通过模块名来使用模块中的功能

同一个模块即便写多次导入, 也只执行一次

导入顺序:
内存 —> 内置 —> sys.path列表

模块的两种用法:

  1. 当做普通模块执行
  2. 被当做脚本执行
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)) # 秒 进行睡眠

时间分类:

  1. 时间戳 — 用于进行计算
  2. 结构化时间 — 给程序员查看使用(命名元组)
  3. 字符串时间 — 给用户查看的

时间模块的基本方法有:

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_26\day14'))    # 对路径进行分割位目录和文件名,返回值为元组
print(os.path.dirname('C:\Python_26\day14'))    # 获取父级目录    非常重要
print(os.path.basename('C:\Python_26\day14'))    # 返回path最后的文件名

# is系列
print(os.path.exists('C:\Python_26\day14'))    # 判断路径是否存在
print(os.path.isabs('day07'))    # 判断是否是绝对路径,如果是则返回True
print(os.path.isfile('C:\Python_26\day15\lib.py'))    # 判断是否是一个存在的文件,如果是则返回True    非常重要
print(os.path.isdir('C:\Python_26\day15')    # 判断是否是一个存在的目录,如果是则返回True    非常重要
print(os.path.join("C:\\User",'Python_26',"day15","lib.py"))    # 将多个路径组合后返回    非常重要
print(os.path.getsize('C:\Python_26\day15\lib.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()    # 设置递归深度
相关标签: Python 全栈开发