壹拾柒

Python常用模块

一、包

1.1 什么是包

? 包是一种形式,本质就是一个含有.py文件的文件夹。

1.2 为什么使用包

? 模块的第一个版本只有10个功能,但是未来在扩展版本的时候,模块名和用法应该最好不要去修改,但是这只是对使用者友好,而由于版本扩展,文件越来越大,模块设计者对模块的管理、维护会越来越复杂,因此我们可以使用包来扩展模块的功能。

1.3 如何使用包

1.3.1 模块和包

? 导入模块发生的三件事:

  1. 创建一个包的名称空间
  2. 执行py文件,将执行过程中产生的名字存放于名称空间中。
  3. 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的

导入包发生的三件事:

  1. 创建一个包的名称空间
  2. 由于包是一个文件夹,无法执行包,因此执行包下的.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于.py)
  3. 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的

? 导入包就是在导入包下的.py,并且可以使用以下两种方式导入:

  1. import ...
  2. from ... import...

1.3.2 扩展模块功能

? 我们如果要扩展aaa.py模块,需要建立一个aaa的目录文件,并且删除aaa.py文件,将aaa.py修改成m1.py和m2.py两个文件,让模块的功能使用方法不改变。

1.3.3 修改 _init_.py文件

# aaa/.py

func1 = 111
func2 = 222
func3 = 333
func4 = 444
func5 = 555
func6 = 66

? 由于在__init__.py中定义了func1,因此我们可以在run.py文件中导入func1,但是这个func1并不是我们想要的func1,因此需要修改__init__.py文件,又由于执行文件run.py的环境变量不为aaa,因此直接使用import导入m1会报错,因此使用from导入。

# aaa/.py

from aaa.m1 import func1
from aaa.m2 import func2
# run.py

import aaa

print(aaa.func1())
print(aaa.func2())

1.3.4 导入内包

? aaa.bbb指向aaa内部的文件夹bbb包,如果我们需要导入bbb这个包。

# bbb/.py

from aaa import bbb
# run.py

import aaa

print(aaa.bbb)

1.3.5 导入内包模块

# bbb/.py

from aaa.bbb import m3
# run.py

import aaa

aaa.bbb.m3

1.4 注意事项

  1. 包内所有的文件都是被导入使用的,而不是被直接运行的
  2. 包内部模块之间的导入可以使用绝对导入(以包的根目录为基准)与相对导入(以当前被导入的模块所在的目录为基准),推荐使用相对导入
  3. 当文件是执行文件时,无法在该文件内用相对导入的语法,只有在文件时被当作模块导入时,该文件内才能使用相对导入的语法
  4. 凡是在导入时带点的,点的左边都必须是一个包,import aaa.bbb.m3.f3错误

二、常用模块

2.1 time模块

? time模块:支持三种不同形式的时间,不同形式的时间之间可以转换.

  1. 时间戳:从1970年1月1日00:00:00开始到现在的按秒计算的偏量
import time
print(time.time())

1565951647.1459594
  1. 格式化时间:将时间表示成字符串格式
import time
print(time.strftime('%Y-%m-%d %X'))

2019-08-16 18:38:09
  1. 结构化时间:struct_time元组共有九个元素,分别问年月日时分秒周天夏令时。
import time
print(time.localtime())
print(time.gmtime())

time.struct_time(tm_year=2019, tm_mon=8, tm_mday=16, tm_hour=18, tm_min=46, tm_sec=37, tm_wday=4, tm_yday=228, tm_isdst=0)
time.struct_time(tm_year=2019, tm_mon=8, tm_mday=16, tm_hour=10, tm_min=46, tm_sec=37, tm_wday=4, tm_yday=228, tm_isdst=0)
  1. 三种时间格式的转换
import time
print(time.strftime('%Y-%m-%d %X', time.localtime()))# 结构化时间转格式化时间
print(time.strptime('2019-08-16 10:30:44', '%Y-%m-%d %X'))# 格式化时间转结构化时间

print(time.mktime(time.localtime()))# 结构化时间转时间戳
print(time.localtime(time.time()))# 时间戳转结构化时间
  1. time.sleep(n)

2.2 datatime模块

? datetime模块可以看成是时间加减的模块。

  1. 当前时间
import datetime
print(datetime.datetime.now())

2019-08-16 18:58:58.357782
  1. 增加减少时间(天)
import datetime
print(datetime.datetime.now()+datetime.timedelta(2))

2019-08-18 19:03:59.046982
  1. 增加减少时间(时、分)
import datetime
print(datetime.datetime.now()+datetime.timedelta(hours=12))

2019-08-17 07:06:07.106167
  1. 时间代替
import datetime
print(datetime.datetime.now().replace(hour = 10,second = 5,year = 1))

0001-08-16 10:11:05.001715

2.3 os模块

? os模块负责程序与操作系统的交互,提供了访问操作系统的接口,多用于文件处理。

import os

print(os.getcwd()) # 获取当前文件目录

os.mkdir('m2') # 创建一个文件夹
os.rmdir('m2')  # 删除文件夹

# # *************(经常用到)
res = os.listdir(r'D:\...)  # 列出所有文件
print(res)

 __file__只有pychamr才提供,python本身不支持
print('os.path.abspath(__file__):',os.path.abspath(__file__))  # 支持不同的平台(windows,ios,andirod,linux,unix)

 print('__file__:',__file__)

print(os.path.exists('01 包.py'))  # 文件不存在False,存在True

print(os.path.isfile('01 包.py')) # 是否为文件
print(os.path.isdir('01 包.py')) # 是否为文件夹

# # ********(经常使用)
# # 支持不同的平台(windows,ios,andirod,linux,unix)
res = os.path.join(r'D:\...') # 拼接文件路径
res = os.path.join(r'D:\...') # 拼接文件路径
print(r'D:\上海Python11期视频\python11期视频\day 17\m1\bb'+'\m5.py')
print(res)

# # ******* (经常使用)
print(os.path.abspath(__file__))
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

2.4 sys模块

? sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

import  sys
print(sys.argv)  # 接收参数(用cmd执行文件时运行才有效)
print(sys.modules) #返回系统导入的模块字段,key是模块名,value是模块

2.5 json和pickle模块

? jason和pickle都是序列化的方式,序列化就是把对象从内存中取出变成可储存或者传输的过程。

? 序列化的优点:

  1. 持久保存状态:内存是无法永久保存数据的,当程序运行了一段时间,我们断电或者重启程序,内存中关于这个程序的之前一段时间的数据(有结构)都被清空了。但是在断电或重启程序之前将程序当前内存中所有的数据都保存下来(保存到文件中),以便于下次程序执行能够从文件中载入之前的数据,然后继续执行,这就是序列化。
  2. 跨平台数据交互:序列化时不仅可以把序列化后的内容写入磁盘,还可以通过网络传输到别的机器上,如果收发的双方约定好实用一种序列化的格式,那么便打破了平台/语言差异化带来的限制,实现了跨平台数据交互。

? Json序列化并不是python独有的,json序列化在java等语言中也会涉及到,因此使用json序列化能够达到跨平台传输数据的目的。

import json
dic = {'a': 1, 'b': 'abc', 'c': None}
data = json.dumps(dic)  # 序列化到内存中
print(data,type(data))  # 单引号全部变成双引号
data = json.loads(data)  # 从内存中获取json串
print(data,type(data))

{"a": 1, "b": "abc", "c": null} <class 'str'>
{'a': 1, 'b': 'abc', 'c': None} <class 'dict'>

? Pickle序列化和所有其他编程语言特有的序列化问题一样,它只能用于Python,并且可能不同版本的Python彼此都不兼容,因此,只能用Pickle保存那些不重要的数据,即不能成功地反序列化也没关系。但是pickle的好处是可以存储Python中的所有的数据类型,包括对象,而json不可以。

2.6 hashlib和hmac模块

? hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。

hash值的特点:

  1. 只要传入的内容一样,得到的hash值一样,可用于非明文密码传输时密码校验。
  2. 不能由hash值返解成内容,即可以保证非明文密码的安全性。
  3. 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的,可以用于对文本的哈希处理。

    hashlib能将数字变成固定的字符串, 相同的字符串哈希后结果一样并且具有 叠加性。

    import hashlib
    
    m = hashlib.md5()  # 固定的写法
    m.update(b'123456')
    print(m.hexdigest())
    
    e10adc3949ba59abbe56e057f20f883e

    hmac模块:对密码加密,可以加盐,相当于给密码加了密钥。

    import hmac
    
    m = hmac.new(b'abc')  # 加盐
    m.update(b'123456')
    print(m.hexdigest())
    
    8c7498982f41b93eb0ce8216b48ba21d

2.7 logging模块

原文地址:https://www.cnblogs.com/tangceng/p/11366072.html

时间: 2024-08-12 12:28:27

壹拾柒的相关文章

【壹拾壹周】final分数分配

组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:12.3 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成荣 李峤 杨柳 李峤 谢孝淼 谢孝淼 谢孝淼 李峤 谢孝淼 杨柳 杨柳 杨柳 谢孝淼 宫成荣 李峤 李峤 评分规则参见B-1分数规则,与B-1规则相同,http://www.cnblogs.com/Boxer1994/p/6039442.html. 每名同学占比:武志远:0.26,杨柳:0.20,宫成

【壹拾壹周】评价

礼物挑选小工具: 优点:ui比之前好一些,好像礼物比之前更多了. 缺点:系统是根据用户选择的信息进行推荐的,而这个选择信息太少了,还需进一步细化,比如大家的女朋友都在18-22岁之间,价格区间都是几百块钱,那么如果很多人使用,礼物推荐重复的几率太大了. 食物链教学: 优点:比之前改进了一些微小的地方,比如控制面板默认不出现在屏幕中间,而是右边,这样就不会影响之后相关的操作了. 缺点:新增添的生物是不能进行自动连线的,当然这不是问题,设计就是这样的.但是除了这一点,原生生物跟后加入生物还有个不同,

【壹拾壹周】final_review

项目名:俄罗斯方块 组名:新蜂 组长:武志远 组员:宫成荣 杨柳 谢孝淼 李桥 final Review会议 时间:2016.12.3 会议内容 设想和目标 1.在final阶段发布时的预期目标是什么,期望实现那些功能,具体的实施程度如何? 预期目标:给用户一个surprise,让用户感到excited.final发布与之前的beta相比增加了很多功能,增加了三个功能键,分别是方块瞬间下落,瞄准系统,作弊系统.完善了等级系统. 这些功能大部分被良好的实现了,除了数据库排名系统,本来计划是搞一个全

壹拾贰

函数基础 一.可变长函数 ? 可变长参数:函数在调用时,传入的参数个数不固定 ? 调用函数时,传值有两种方式,一种是位置实参,另一种是关键字实参,因此形参接受传值也需要有两种方法,接收溢出传值的两种方式为位置实参(*)和关键字实参(**). 1.1 可变长形参(*) ? 形参中的 * 会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给 * 后的参数.需要注意的是:* 后的参数名约定俗成为args. def sum_self(*args): res = 0 for num in ar

壹拾伍

函数进阶 一.递归 ? 函数的递归调用,是一种特殊的嵌套调用,但是在调用一个函数的过程中,直接或者间接的调用了他自身. ? 递归的核心: 递进的时候能够达到一个结果,问题规模越来越小(不一定要真正的达到). ? 递归函数不断地调用自身,就会很肯能会进入无限调用的死循环.同样是死循环,while循环就会进行下去,而递归调用就会在解释器设定的最大范围停止并报错"超出范围".这是因为while循环的每次循环都只存在一个内存空间,而递归则是每一次都开辟一个新的空间,旧的空间不消失,这样就会占用

壹拾陆

模块基础 一.模块的四种形式 1.1 什么是模块 ? 模块是一系列功能的集合体,因为函数是某一功能的集合体,所以模块可以看作是一系列函数的集合体. ? 一个文件内部有很多的函数,因此一个文件就可以看成是一个模块. ? 一个python文件的名称为XXX.py,那么模块的名称就是XXX. 1.2 模块的四种形式 自定义模块:自己用python写一个有一定功能的文件,就可以称为一个自定义模块. 第三方模块:已经有别人写好的一定功能的模块,使用需要自己安装,目前已有13w+的第三方模块了. 内置模块:

肆拾柒 --- 模型层

django模型层 一.单表查询 ? 创建一个图书列表: class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digital=8,,decimal_places=2) publish_dta = models.DateField() ? 增: models.Bool.objects.create(title = '活着',price = 50,publi

土办法解决日期转换问题,转出格式为。。。 贰零壹陆年零壹月零捌日

/** * 参数名称:@param dateStr 待转换的日期(String格式,结构为yyyy-MM-dd) * 返回值:String 小写汉字的日期 * 方法描述:土办法解决日期转换问题,转出格式为... 贰零壹陆年零壹月零捌日 * @author:zhouzhiwei * 创建时间:2014-5-23 下午05:59:20 */ public static String stringToChineseSmallRMB(String dateStr) { // 传参数的格式为 2011-1

大写中文数字-財务

壹.贰.叁.肆.伍.陆.柒.捌.玖.拾.佰.仟.万.亿.元(圆).角.分.零.整.这是大家常常要填写的大写数字,问什么要用大写数字呢?想必非常多人都不是非常清楚! 先看看下面两个有关大写数字的表格: 1.数码与大.小写数字的对比表: 数码 小写数字 大写数字 0 ○ 零 1 一 壹 2 二 贰 3 三 叁/參 4 四 肆 5 五 伍 6 六 陆 7 七 柒 8 八 捌 9 九 玖 2.进位数码与大.小写数字的对比表 数码 小写数字 大写数字 10 十 拾 20 二十 廿 30 三十 卅 100