Python攻城师的成长————模块突破(collections、time与datetime、random随机数模块)

本文介绍了Python中的collections模块,包括namedtuple、deque、Counter和OrderedDict等容器的使用。接着讲解了time和datetime模块,涉及时间戳、结构化时间与格式化时间的相互转换。此外,还探讨了random模块的各种随机数生成方法,如随机整数、浮点数和随机选择元素等。学习目标包括掌握这些模块的常用功能,并能应用于实际项目中。
摘要由CSDN通过智能技术生成

今日学习目标:

  • 学习并应用collections、time与datetime、random随机数模块知识

今日学习内容:

  1. collections模块
  2. time与datetime模块
  3. random随机数模块

内容详情:

collections模块

这个模块实现了特定目标的容器,以提供Python标准内建容器 dict、list、set、tuple 的替代选择。

内部方法官方介绍:

函数名功能
Counter字典的子类,提供了可哈希对象的计数功能
defaultdict字典的子类,提供了一个工厂函数,为字典查询提供了默认值
OrderedDict字典的子类,保留了他们被添加的顺序
namedtuple创建命名元组子类的工厂函数
deque类似列表容器,实现了在两端快速添加(append)和弹出(pop)
ChainMap类似字典的容器类,将多个映射集合到一个视图里面

部分方法个人理解:

  1. namedtuple
    简介
    具名元祖(加强版tuple),可以使tuple更加语义化。之前我们写一个元祖tuple,对内部元素不能进行命名。往往我们并不知道一个元祖所要表达的意义,而namedtuple很好的解决了此问题。(可以变相地理解为字典化的元组)
    语法结构

    namedtuple('tuple_name', 'field_names')
    
    # tuple_name 元祖的名称,为字符串,返回一个元组子类,所以我们要对这个对象进行命名。
    # field_name 元祖中元素的名称,通常是一个可迭代的数据,也可以是以逗号隔开的元素名称
    

    用法举例

    from collections import namedtuple
    
    person = namedtuple('人物', 'name age gender')
    p1 = person('jason', 18, 'male')
    p2 = person('kevin', 28, 'female')
    print(p1, p2)
    print(p1.name, p1.age)
    
    
    '''
    # 执行结果
    人物(name='jason', age=18, gender='male') 人物(name='kevin', age=28, 			gender='female')
    jason 18
    '''
    
    

    特有属性及方法

    • 属性 _fileds
      输出这个类的所有字段名的元祖

      from collections import namedtuple
      
      person = namedtuple('人物', 'name age gender')
      p1 = person('jason', 18, 'male')
      p2 = person('kevin', 28, 'female')
      print(p1._fields)
      print(p2._fields)
      
      
      '''
      # 执行结果
      ('name', 'age', 'gender')
      ('name', 'age', 'gender')
      '''
      
    • 方法 _asdict()
      把具名元祖以collection.OrdereDict的形似返回

      from collections import namedtuple
      
      person = namedtuple('人物', 'name age gender')
      p1 = person('jason', 18, 'male')
      p2 = person('kevin', 28, 'female')
      print(p1._asdict())
      print(p2._asdict())
      
      
      '''
      # 执行结果
      {'name': 'jason', 'age': 18, 'gender': 'male'}
      {'name': 'kevin', 'age': 28, 'gender': 'female'}
      '''
      

  2. deque
    简介
    双向队列,类似于list的容器,可以快速的在队列头部和尾部添加、删除元素
    内部功能分类

    1. append
      从右端添加元素(与list同)
      用法举例

      from collections import deque
      
      q = deque([1, 2, 3])
      print(q)
      q.append(444)  
      print(q)
      
      '''
      # 执行结果
      deque([1, 2, 3])
      deque([1, 2, 3, 444])
      '''
      
      
    2. appendleft
      从左端添加元素
      用法举例

      from collections import deque
      
      q = deque([1, 2, 3])
      print(q)
      q.appendleft(666)
      print(q)
      
      '''
      # 执行结果
      deque([1, 2, 3])
      deque([666, 1, 2, 3])
      '''
      
      
    3. pop
      移除列表中的一个元素(默认最右端的一个元素),并且返回该元素的值(与list同),如果没有元素,将会报出IndexError
      用法举例

      from collections import deque
      
      q = deque([1, 2, 3])
      print(q)
      print(q.pop())
      
      '''
      # 执行结果
      deque([1, 2, 3])
      3
      '''
      
      
    4. popleft
      移除列表中的一个元素(默认最左端的一个元素),并且返回该元素的值,如果没有元素,将会报出IndexError
      用法举例

      from collections import deque
      
      q = deque([1, 2, 3])
      print(q)
      print(q.popleft())
      
      '''
      # 执行结果
      deque([1, 2, 3])
      1
      '''
      
      

  3. Counter
    简介
    计数器,可以支持方便、快速的计数,将元素数量统计,然后计数并返回一个字典,键为元素,值为元素个数。
    内部独特功能

    1. most_common()
      返回一个列表,包含counter中n个最大数目的元素,如果忽略n或者为None,most_common()将会返回counter中的所有元素,元素有着相同数目的将会选择出现早的元素
      用法举例

      from collections import Counter
      
      list1 = ["a", "a", "a", "b", "c", "f", "g", "g", "c", "11", "g", "f", "10", "2"]
      print(Counter(list1).most_common(3))
      
      list2 = ["a", "a", "a", "b", "f", "c", "g", "g", "c", "11", "g", "f", "10", "2"]
      print(Counter(list2).most_common(3))
      
      '''
      # 执行结果
      [('a', 3), ('g', 3), ('c', 2)]
      [('a', 3), ('g', 3), ('f', 2)]
      '''
      
      
    2. elements()
      返回一个迭代器,每个元素重复的次数为它的数目,顺序是任意的顺序,如果一个元素的数目少于1,那么elements()就会忽略它
      用法举例

      from collections import Counter
      
      dic1 = {'a': 3, 'b': 4, 'c': 0, 'd': -2, "e": 0}
      print(Counter(dic1))
      print(list(Counter(dic1).elements()))
      
      
      '''
      # 执行结果
      Counter({'b': 4, 'a': 3, 'c': 0, 'e': 0, 'd': -2})
      ['a', 'a', 'a', 'b', 'b', 'b', 'b']
      '''
      
    3. subtract()
      从一个可迭代对象中或者另一个映射(或counter)中,元素相减,是数目相减而不是替换它们
      用法举例

      from collections import Counter
      
      dic1 = {'a': 3, 'b': 4, 'c': 0, 'd': -2, "e": 0}
      dic2 = {'a': 3, 'b': 4, 'c': 0, 'd': 2, "e": -1, "f": 6}
      a = Counter(dic1)
      print(a)
      b = Counter(dic2)
      print(b)
      
      '''
      # 执行结果
      Counter({'b': 4, 'a': 3, 'c': 0, 'e': 0, 'd': -2})
      Counter({'f': 6, 'b': 4, 'a': 3, 'd': 2, 'c': 0, 'e': -1})
      '''
      

  4. OrderedDict
    简介
    有序字典,实现了对字典对象中元素的排序。

    用法举例

    from collections import OrderedDict
    
    d2 = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    print(d2)
    d2['x'] = 111
    d2['y'] = 222
    d2['z'] = 333
    print(d2)
    print(d2.keys())
    
    '''
    # 执行结果
    OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    OrderedDict([('a', 1), ('b', 2), ('c', 3), ('x', 111), ('y', 222), ('z', 333)])
    odict_keys(['a', 'b', 'c', 'x', 'y', 'z'])
    '''
    
    

    如果在已经存在的 key 上添加新的值,将会保留原来的 key 的位置,然后覆盖 value 值。


  5. defaultdict
    简介
    默认字典,是内置数据类型dict的一个子类,基本功能与dict一样,只是重写了一个方法missing(key)和增加了一个可写的对象变量default_factory
    语法结构

    collections.defaultdict([default_factory[,]])
    

    第一个参数为default_factory属性提供初始值,默认为None;其余参数包括关键字参数(keyword arguments)的用法,和dict构造器用法一样。

    用法举例:使用list作第一个参数,可以很容易将键-值对序列转换为列表字典。

    from collections import defaultdict
    
    s=[('yellow',1),('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
    d=defaultdict(list)
    for k, v in s:
    	d[k].append(v)
    a=sorted(d.items())
    print(a)
    
    '''
    # 执行结果
    [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
    '''
    
    

time与datetime模块.

  • time模块
    常用方法

    1. time.sleep(secs)
      推迟指定的时间运行,单位为秒
    2. time.time()
      获取当前时间戳

    三种用于表示时间的格式(彼此之间可以转换)
    时间戳<–>结构化时间

    • time.gmtime() 以元组方式返回格林威治时间
    • localtime 将元组时间转换为时间戳

    结构化时间<–>格式化时间

    • time.strftime() 将元组时间转换为字符串格式时间
    • time.strptime() 将字符串格式时间转换为元组格式时间
    1. 时间戳 time.time()
      距离1970年1月1日0时0分0秒至此相差的秒数

    2. 结构化时间 time.localtime()以元组方式返回本地当前时间
      该时间类型主要是给计算机看的,人看起来不太方便

      import time
      
      print(time.localtime())
      
      '''
      # 执行结果
      time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=19, 		tm_min=43, tm_sec=35, tm_wday=1, tm_yday=88, tm_isdst=0)
      
      '''
      

      结果说明
      0 tm_year(年) 比如2011
      1 tm_mon(月) 1 - 12
      2 tm_mday(日) 1 - 31
      3 tm_hour(时) 0 - 23
      4 tm_min(分) 0 - 59
      5 tm_sec(秒) 0 - 60
      6 tm_wday(weekday) 0 - 6(0表示周一)
      7 tm_yday(一年中的第几天) 1 - 366
      8 tm_isdst(是否是夏令时) 默认为0

    3. 格式化时间 time.strftime()

      import time
      
      print(time.strftime('%Y-%m-%d %H:%M:%S'))
      
      '''
      # 执行结果
      2022-03-29 19:48:15
      
      '''
      

      结果说明
      %y 两位数的年份表示(00-99)
      %Y 四位数的年份表示(000-9999)
      %m 月份(01-12)
      %d 月内中的一天(0-31)
      %H 24小时制小时数(0-23)
      %I 12小时制小时数(01-12)
      %M 分钟数(00=59)
      %S 秒(00-59)
      %a 本地简化星期名称
      %A 本地完整星期名称
      %b 本地简化的月份名称
      %B 本地完整的月份名称
      %c 本地相应的日期表示和时间表示
      %j 年内的一天(001-366)
      %p 本地A.M.或P.M.的等价符
      %U 一年中的星期数(00-53)星期天为星期的开始
      %w 星期(0-6),星期天为星期的开始
      %W 一年中的星期数(00-53)星期一为星期的开始
      %x 本地相应的日期表示
      %X 本地相应的时间表示
      %Z 当前时区的名称
      %% %号本身

  • datetime模块
    注意
    date 意思就是年月日
    datetime 意思就是年月日 时分秒
    基础用法

    1. 返回当前时间

      import datetime
      
      print(datetime.datetime.now())
      
      '''
      # 执行结果
      2022-03-29 19:58:56.239953
      '''
      
    2. 时间戳转换成日期

      import datetime
      
      print(datetime.date.fromtimestamp(1178766678))
      
      '''
      # 执行结果
      2007-05-10
      '''
      
    3. 当前时间+3天

      import datetime
      
      print(datetime.datetime.now() + datetime.timedelta(+3))
      
      '''
      # 执行结果
      2022-04-01 20:02:47.204113
      '''
      
    4. 当前时间-3天

      import datetime
      
      print(datetime.datetime.now() + datetime.timedelta(-3))
      
      '''
      # 执行结果
      2022-03-26 20:03:35.130271
      '''
      
    5. 当前时间+3小时

      import datetime
      
      print(datetime.datetime.now() + datetime.timedelta(hours=3))
      
      '''
      # 执行结果
      2022-03-29 23:04:18.038341
      '''
      
    6. 当前时间+30分钟

      import datetime
      
      print(datetime.datetime.now() + datetime.timedelta(minutes=30))
      
      '''
      # 执行结果
      2022-03-29 20:35:17.594292
      '''
      

random随机数模块

代码中经常有一些生成随机数的需求。特意整理了一下python中random模块的一些相关用法。

基本用法

  1. 随机整数:

    import random
    
    print(random.randint(0, 99))
    
    '''
    # 执行结果
    33
    '''
    
  2. 随机选取0到100间的偶数:

    import random
    
    print(random.randrange(0, 101, 2))
    
    '''
    # 执行结果
    30
    '''
    
  3. 随机浮点数:

    import random
    # 范围 0-10
    print(random.uniform(1, 10))
    
    '''
    # 执行结果
    9.109443958042473
    '''
    
  4. 选择一个随机元素

    import random
    
    print(random.choice('abc'))
    
    '''
    # 执行结果
    b
    '''
    
  5. 将一个列表中的元素打乱

    import random
    
    p = ["Python","is", "powerful","simple", "and so on..."]
    random.shuffle(p)
    print(p)
    
    '''
    # 执行结果
    ['powerful', 'is', 'simple', 'and so on...', 'Python']
    '''
    
  6. 从指定序列中随机获取指定长度片段

    import random
    
    list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    a = random.sample(list, 5)
    print(list)
    print(a)
    
    '''
    # 执行结果
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    [8, 10, 3, 9, 6]
    '''
    
  7. 随机字符:

    import random
    
    print(random.choice('abcdefg&#%^*f'))
    
    '''
    # 执行结果
    &
    '''
    
  8. 多个字符中选取特定数量的字符:

    import random
    
    print(random.sample('abcdefghij', 3))
    
    '''
    # 执行结果
    ['f', 'i', 'g']
    '''
    
  9. 多个字符中选取特定数量的字符组成新字符串:

    import random
    
    a = ''.join(random.sample(['a','b','c','d','e','f','g','h','i','j'], 3)).replace(" ","")
    print(a)
    
    '''
    # 执行结果
    ghj
    '''
    
  10. 随机选取字符串:

    import random
    
    print(random.choice(['apple', 'pear', 'peach', 'orange', 'lemon']))
    
    '''
    # 执行结果
    apple
    '''
    
  11. 洗牌:

    import random
    
    items = [1, 2, 3, 4, 5, 6]
    random.shuffle(items)
    print(items)
    
    '''
    # 执行结果
    [4, 1, 3, 6, 5, 2]
    '''
    

学习时间:

  • 周一至周五晚上 7 点—晚上9点
  • 周六上午 9 点-上午 11 点
  • 周日下午 3 点-下午 6 点

学习产出:

  • CSDN 技术博客 1 篇
  • 学习心得录音 1 个
  • 作业
    使用random模块编写一个能够产生随机验证码的代码
    基本要求:产生固定位数的 比如四位
    拔高要求:产生指定位数的 …
    eg:
    要产生四位随机验证码 J2nB
    要产生五位随机验证码 JkO98
import random

# 生成小写字母列表
l1 = [chr(i) for i in range(97, 123)]
# 生成大写字母列表
l2 = [chr(i) for i in range(65, 91)]
# 生成0-9数字列表
l3 = ['%s' % i for i in range(0, 10)]
# 生成四位验证码
print(''.join(random.sample(l1 + l2 + l3, 4)).replace(" ", ""))
# 生成五位验证码
print(''.join(random.sample(l1 + l2 + l3, 5)).replace(" ", ""))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值