今日學習內容總結2.0
今日學習內容總結
在昨日的學習中,我們瞭解了正則表示式的使用方法,並且對re模組進行了學習。因為python想要使用正則表示式,就需要藉助於re模組。而今天我們對其他模組也來進行學習與使用。
re模組的補充說明
針對昨日已經學習的re模組常用方法,來做一個補充。
findall預設是分組優先展示,正則表示式中如果有括號分組,那麼在展示匹配結果的時候,預設植妍詩括號內正則表示式匹配到的內容,同時也可以取消分組有限展示的機制。案例:
import re ret = re.findall('a(b)c', 'abcabcabcabc') print(ret) # ['b', 'b', 'b', 'b'] ret = re.findall('a(?:b)c', 'abcabcabcabc') print(ret) # ['abc', 'abc', 'abc', 'abc'] ret = re.findall('(a)(b)(c)', 'abcabcabcabc') print(ret) # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')] ret = re.findall('(?P<aaa>a)(b)(c)', 'abcabcabcabc') print(ret) # [('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c'), ('a', 'b', 'c')] print(ret.group('aaa')) # 'list' object has no attribute 'group' ret = re.search('a(b)c', 'abcabcabcabc') print(ret.group()) # abc print(ret.group(0)) # abc print(ret.group(1)) # b 可以通過索引的方式單獨獲取分組內匹配到的資料 ret = re.search('a(b)(c)', 'abcabcabcabc') print(ret.group()) # abc print(ret.group(0)) # abc print(ret.group(1)) # b 可以通過索引的方式單獨獲取分組內匹配到的資料 print(ret.group(2)) # c # 分組之後還可以給組起別名 ret = re.search('a(?P<name1>b)(?P<name2>c)', 'abcabcabcabc') print(ret.group('name1')) # b print(ret.group('name2')) # c
collections模組
collections是日常工作中的重點、高頻模組,常用型別有:1.計數器(Counter)。2.雙向佇列(deque)。3.預設字典(defaultdict)。4.有序字典(OrderedDict)。5.可命名元組(namedtuple)。
1.計數器(Counter)
Counter作為字典dicit()的一個子類用來進行hashtable計數,將元素進行數量統計,計數後返回一個字典,鍵值為元素,值為元素個數。
常用方法:
方法名 | 方法描述 |
---|---|
most_common(int) | 按照元素出現的次數進行從高到低的排序,返回前int個元素的字典 |
elements | 返回經過計算器Counter後的元素,返回的是一個迭代器 |
update | 和set集合的update一樣,對集合進行並集更新 |
substract | 和update類似,只是update是做加法,substract做減法,從另一個集合中減去本集合的元素 |
iteritems | 返回由Counter生成的字典的所有item |
iterkeys | 返回由Counter生成的字典的所有key |
itervalues | 返回由Counter生成的字典的所有value |
程式碼案例:
from collections import Counter str = "abcbcaccbbad" li = ['a', 'b', 'c', 'a', 'b', 'b'] d = {'1': 3, '3': 2, '17': 2} # Counter獲取各元素的個數,返回字典 print(Counter(str)) # Counter({'b': 4, 'c': 4, 'a': 3, 'd': 1}) print(Counter(li)) # Counter({'b': 3, 'a': 2, 'c': 1}) print( Counter(d)) # Counter({'1': 3, '3': 2, '17': 2}) # most_common(int)按照元素出現的次數進行從高到低的排序,返回前int個元素的字典 d1 = Counter(str) print(d1.most_common(2)) # [('b', 4), ('c', 4)] # elements返回經過計算器Counter後的元素,返回的是一個迭代器 print(sorted(d1.elements())) # ['a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c', 'd'] print( "".join(d1.elements())) # aaabbbbccccd # 若是字典的話返回value個key d2 = Counter(d) print(sorted(d2.elements())) # ['1', '1', '1', '17', '17', '3', '3']
2.雙向佇列(deque)
佇列:先進先出。預設是隻有一端只能進另外一端只能出。雙端佇列:兩端都可以進出
常用方法:
方法名 | 方法描述 |
---|---|
append | 佇列右邊新增元素 |
appendleft | 佇列左邊新增元素 |
clear | 清空佇列中的所有元素 |
count | 返回佇列中包含value的個數 |
extend | 佇列右邊擴充套件,可以是列表、元組或字典,如果是字典則將字典的key加入到deque |
extendleft | 同extend,在左邊擴充套件 |
pop | 移除並返回佇列右邊的元素 |
popleft | 移除並返回佇列左邊的元素 |
remove(value) | 移除佇列第一個出現的元素 |
reverse | 佇列的所有元素進行反轉 |
rotate(n) | 對佇列數進行移動 |
程式碼案例:
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.預設字典(defaultdict)
預設字典,字典的一個子類,繼承所有字典的方法,預設字典在進行定義初始化的時候得指定字典值有預設型別。
from collections import defaultdict
dic = defaultdict(dict)
dic["k1"].update({"asdsa": "123"})
print(dic)
# 字典dic在定義的時候就定義好了值為字典型別,雖然現在字典中還沒有鍵值 k1,但仍然可以執行字典的update方法. 這種操作方式在傳統的字典型別中是無法實現的,必須賦值以後才能進行值得更新操作,否則會報錯。
4.有序字典(OrderedDict)
有序字典也是字典的一個子類:
傳統方式進行字典排序:
# 定義傳統字典
dic1 = dict()
# 按順序新增字典內容
dic1['a'] = '123'
dic1['b'] = 'jjj'
dic1['c'] = '394'
dic1['d'] = '999'
print(dic1) # 結果: {'a': '123', 'c': '394', 'b': 'jjj', 'd': '999'}
# 排序
dic1_key_list = []
for k in dic1.keys():
dic1_key_list.append(k)
dic1_key_list.sort()
for key in dic1_key_list:
print('dic1字典排序結果 %s:%s' % (key, dic1[key]))
使用OrderedDict對字典進行排序:
from collections import OrderedDict
# 定義有序字典
dic2 = OrderedDict()
dic2['a'] = '123'
dic2['b'] = 'jjj'
dic2['c'] = 'abc'
dic2['d'] = '999'
print(dic2) # OrderedDict([('a', '123'), ('b', 'jjj'), ('c', 'abc'), ('d', '999')])
print(dic2.keys()) # odict_keys(['a', 'b', 'c', 'd'])
5.可命名元祖(namedtuple)
namedtuple由自己的類工廠namedtuple()進行建立,而不是由表中的元組進行初始化,通過namedtuple建立類的引數包括類名稱和一個包含元素名稱的字串。
方法示例:
from collections import namedtuple
p = namedtuple("person", "name,age,sex")
print(type(p)) # <class 'type'>
zhanglin = p("zhanglin", 30, "male")
print(zhanglin) # person(name='zhanglin', age=30, sex='male')
print(zhanglin.name, zhanglin.age) # zhanglin 30
time模組
在Python中,與時間處理相關的模組有:time、datetime以及calendar。學會計算時間,對程式的調優非常重要,可以在程式中狂打時間戳,來具體判斷程式中哪一塊耗時最多,從而找到程式調優的重心處。
常用方法:1.time.sleep(secs)。推遲指定的時間執行,單位為秒。2.time.time()。獲取當前時間戳。
三種用於表示時間的格式(彼此之間可以轉換):
時間戳
距離1970年1月1日0時0分0秒至此相差的秒數。寫法:time.time()。
結構化時間
該時間型別主要是給計算機看的,人看起來不太方便。寫法:time.localtime()。
索引值(Index) | 屬性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | (例如:2015) |
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(星期幾) | 0 ~ 6(0 表示星期一) |
7 | tm_yday(一年中的第幾天) | 1 ~ 366 |
8 | tm_isdst(是否為夏令時) | 0, 1, -1(-1 代表夏令時)預設為0 |
值得注意的是,索引值為5的tm_sec(秒)的值得範圍是可以為0~61的。60 代表閏秒,61 是基於歷史原因保留。但是一般不會產生這種情況,瞭解一下就可以了。
格式化時間
人最容易接收的一種時間格式,比如:2000/1/21 or 11:11:11 寫法:time.strftime()
格式 | 含義 |
---|---|
%a | 本地(locale)簡化星期名稱 |
%A | 本地完整星期名稱 |
%b | 本地簡化月份名稱 |
%B | 本地完整月份名稱 |
%c | 本地相應的日期和時間表示 |
%d | 一個月中的第幾天(01 - 31) |
%H | 一天中的第幾個小時(24 小時制,00 - 23 |
%l | 一天中的第幾個小時(12 小時制,01 - 12) |
%j | 一年中的第幾天(001 - 366) |
%m | 月份(01 - 12) |
%M | 分鐘數(00 - 59) |
%p | 本地 am 或者 pm 的相應符 |
%S | 秒(01 - 61) |
%U | 一年中的星期數(00 - 53 星期天是一個星期的開始)第一個星期天之前的所有天數都放在第 0 周 |
%w | 一個星期中的第幾天(0 - 6,0 是星期天) |
%W | 和 %U 基本相同,不同的是 %W 以星期一為一個星期的開始 |
%x | 本地相應日期 |
%X | 本地相應時間 |
%y | 去掉世紀的年份(00 - 99) |
%Y | 完整的年份 |
%z | 用 +HHMM 或 -HHMM 表示距離格林威治的時區偏移(H 代表十進位制的小時數,M 代表十進位制的分鐘數) |
%Z | 時區的名字(如果不存在為空字元) |
%% | %號本身 |
時間型別的轉換
**時間格式轉換圖:
時間戳與結構化時間的轉換
# gmtime
# localtime
print(time.localtime(1648551245.638347)) # 將時間戳轉化為結構化時間
# time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=18, tm_min=54, tm_sec=5, tm_wday=1, tm_yday=88, tm_isdst=0)
# 使用gmtime結果一樣,效果相同的
結構化時間與格式化時間的轉換
import time
# strftime
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) # 將結構化時間轉化為格式化時間 2022-03-29 18:57:23
# strptime
print(time.strptime('2022-03-29 18:57:23', '%Y-%m-%d %X')) # 將格式化時間轉化為結構化時間
# time.struct_time(tm_year=2022, tm_mon=3, tm_mday=29, tm_hour=18, tm_min=57, tm_sec=23, tm_wday=1, tm_yday=88, tm_isdst=-1)
datetime模組
datetime 模組提供了各種類用於操作日期和時間,該模組側重於高效率的格式化輸出。
基本操作:
import datetime
print(datetime.date.today()) # 2022-03-29
print(datetime.datetime.today()) # 2022-03-29 19:01:35.054007
'''
date 意思就是年月日
datetime 意思就是年月日 時分秒
# 後期很多時間相關的操作都是跟date和time有關係
'''
res = datetime.date.today()
print(res.year) # 2022
print(res.month) # 3
print(res.day) # 29
print(res.weekday()) # 1 星期0-6
print(res.isoweekday()) # 2 星期1-7
ctime = datetime.datetime.today()
time_tel = datetime.timedelta(days=4) # 有很多時間選項
print(ctime) # 2022-03-29 19:06:12.752012
print(ctime + time_tel) # 2022-03-29 19:06:12.752012
print(ctime - time_tel) # 2022-03-29 19:06:12.752012
res = ctime + time_tel
print(res - ctime) # 4 days, 0:00:00
# 這是一個針對時間計算的公式:日期物件 = 日期物件 +/- timedelta物件
random模組
Python中的random模組用於生成隨機數。
random模組的功能
1.random.random()
用於生成一個0到1的隨機浮點數:0<= n < 1.0
import random
print(random.random()) # 0.6475660665971071 隨機產生
2.random.uniform(a,b)
用於生成一個指定範圍內的隨機符點數,兩個引數其中一個是上限,一個是下限。如果a > b,則生成的隨機數n: b <= n <= a。如果 a <b, 則 a <= n <= b。
import random
print(random.uniform(2, 4)) # 3.8782705354832148
3.random.randint(a, b)
用於生成一個指定範圍內的整數。其中引數a是下限,引數b是上限,生成的隨機數n: a <= n <= b
import random
print(random.randint(0,9)) # 5 隨機產生一個0到9之間的整數(包含0和9)
4.random.choice(sequence)
random.choice從序列中獲取一個隨機元素。其函式原型為:random.choice(sequence)。
import random
a = ['Jason', 'handsome', 'nb', '666']
print(random.choice(a)) # handsome 隨機抽取一個
5.random.sample(sequence, k)
從指定序列中隨機獲取指定長度的片斷並隨機排列。注意:sample函式不會修改原有序列。
import random
a = ['Jason', 'handsome', 'nb', '666']
print(random.sample(a, 3)) # ['handsome', '666', 'Jason'] 隨機指定個數抽樣