1. 程式人生 > 其它 >re模組 collections模組 time與datetime模組 random模組

re模組 collections模組 time與datetime模組 random模組

內容概要

  • re模組補充說明

  • 正則起別名及分組機制

  • collection模組

  • time與datetime模組

  • random隨機數模組

內容詳細

re模組補充說明

# 案例:
import re
1.# findall 方法補充:加括號優先展示
# 1.res = re.findall('a(b)c','abcabcabcabc')
#   print(res)   # ['b', 'b', 'b', 'b']   # 在正則表示式中給某個元素新增一個括號 分組優先展示
# 2.res = re.findall('a(?:b)c','abcabcabcabc')
#   print(res)  # ['abc', 'abc', 'abc', 'abc']  # 如何取消分組優先展示 ——可以使用?:
# 3.res =re.findall('(a)(b)(c)','abcabcabcabc')
#   print(res)   # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')]
# 在findall預設是分組優先展示
    # 大白話:正則表示式中如果有括號分組 那麼在展示匹配結果的時候:預設會優先展示括號內正則表示式匹配的內容 如例題1.
    #        也可以取消分組優先展示的機制 通過(?:)  就是在括號前面加問號冒號
    
2.# search 方法補充:可以通過索引單獨分配資料 大白話:分組特定取值
# res =re.search('(a)(b)c','abcabcabcabc')
# print(res.group())   # abc
# print(res.group(0))   # abc
# print(res.group(1))   # a
# print(res.group(2))   # b    # 如果是在search中可以加括號分組然後通過索引的方式單獨獲取匹配到的資料 也是遵循search的方法 只取到一個就結束
# 需要注意的是:針對search和match有幾個分組 group方法括號內最大就可以寫數值幾

# 分組之後還可以給組起別名  通過?p<>的形式 然後可以通過別名直接找我們所需要的資料
#例題:res =re.search('a(?P<name1>b)(?P<name2>c)','abcabcabcabc')
# print(res.group('name1'))   # b
# print(res.group('name2'))   # c


collections模組

"在內建資料型別(dict list set tuple)的基礎上 collections模組還提供了幾個額外的資料型別:counter、deque、defaultdict、namedtuple"
1.# 具名元組 namedtuple
from collections import namedtuple
# 用法1.先產生一個元組物件模板
# res = namedtuple('座標',['x','y'])
# # 2.建立諸多元資料
# p1 =res(1,2)
# p2 =res(3,4)
# print(p1,p2)  # 座標(x=1, y=2) 座標(x=3, y=4) 形成了一個二維座標
# # 還可以用來取值
# print(p1.x)  # 1
# print(p2.y)  # 4
# 用法2 可以產生多維空間的用法
person =namedtuple('人物','name age gender')
p1 =person('jason',18,'male')
p2 =person('jerry',18,'female')
print(p1,p2) #人物(name='jason', age=18, gender='male') 人物(name='jerry', age=18, gender='female')
# 也可以用來取值
print(p1.name,p1.gender) # jason male
"具名元組的使用場景也非常廣泛 比如數學領域、娛樂領域等"
比如:
card = namedtuple('撲克牌', ['花色', '點數'])
c1 = card('黑桃♠', 'A')
c2 = card('黑梅♣', 'K')
c3 = card('紅心❤', 'A')
print(c1, c2, c3)
print(c1.點數)

2.# 雙端佇列
佇列:先進先出  預設是隻有一端只能進另外一端只能出
雙端佇列:兩端都可以進出
# 1.import queue   # 佇列
# q =queue.Queue(3)  # 表示的是對列只能放三個元素
# # 存放元素
# q.put(123)
# q.put(231)
# q.put(321)
# # q.put(444)  # 如果對列滿了 繼續新增元素則原地等待
# # 獲取元素
# print(q.get())
# print(q.get())
# print(q.get())
# print(q.get())  # 如果佇列空了 繼續獲取則需要原地等待

# 2.deque 雙端佇列
from collections import deque
q =deque([1,2,3])
# print(q)  # deque([1, 2, 3])
q.append(444)  # 雙端佇列可以右邊新增元素
print(q)  # deque([1, 2, 3, 444])
q.appendleft(666) # 也可以左邊新增元素
print(q)  # deque([666, 1, 2, 3, 444])
q.pop()  # 可以尾部右側彈出元素
print(q)   # deque([666, 1, 2, 3])
q.popleft()  # 也可以左邊彈出元素
print(q)  # deque([1, 2, 3])

3.字典相關
# 我們都知道正常的字典內部都是無序的
# 無序的字典
d1 =dict([('name','jason'),('pwd',123),('hobby','study')])
print(d1) # {'name': 'jason', 'pwd': 123, 'hobby': 'study'}
print(d1.keys()) # dict_keys(['name', 'pwd', 'hobby'])
# 有序的字典  OrderedDict
from collections import OrderedDict
d2 =OrderedDict([('a',1),('b',2),('c',3)])
print(d2)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
d2['x'] = 111
d2['y'] = 222
d2['z'] = 333
print(d2)  # OrderedDict([('a', 1), ('b', 2), ('c', 3), ('x', 111), ('y', 222), ('z', 333)])
print(d2.keys())  # odict_keys(['a', 'b', 'c', 'x', 'y', 'z'])

有序字典的應用:
有如下值集合 [11,22,33,44,55,67,77,88,99,999],
將所有大於 66 的值儲存至字典的第一個key中,將小於 66 的值儲存至第二個key的值中。
"""
# l1 = [11,22,33,44,55,67,77,88,99,999]
# new_dict = {'k1':[],'k2':[]}
# for i in l1:
#     if i > 66:
#         new_dict['k1'].append(i)
#     else:
#         new_dict['k2'].append(i)
# print(new_dict)
from collections import defaultdict
values = [11, 22, 33,44,55,67,77,88,99,90]
my_dict = defaultdict(list)  # 字典所有的值預設都是列表  {'':[],'':[]}
for value in  values:
    if value>66:
        my_dict['k1'].append(value)
    else:
        my_dict['k2'].append(value)

4.計數器
res = 'abcdeabcdabcaba'
new_dict ={}
for i in res:
    if i not in new_dict:
# 字元第一次出現 應該建立一個新的鍵值對
        new_dict[i] = 1
    else:
        new_dict[i] += 1
print(new_dict)  # {'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}
# 用counter如何來書寫
from collections import Counter
r =Counter(res)
print(r)  #Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
print(r.get('a'))  # 5
# 此外 我們還可以將統計次數的功能當成字典使用

     

time 模組

# 1.採用方法
1.time.sleep(secs)
   推遲指定的時間執行,單位為秒
   注意:該方法貫穿前後(基礎、後期)
2.time.time()
   獲取當前時間戳
    
# 2.三種用於表示時間的格式(彼此之間可以轉換)
1.時間戳
  距離1970年1月1日0時0分0秒至此相差的秒數
     time.time()
2.結構化時間
  該時間型別主要是給計算機看的,人看起來不太方便
    time.localtime()
    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.格式化時間
  人最容易接收的一種時間格式 
    # 結構化時間
import time
print(time.localtime()) # # 2022-03-29 17:17:40
time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=17, tm_min=11, tm_sec=33, tm_wday=1, tm_yday=88, tm_isdst=0)

# 格式化時間
print(time.strftime('%Y-%m-%d %H:%M:%S'))  # 2022-03-29 17:17:40
print(time.strftime('%Y-%m-%d %X'))  # 2022-03-29 17:17:40

三種時間型別的轉換

格式化時間 <==> 結構化時間 <==> 時間戳

# 時間戳<==> 結構化時間
     gmtime
    localtime
# 結構化時間<-->格式化時間
    strftime
    strptime
    time.strptime("2017-03-16","%Y-%m-%d")
    time.strptime("2017/03","%Y/%m")   括號內前後數字與英文必須保持一致 包括格式 年月等

datetime模組(更加高效)

# 基本操作
import datetime
# print(datetime.date.today())  # 2022-03-29
# print(datetime.datetime.today()) # 2022-03-29 18:06:30.300979 注意一個是有時分秒

date  表示是年月日
datetime  表示是年月日 時分秒
注意:後期很多時間相關的操作都是跟date和time有關係

例題:
# res =datetime.date.today()
# print(res.year)  # 2022
# print(res.month)   # 3
# print(res.day)    # 29
# print(res.weekday)  # 1  weekday是星期一到星期天是從數字0到數字6
# print(res.isoweekday())  # 2  isoweekday是星期一到星期天是從數字1到數字7

"時間差應用"
ctime =datetime.datetime.today()
time_tel =datetime.timedelta(days=4)  # 時間差為4天
print(ctime)  # 2022-03-29 18:18:29.296103
print(ctime+time_tel)  # 2022-04-02 18:20:08.519779 # 加可以定時定在4天后
print(ctime-time_tel)  #  減可以定時定在4天前 2022-03-25 18:21:51.654678

針對時間計算的公式
     日期物件 =日期物件 +/- timedalta物件
    timedelta物件 =日期物件 +/-日期物件
# 可以計算兩個時間的時間差值    
res =ctime +time_tel
print(res-ctime)   # 4 days,0:00:00  

random 模組

'''別名>>>:隨機數模組'''
import random

# print(random.random())  # 沒有數字預設隨機產生一個0到1之間的小數
print(random.uniform(2,4))  # 隨機產生一個2到4之間的小數
# print(random.randint(0,9))  # 隨機產生一個0到9之間的整數(包含0和9)
應用:
print(random.randint(1,6))  # 搖骰子
# l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
# random.shuffle(l)  # 隨機打亂一個數據集合                       洗牌
# print(l)
# ll1 = ['特等獎','張飛抱回家','如花','百萬現金大獎','群內配對']
# print(random.choice(ll1))  # 隨機抽取一個                     抽獎
ll = ['如花','C老師','R老師','J老師','M老師','張飛','龍龍']
print(random.sample(ll, 2))  # 隨機指定個數抽樣                 抽樣