1. 程式人生 > 其它 >今日學習內容總結2.0

今日學習內容總結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']  隨機指定個數抽樣

今日作業