• Python复习笔记5——常用模块


    一、内建模块

    1.1 datetime日期时间

    (1)导入模块

    from datetime import datetime
    
    • 1

    仅导入import datetime,则必须引用全名datetime.datetime

    (2)获取日期时间

    获取当前日期时间

    >>> now = datetime.now() # 获取当前datetime
    >>> print(now)
    2015-05-18 16:28:07.198690
    
    • 1
    • 2
    • 3

    获取指定日期时间

    >>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
    >>> print(dt)
    2015-04-19 12:20:00
    
    • 1
    • 2
    • 3

    (3)日期时间加减

    加减可以直接用+-运算符,不过需要导入timedelta这个类:

    >>> from datetime import datetime, timedelta
    >>> now = datetime.now()
    >>> now
    datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
    >>> now + timedelta(hours=10)
    datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
    >>> now - timedelta(days=1)
    datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
    >>> now + timedelta(days=2, hours=12)
    datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (4)时区转换

    通过utcnow()拿到当前的UTC时间,再转换为任意时区的时间:

    # 拿到UTC时间,并强制设置时区为UTC+0:00:
    >>> utc_dt = datetime.utcnow().replace(tzinfo=timezone.utc)
    >>> print(utc_dt)
    2015-05-18 09:05:12.377316+00:00
    # astimezone()将转换时区为北京时间:
    >>> bj_dt = utc_dt.astimezone(timezone(timedelta(hours=8)))
    >>> print(bj_dt)
    2015-05-18 17:05:12.377316+08:00
    # astimezone()将转换时区为东京时间:
    >>> tokyo_dt = utc_dt.astimezone(timezone(timedelta(hours=9)))
    >>> print(tokyo_dt)
    2015-05-18 18:05:12.377316+09:00
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    时区转换的关键在于,拿到一个datetime时,要获知其正确的时区,然后强制设置时区,作为基准时间。

    利用带时区的datetime,通过astimezone()方法,可以转换到任意时区。

    (5)datetime与timestamp的转换

    在计算机中,时间实际上是用数字表示的。我们把1970年1月1日 00:00:00 UTC+00:00时区的时刻称为epoch time,记为0。当前时间就是相对于epoch time的秒数,称为timestamp。

    把一个datetime类型转换为timestamp只需要简单调用timestamp()方法:

    >>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间创建datetime
    >>> dt.timestamp() # 把datetime转换为timestamp
    1429417200.0
    
    • 1
    • 2
    • 3

    要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法:

    >>> from datetime import datetime
    >>> t = 1429417200.0
    >>> print(datetime.fromtimestamp(t))
    2015-04-19 12:20:00
    
    • 1
    • 2
    • 3
    • 4

    (6)datetime与str的转换

    很多时候,用户输入的日期和时间是字符串,要处理日期和时间。

    转换方法是通过datetime.strptime()实现,需要一个日期和时间的格式化字符串:

    >>> from datetime import datetime
    >>> cday = datetime.strptime('2015-6-1 18:19:59', '%Y-%m-%d %H:%M:%S')
    >>> print(cday)
    2015-06-01 18:19:59
    
    • 1
    • 2
    • 3
    • 4

    详细的指使符参考Python官方文档

    要把日期格式化为字符串显示给用户,需要转换成str,转换方法是通过strftime()实现的

    >>> from datetime import datetime
    >>> now = datetime.now()
    >>> print(now.strftime('%a, %b %d %H:%M'))
    Mon, May 05 16:28
    
    • 1
    • 2
    • 3
    • 4

    1.2 collections集合

    (1)namedtuple

    namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

    >>> from collections import namedtuple
    >>> Point = namedtuple('Point', ['x', 'y'])
    >>> p = Point(1, 2)
    >>> p.x
    1
    >>> p.y
    2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (2)deque

    deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈(代替list存在):

    >>> from collections import deque
    >>> q = deque(['a', 'b', 'c'])
    >>> q.append('x')
    >>> q.appendleft('y')
    >>> q
    deque(['y', 'a', 'b', 'c', 'x'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    deque除了实现list的append()pop()外,还支持appendleft()popleft(),这样就可以非常高效地往头部添加或删除元素。

    (3)OrderedDict

    使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict

    >>> from collections import OrderedDict
    >>> d = dict([('a', 1), ('b', 2), ('c', 3)])
    >>> d # dict的Key是无序的
    {'a': 1, 'c': 3, 'b': 2}
    >>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    >>> od # OrderedDict的Key是有序的
    OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

    1.3 itertools

    Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。

    (1)无限迭代器

    count()会创建一个无限的迭代器,根本停不下来,只能按Ctrl+C退出:

    >>> import itertools
    >>> natuals = itertools.count(1)
    >>> for n in natuals:
    ...     print(n)
    ...
    1
    2
    3
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    cycle()会把传入的一个序列无限重复下去,同样停不下来:

    >>> import itertools
    >>> cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
    >>> for c in cs:
    ...     print(c)
    ...
    'A'
    'B'
    'C'
    'A'
    'B'
    'C'
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    repeat()负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数:

    >>> ns = itertools.repeat('A', 3)
    >>> for n in ns:
    ...     print(n)
    ...
    A
    A
    A
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (2)有限迭代

    takewhile()函数根据条件判断来截取出一个有限的序列:

    >>> natuals = itertools.count(1)
    >>> ns = itertools.takewhile(lambda x: x <= 10, natuals)
    >>> list(ns)
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    • 1
    • 2
    • 3
    • 4

    chain()可以把一组迭代对象串联起来,形成一个更大的迭代器:

    >>> for c in itertools.chain('ABC', 'XYZ'):
    ...     print(c)
    # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
    
    • 1
    • 2
    • 3

    groupby()把迭代器中相邻的重复元素挑出来放在一起:

    >>> for key, group in itertools.groupby('AAABBBCCAAA'):
    ...     print(key, list(group))
    ...
    A ['A', 'A', 'A']
    B ['B', 'B', 'B']
    C ['C', 'C']
    A ['A', 'A', 'A']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、第三方模块

    2.1 Pillow

    Pillow就是PIL的更新版本。由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,即Pillow。

    Pillow官方文档:https://pillow.readthedocs.org/

    (1)Pillow安装

    若使用Anaconda,则Pillow已默认安装。若自己搭建的python环境,使用以下命令安装。

    pip install pillow
    
    • 1

    (2)图像操作

    导入Pillow

    from PIL import Image
    
    • 1

    打开图像

    # 打开一个jpg图像文件,注意是当前路径:
    im = Image.open('test.jpg')
    
    • 1
    • 2

    保存图像

    # 把缩放后的图像用jpeg格式保存:
    im.save('thumbnail.jpg', 'jpeg')
    
    • 1
    • 2

    获得图像尺寸

    # 获得图像尺寸:
    w, h = im.size
    print('Original image size: %sx%s' % (w, h))
    
    • 1
    • 2
    • 3

    缩放图像

    # 缩放到50%:
    im.thumbnail((w//2, h//2))
    
    • 1
    • 2

    模糊图像

    # 应用模糊滤镜:
    im2 = im.filter(ImageFilter.BLUR)
    
    • 1
    • 2

    (3)绘图

    创建图像

    image = Image.new('RGB', (width, height), (255, 255, 255))
    
    • 1

    创建font对象

    font = ImageFont.truetype('Arial.ttf', 36)
    
    • 1

    创建draw对象

    draw = ImageDraw.Draw(image)
    
    • 1

    填充像素

    draw.point((x, y))
    
    • 1

    输出文字

    draw.text((x, y), "Text", font=font)
    
    • 1

    示例:生成验证码

    from PIL import Image, ImageDraw, ImageFont, ImageFilter
    
    import random
    
    # 随机字母:
    def rndChar():
        return chr(random.randint(65, 90))
    
    # 随机颜色1:
    def rndColor():
        return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
    
    # 随机颜色2:
    def rndColor2():
        return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
    
    # 240 x 60:
    width = 60 * 4
    height = 60
    image = Image.new('RGB', (width, height), (255, 255, 255))
    # 创建Font对象:
    font = ImageFont.truetype('Arial.ttf', 36)
    # 创建Draw对象:
    draw = ImageDraw.Draw(image)
    # 填充每个像素:
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=rndColor())
    # 输出文字:
    for t in range(4):
        draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
    # 模糊:
    image = image.filter(ImageFilter.BLUR)
    image.save('code.jpg', 'jpeg')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TMNSsB8M-1657027077389)(https://www.liaoxuefeng.com/files/attachments/966760380198752)]

  • 相关阅读:
    【leetcode】最长斐波那契数列
    JavaScript简介
    Redis 学习-上
    【Vue】VueX 的语法详解(1)
    linux环境QT做静态库,QT静态库的创建与使用
    VSCode Java 开发配置
    java8的一些认识
    Mysql聚簇和非聚簇索引的区别
    Mysql数据库对表的基本操作
    【网络安全 --- PHP基础】学网安PHP语言所涉及到的知识,来看看吧,看着一篇文章就够了,建议收藏学习!!!
  • 原文地址:https://blog.csdn.net/weixin_44543463/article/details/125628293