阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Python 常用模块

109次阅读
没有评论

共计 6701 个字符,预计需要花费 17 分钟才能阅读完成。

一、time 模块

  • 名词
    UTC(世界协调时间):格林尼治时间,世界标准时间,在中国为 UTC+8

    DST(夏令时):是一种为了节约能源而人为规定地方时间的制度,一般在天亮早的夏季将时间提前一小时

  • 时间的表示形式

    • 时间戳
      以整型或浮点型表示的是一个以秒为单位的时间间隔,这个时间的基础值是 1970 年 1 月 1 号零时开始算

    • 元组
      一种 python 的数据结构表示方式,这个元组有 9 个整数元素,分别表示不同的时间含义
      year 年
      month(1-12) 月
      day(1-31) 日
      hours(0-23) 时
      minutes(0-59) 分
      seconds(0-59) 秒
      weekday(0-6,0 表示星期一) 周
      Julian day(1-366):表示当前日期在本年度是第几天
      DST flag(-1 or 0 or 1):夏令时格式,0 表示正常格式,1 表示夏令时格式,- 1 表示根据当前的时间格式来判定

    • 格式化字符串

      格式化字符 含义
      %a 本地简化星期名称
      %A 本地完整星期名称
      %b 本地简化月份名称
      %B 本地完整月份名称
      %c 本地相应的日期和时间表示
      %d 一个月中的第几天(01-31)
      %H 一天中的第几个小时(24 时制,00-23)
      %I 一天中的第几个小时(12 时制,01-12
      %j 一年中的第几天(001-366)
      %m 月份(01-12)
      %M 分钟数(00-59)
      %p 本地 am 或者 pm 的响应符号
      %S 秒(00-59)
      %U 一年中的星期数,以星期日为一个星期
      %w 一个星期中的第几天(0-6,0 表示星期日)
      %W 和 %U 基本相同,以星期一为一个星期
      %x 本地相应的日期
      %X 本地相应的时间
      %y 去掉世纪的年份(00-99)
      %Y 完整的年份
      %Z 时区的名字,如果不存在为空字符串
  • 导入

    import time
  • 方法

    • time()

      返回当前时间的时间戳,无需参数,返回值为浮点型

      t1 = time.time() print(t1)
    • gmtime([t])

      将给定的时间戳转为 UTC 时间元组,如果没有参数默认转换当前时间戳

      t2 = time.gmtime() print(t2)
    • localtime([t])

      将给定的时间戳转为本地时间元组格式,如果没有参数默认转换当前时间戳

      t3 = time.localtime() print(t3)
    • mktime(tt)

      将本地时间元组转为时间戳

      t4 = time.mktime(t3) print(t4)
    • asctime([tt])

      将时间元组格式转为指定格式的字符串形式,如果没有参数默认使用 localtime 时间的时间元组

      t5 = time.asctime(t3) print(t5, type(t5))
    • ctime([tt])

      将时间戳格式转为指定格式的字符串形式,如果没有参数默认使用当前时间戳

      t6 = time.ctime() print(t6)
    • strftime(format[, tt])

      将时间元组以指定的格式转为字符串,如果没有 tt 参数默认使用当前本地时间元组

      t7 = time.strftime("%Y-%m-%d %H:%M:%S", t3) print(t7)
    • strptime(st, format)

      将指定格式的字符串解析为时间元组,是 strftime 的逆过程

      注意:format 表示的格式要与 st 一致

      t8 = time.strptime("2001-10-01 08:08:08", "%Y-%m-%d %H:%M:%S") print(t8)
    • sleep()

      延迟一个时间段,接收整型或者浮点型

      time.sleep(2)
    • clock()

      返回当前程序执行时间,Unix 系统始终返回全部运行时间,而 Windows 系统从第二次开始都是以第一次调用此函数的时间戳为基准,而不是以程序开始的时间为基准

      # windows Unix print(time.clock()) # 0 1 time.sleep(1) print(time.clock()) # 1 2 time.sleep(1) print(time.clock()) # 2 3

二、datetime 模块

  • 概述

datetime 比 time 高级,可以理解为 datetime 基于 time 进行了封装,提供了更简单的函数接口,datetime 模块的接口更直观、更容易调用

  • 模块中的类

    • time 只关注时间
    • date 只关注日期
    • datetime 同时关注日期和时间
    • timedelta 主要用于计算时间跨度
    • tzinfo 时区相关
  • 导入

    import datetime
  • 方法

    • 获取当前时间

      t1 = datetime.datetime.now() print(t1, type(t1))
    • 获取指定日期时间

      t2 = datetime.datetime(2001, 10, 1, 8, 8, 8) print(t2)
    • 将 datetime 时间转对象为字符串

      t3 = t1.strftime("%X %x") print(t3, type(t3))
    • 将字符串转为 datetime 对象

      t4 = datetime.datetime.strptime(t3, "%X %x") print(t4, type(t4))
    • 时间相减,返回一个时间间隔

      t5 = datetime.datetime(2001, 10, 1, 8, 8, 8) t6 = datetime.datetime(2001, 10, 2, 9, 8, 9) t7 = t6- t5 print(t7, type(t7)) # 获取时间间隔天数 print(t7.days) # 获取去除间隔天数以外的间隔秒数 print(t7.seconds)

三、calendar 模块

  • 概述

    日历模块

  • 导入

    import calendar
  • 方法

    • 返回指定年的某月

      print(calendar.month(2019, 2))
    • 返回指定年的日历

    print(calendar.calendar(2018))
    • 判断是否是闰年

      print(calendar.isleap(2000))
    • 返回某个月的 weekday 的第一天和这个月的所有天数

      print(calendar.monthrange(2019, 4))
    • 返回某一个月以一周为周期的元素序列

      print(calendar.monthcalendar(2019, 2))

四、uuid 模块

  • 概述

    是 128 位的全局唯一标识符,通常由 32 字节的字母串表示,它可以保证时间和空间的唯一性,也称为 GUID

  • 作用

    随机生成字符串,在 token、账号、订单号等需要唯一标识的地方使用

  • 原理

    通过 Mac 地址、时间戳、命名空间、随机数、伪随机数来保证产生的 id 的唯一性

  • 算法:

    • uuid1()基于时间戳
      有 MAC 地址、当前时间戳、随机数字,可以保证全球范围内的唯一性。但是由于 MAC 地址的使用会带来安全问题,局域网中可以使用 IP 来代替 MAC

    • uuid2()基于分布式计算环境 DCE
      算法和 uuid1()相同,不同的是把时间戳的前 4 位换成 POSI 的 UID,实际当中很少使用

      注意:python 中没有这个函数

    • uuid3()基于名字和 MD5 散列值
      通过计算名和命名空间的 MD5 散列值得到,保证了同一命名空间中不同名字的唯一性,和不同命名空间的唯一性,但是同一命名空间的相同名字生成相同的 uuid

    • uuid4()基于随机数
      由伪随机数得到的,有一定的重复概率,这个重复概率是可以通过计算得到的

    • uuid5()基于名字和 SHA1 散列值
      算法和 uuid3()相同,不同的是使用 SHA1 算法

  • 使用经验:

    • python 中没有基于 DCE 的,所以 uuid2()可以忽略
    • uuid4()存储概率性重复,由于无映射性所以最好不用
    • 如果在全局的分布式环境下,最好使用 uuid1()
    • 若名字的唯一性要求,最好使用 uuid3()或者 uuid5()
  • 导入

    import uuid
    
  • 使用

    a = uuid.uuid1() print(a, type(a)) b = str(a) print(b, type(b)) # print(uuid.uuid2()) print(uuid.uuid3(uuid.NAMESPACE_DNS, "zutuanxue_com")) print(uuid.uuid3(uuid.NAMESPACE_DNS, "zutuanxue_com")) print(uuid.uuid3(uuid.NAMESPACE_OID, "zutuanxue_com")) print(uuid.uuid3(uuid.NAMESPACE_DNS, "zutuanxue_com")) print(uuid.uuid5(uuid.NAMESPACE_DNS, "zutuanxue_com"))

五、collections 模块

  • 概述

    python 中内建的一个集合模块,提供了许多有用的集合类

  • namedtuple

    • 概述

      命名元组,本质是一个函数,用他来创建一个自定义的 tuple 类型

      规定 tuple 元素的格式,并可以用属性而不是索引引用 tuple 中的元素

      用 namedtuple 实际上是创建一个新的数据类型

    • 导入

      from collections import namedtuple
      
    • 使用

      # 假设这是一个点的坐标,但是没有写注释,时间久了就忘了该有含义 p = (1, 2) # 定义一个新的数据类型, Point = namedtuple("point", ["x", "y"]) # 定义一个 Point 类型的变量,保存一个元组数据 p2 = Point(1, 2) print(p2, isinstance(p2, Point), isinstance(p2, tuple)) # 访问命名元组元素的值 print(p2[0], p2[1]) print(p2.x, p2.y)
  • deque

    • 概述

      使用 list 存储数据,按索引访问元素,但是插入和删除元素会根据元素的个数增多个降低效率。因为 list 是线性存储,数据量大插入和删除的效率就会低。

      deque 就是为了高效实现插入和删除操作的双向列表,适用于队列和栈。并且 deque 是线程安全的

    • 导入

      from collections import deque
    • 使用

      q = deque([1,2,3,4,5]) q.append(6) q.appendleft(0) print(q.pop()) print(q.popleft()) print(q)
  • defaultdict

    • 概述

      使用 dict 时,如果引用的 key 不存在,如果使用的 [] 方式则会报 KeyError 异常,如果使用的 get()方式则会得到 None。
      如果希望 key 不存在时也能得到一个默认的值就使用 defaultdict

    • 导入

      from collections import defaultdict
      
    • 使用

      d1 = {"a": 1, "b": 2, "c": 3} # print(d1["d"]) # print(d1.get("d")) d2 = defaultdict(lambda :"键值对不存在") d2["a"] = 1 d2["b"] = 2 print(d2["c"]) print(d2.get("c")) print(d2, type(d2), isinstance(d2, dict))
  • OrderedDict

    • 概述

      使用 dict 是,key 是无序的。对 dict 做迭代时无法保证 key 的顺序。如果需要 key 有顺序,就可以使用 OrderDict

    • 导入

      from collections import OrderedDict
      
    • 使用

      d1 = {"a": 1, "b": 2, "c": 3} for key in d1: print(key) print("----------------------") d2 = OrderedDict([("a", 1),("b", 2),("c", 3)]) print(d2) print(d2["a"]) print(d2.get("b"))
  • Counter

    • 概述

      是一个简单的计数器,本质上是 dict 的一个子类

    • 导入

      from collections import Counter
      
    • 使用

      需求:计算集合中每个字符出现的次数

      s = "zutuanxue_com is a good man" c = Counter() print(c, type(c), isinstance(c, dict)) for ch in s: c[ch] = c[ch] + 1 print(c) for key in c: print(key, c[key])

六、base64 模块

  • 概述

    用记事本打开图片等文件,看到一坨乱码,因为二进制文件包含很多无法显示的内容。所以想让记事本能处理二进制数据,就需要将二进制字符串转换,base64 是一种比较常见的二进制编码方式

  • 作用

    适用于小段内容的编码,比如数字证书签名、cookie、网页中传输的少量二进制数据

  • 编码原理

    一个包含 64 个字符的列表
    [“A”,“B”, ……,“Z”,“a”,“b”, ……,“z”,“0”,“1”, ……,“9”,“+”,“/”]
    对二进制数据进行处理,每是三个字节一组,一组就是 3 ×8=24bit,划分为 4 组,每组正好 6bit。得到 4 个数字作为索引,然后查表,获取相应的 4 个字符,就是编码后的字符串

  • 注意

    base64 是一种通过查表的编码方法,不能用于加密,即使修改了字符对照表也不行

  • 使用

    • b64encode

      s1 = b"zutuanxue_com is a good man" print(base64.b64encode(s1)) s2 = b'c3VuY2sgaXMgYSBnb29kIG1hbg==' print(base64.b64decode(s2))

      由于 = 字符也可能出现在 base64 编码中,但是 = 在 url、cookie 里会造成歧义,所以很多 base64 编码会把编码后的 = 去掉

      s6 = b"abcd" s7 = base64.b64encode(s6) print(s7) ''''YWJjZA==' 'YWJjZA' ''' s8 = b'YWJjZA==' print(base64.b64decode(s8))

      注意

      由于标准 base64 编码后可能出现字符 + 或 /,在 URL 中就不能直接作为参数

    • urlsafe_b64encode

      提供 urlsafe_b64encode 编码,保证 url 的安全,将 + 和 / 替换为 - 和_,提供 urlsafe_b64decode 进行 url 安全解码

      s3 = b"http://www.zutuanxue.com" print(base64.urlsafe_b64encode(s3)) s4 = b"aHR0cDovL3d3dy5zdW5jay53YW5n" print(base64.urlsafe_b64decode(s4)) s5 = b"zutuanxue_com is a good m~" print(base64.b64encode(s5)) print(base64.urlsafe_b64encode(s5))

七、hashlib 模块

  • 概述

    该模块提供了常见的摘要算法,如 MD5、SHA1

    摘要算法(又称哈希算法、散列算法):它通过一个函数,把任意长度的数据转为一个长度固定的数据串(通常用 16 进制的字符串表示)

  • 作用

    用于加密

  • MD5
    最常见的摘要算法,速度快,生成的结构是 128 位字节,通常用 32 位 16 进制字符串表示

  • 使用

    s1 = b"zutuanxue_com is a good man" m1 = hashlib.md5() m1.update(s1) ret = m1.hexdigest() print(ret) # 如果数据量比加大,可以分多次调用 update,最终结果是一样的 m2 = hashlib.md5() m2.update(b"zutuanxue_com is a") m2.update(b"good man") ret2 = m2.hexdigest() print(ret2)
  • SHA1
    调用 SHA1 与调用 MD5 完全一样,SHA1 的结果是 160 字节,通常用 40 位 16 进制字符串表示

  • 使用

    s2 = b"zutuanxue_com is a good man" sh1 = hashlib.sha1() sh1.update(s2) ret3 = sh1.hexdigest() print(ret3)

    注意:数据量大同 md5 使用相同

  • 更安全的
    SHA256
    SHA512
    越安全的算法不见越慢,而且摘要越长

  • 应用:
    任何允许用户登录的网站都会存储用户登录的用户名和密码(存储在数据库中),那么密码一般存储的是原密码的摘要值
    zutuanxue_com-666666 明文存储到数据库中,如果数据库泄露,所有用户信息就会暴露

    正确的保存口令方式不是存储明文,而是存储口令的摘要,当用户登录时,首先计算用户输入的明文的摘要,和数据库中的对比,如果一致说明口令正确,否则一定错误

八、hmac 模块

  • 概述

    实现了 HMAC 算法,是用一个 key 对数据进行“杂凑”后在进行的 hash,是用 hmac 比 hash 算法更安全,不同的 key 会产生不同的 hash 值

  • 导入

    s = b"zutuanxue_com is a good man" key = b"good" h = hmac.new(key, s, digestmod="MD5") ret = h.hexdigest() print(ret)

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-05-26发表,共计6701字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中