Python中5大模塊的使用教程(collections模塊、time時間模塊、random模塊、os模塊、sys模塊)

来源:https://www.cnblogs.com/xxpythonxx/archive/2022/11/30/16938836.html
-Advertisement-
Play Games

大家好,我是陶朱公Boy。 前言 上一篇文章《關於狀態機的技術選型,最後一個真心好》我跟大家聊了一下關於”狀態機“的話題。從眾多技術選型中我也推薦了一款阿裡開源的狀態機—“cola-statemachine”。 於是就有小伙伴私信我,自己項目也考慮引入這款狀態機,但網上資料實在太少,能不能系統的介紹 ...


1. 模塊的簡單認識

定義:

模塊就是我們把裝有特定功能的代碼進行歸類的結果.

從代碼編寫的單位來看我們的程式,從小到大的順序: 一條代碼 < 語句塊 < 代碼塊(函數,類) < 模塊.
我們⽬目前寫的所有的py文件都是模塊.
引入模塊的方式:

  • import 模塊
  • from xxx import 模塊

2. collections模塊

collections模塊主要封裝了一些關於集合類的相關操作. 比如, 我們學過的Iterable,Iterator等.
另外,collections還提供了一些除了基本據類型以外的數據集合類型.Counter,deque,OrderDict,defaultdict以及namedtuple

2.1 counter(counter主要用於計數)

實例1:

from collections import Counter
s = "i have a dream,do you konw ?"
dic = {}
for el in s:
    dic[el] = dic.setdefault(el,0) + 1
print(dic)

sum = Counter(s)
print(sum)
for el in sum:
    print(el,sum[el])
2.22. deque 雙向隊列.

(重點)說雙向隊列之前我們需要瞭解兩種數據結構. 1.棧, 2.隊列

  • 棧: FILO. 先進後出 -> 砌牆的磚頭, 老師傅做饅頭
  • 隊列: FIFO. 先進先出 -> 買火車票排隊, 所有排隊的場景

棧: python沒有給出Stack模塊.所以我寫了一個粗略版本(註意,此版本有嚴重的併發問題)

實例:

class StackFullError(Exception):
    pass
class StackEmptyError(Exception):
    pass

class Stack():
    def __init__(self,size):
        self.size = size
        self.lis = []
        self.index = 0
    def push(self,item):
        if self.index >= self.size:
            raise StackFullError("The Stack is full")
        self.lis.insert(self.index,item)
        self.index += 1
    def pop(self):
        if self.index == 0:
            raise StackEmptyError("The Stack is empty")
        self.index -= 1
        s = self.lis.pop()
        return s

隊列: python提供了queue模塊. 使用起來非常方便
實例:

import queue
q = queue.Queue()
q._put("王大錘")
q.put("王尼瑪")
print(q.get())
print(q.get())
print(q.get())   #若隊列裡面的元素取完了,會阻塞在這裡.直到有元素進來才會往前走"

deque:雙向隊列,屬於collections
實例:

from collections import deque
q = deque()
q.append("仙都醬板鴨")
q.append("久久丫")
q.appendleft("周黑鴨")
q.appendleft("絕味鴨脖")
print(q)
print(q.pop())
print(q.popleft())
print(q.popleft())
print(q.popleft())

2.3. namedtuple 命名元組

命名元組, 顧名思義. 給元組內的元素進行命名. 比如. 我們說(x, y) 這是一個元組.
同時. 我們還可以認為這是一個點坐標. 這時, 我們就可以使⽤namedtuple對元素進行命名.
實例

from collections import namedtuple
point = namedtuple("point1",["x","y"])
p = point(2,4)
print(p)

2.4. orderdict和defaultdict

orderdict:有序字典 在Python中基本不用了,因為其順序3.6以後的字典一樣的
defaultdict:預設值字典

from collections import defaultdict
lst= [11,22,33,44,55,66,77,88,99]
d = defaultdict(list)      #defaultdict(可被調用的對象)   括弧內必須為可被調用的對象
for el in lst:
    if el < 66:
        d["key1"].append(el) # key1預設是不存在的. 但是可以拿key1. 一個空列表.
    else:
        d["key2"].append(el)
print(d)

tip:如何讓預設返回值是字元串?? 用函數!!!!

from collections import defaultdict
def func():
    return "周黑鴨"
d = defaultdict(func)
print(d["哈哈"])
print(d)

3. time時間模塊

時間模塊是我們要熟記的.到後面寫程式的時候經常能用到.比如,如何計算時間差.如何按照客戶的要求展示時間

在python中時間分成三種表現形式:

  • 時間戳(timestamp). 時間戳使用的是從1970年01月01日 00點00分00秒到現在一共經過了多少秒...使用float來表示
  • 格式化時間(strftime). 這個時間可以根據我們的需要對時進行任意的格式化.
  • 結構化時間(struct_time).這個時間主要可以把時間進行分類劃分.
  • 比如.1970年01⽉01⽇ 00點00分00秒 這個時間可以被細分為年, 月, 日.....一大堆東⻄西.

獲取時間戳

import time
print(time.time())  # 1538927647.483177 系統時間 不能展示給客戶

格式化時間

import time
s = time.strftime("%Y-%m-%d %H:%M:%S")  # 必須記住
print(s)

日期格式化的標準:

%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 當前時區的名稱
%% %號本身

結構化時間:

print(time.localtime())

結果:

import time
time.struct_time(tm_year=2017, tm_mon=05, tm_mday=8, tm_hour=10, tm_min=24,
tm_sec=42, tm_wday=0, tm_yday=126, tm_isdst=0)

時間戳和格式化時間之間如何轉換??

從時間戳 -> 格式化時間

import time
t = time.localtime(1542513992) # 時區   gmtime() 格林尼治時間. 根據不同時區時間local或qm
print(t)
str_time = time.strftime("%Y-%m-%d %H:%M:%S", t)   #時間戳轉為格式化時間
print(str_time)

用戶輸入一個時間. 變成時間戳

  • 格式化時間 -> 時間戳
  • 格式化時間->結構化時間
import time
2018-11-18 12:06:32
s = "2018-11-18 12:06:32"
t = time.strptime(s, "%Y-%m-%d %H:%M:%S") # 結構化時間 string parse time
print(t)
# 結構化時間 -> 時間戳
ss = time.mktime(t)
print(ss)

那有如何計算時間差呢?

begin = "2018-11-14 16:30:00"
end = "2018-11-14 18:00:00"   # 時間差  1小時30分
# 格式化時間->結構化時間
begin_struct_time = time.strptime(begin, "%Y-%m-%d %H:%M:%S")
end_stract_time = time.strptime(end, "%Y-%m-%d %H:%M:%S")
#結構化時間->時間戳
begin_second = time.mktime(begin_struct_time)
end_second = time.mktime(end_stract_time)

# 秒級的時間差   180000
#用時間戳計算出時間差(秒)
diff_time_sec = abs(begin_second - end_second)

# 轉換成分鐘
diff_min = int(diff_time_sec//60)
print(diff_min)

diff_hour = diff_min//60  # 1
diff_min_1 = diff_min % 60 # 30
# 變成想要的時間格式
print("時間差是 %s小時%s分鐘" % (diff_hour, diff_min_1))

tips:格式化時間和時間戳之間的轉化和時間差的計算很重要,一定要會寫!!!

4. random模塊

所有關於隨機相關的內容都在random模塊中.

import random
print(random.random())        #隨機生成小數
print(random.randint(1,4))         #隨機生成範圍內的整數
print(random.uniform(1,10))           #隨機生成範圍內的小數
print(random.randrange(1,10,2))    #隨機生成範圍內的根據步長取值的整數
print(random.choice([1, 10, 2,"嘿嘿"]))  # 隨機取[]內的值
print(random.sample([1, 10, 2,"嘿嘿"],3))  #隨機抽取列表內元素進行隨機組合,組合個數根據後面填的值決定
lst = [1, 2, 3, 4, 5, 6, 7, 8]
random.shuffle(lst)                      # 隨機打亂順序
print(lst)

5. os模塊

os:

os.makedirs('dirname1/dirname5') # 創建文件夾目錄結構
os.removedirs('dirname1/dirname5')  # 刪除文件夾, 如果文件夾內沒有東西。 就可以刪除。 否則報錯

os.mkdir('dirname/哈哈')  # mkdir如果父級目錄不存在。 報錯
os.rmdir('dirname') # 刪除文件夾

print(os.listdir('../')) # 獲取到文件夾內的所有內容. 遞歸

print(os.stat('dirname')) # linux

os.system("dir") # 直接執行命令行程式
s = os.popen("dir").read()
print(s)
# python學習交流群:711312441
print(os.getcwd() ) # 當前程式所在的文件夾

os.path:

print(os.path.abspath("../day020 繼承") ) # 獲取絕對路徑
print(os.path.split("D:\python_workspace\day020 繼承")) # 拆分路徑 ('D:\\python_workspace', 'day020 繼承')
print(os.path.dirname("D:\python_workspace\day020 繼承")) # D:\python_workspace
print(os.path.basename("D:\python_workspace\day020 繼承")) # day020 繼承

print(os.path.exists("dirname")) # 判斷文件是否存在
print(os.path.isabs("D:\python_workspace\day020 繼承")) # 是否是絕對路徑
print(os.path.isfile("01 今日主要內容")) # 是否是文件
print(os.path.isdir("dirname")) # 是否是文件夾
print(os.path.getsize("01 今日主要內容") ) # 文件大小

特殊屬性:

os.sep 輸出操作系統特定的路路徑分隔符,win下為"\\",Linux下為"/"
          print("c:"+os.sep+"胡辣湯") # \\/  文件路徑的分隔符
os.linesep 輸出當前平臺使⽤用的行終止符,win下為"\r\n",Linux下為"\n"
os.pathsep 輸出⽤於分割⽂文件路徑的字元串串 win下為;   Linux下為 :
os.name 輸出字元串串指示當前使⽤用平臺。win->'nt'; Linux->'posix'

os.stat() 屬性解讀:
# stat 結構:
st_mode: inode 保護模式
st_ino: inode 節點號。
st_dev: inode 駐留的設備。
st_nlink: inode 的鏈接數。
st_uid: 所有者的⽤用戶ID。
st_gid: 所有者的組ID。
st_size: 普通⽂文件以位元組為單位的大小;包含等待某些特殊文件的數據。
st_atime: 上次訪問的時間。
st_mtime: 最後⼀次修改的時間。
st_ctime: 由操作系統報告的"ctime"。在某些系統上(如Unix)是最新的元數據更更改的時間,
           在其它系統上(如Windows)是創建時間(詳細信息參見平臺的⽂文檔)。

6. sys模塊

所有和python解釋器相關的都在sys模塊.

  • sys.argv 命令行參數List,第一個元素是程式本身路徑
  • sys.exit(n) 退出程式,正常退出時exit(0),錯誤退出sys.exit(1)
  • sys.version 獲取Python解釋程式的版本信息
  • sys.path 返回模塊的搜索路徑,初始化時使⽤PYTHONPATH環境變數的值
  • sys.platform 返回操作系統平臺名稱

tips:os 和 sys中比較重要的兩個模塊用法

  • os.sep 文件路徑分隔符
  • sys.path python查找模塊的路徑

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如何解決其中的可見性和有序性導致的問題,這也就引出來了今天的主角——Java 記憶體模型。 一、什麼是 Java 記憶體模型? 導致可見性的原因是緩存,導致有序性的原因是編譯優化,那解決可見性、有序性最直接的辦法就是禁用緩存和編譯優化,但這樣雖然解決了問題,但也導致帶來的性能優化都沒了。 因此,解決方案 ...
  • 背景 我們的springboot應用程式的持久層,是用jeecgboot框架生成的代碼。mybatisplus版本是3.1.2。 在一次對當前程式的sql性能優化時,我重寫了BaseMapper的selectPage方法。其中,為Wrapper<T>參數加上了id限制,以提高sql執行性能。 imp ...
  • 一.小結 1.不可變對象一旦創建,就不能改變。為防止用戶修改對象,可以定義不可變類。 2.實例變數和靜態變數的作用域是整個類,與變數在何處聲明無關。實例變數和靜態變數可以在類中的任意位置聲明。為保持一致,最好在類的起始位置聲明它們。 3.關鍵字this可用於表明調用對象。關鍵字this也可以用在構造 ...
  • 序言 各位好啊,我是會編程的蝸牛,作為java開發者,我們每天都要和開發工具打交道。我以前一開始入門java開發的時候,就是用的eclipse,雖然感覺有點繁瑣,但好在還能用。後來偶然間發現了IDEA,然後就漸漸被IDEA所吸引了,不過最近在做一些老項目的開發,大概是十幾年的那種技術,我發現用IDE ...
  • 前言 本文是博主從事後端開發以來,對公司、個人項目的經驗總結,包含代碼編寫、功能推薦、第三方庫使用及優雅配置等,希望大家看到都能有所收穫 博主github地址: https://github.com/wayn111 一. 優雅的進行線程池異常處理 在Java開發中,線程池的使用必不可少,使用無返回值 ...
  • 重構項目目錄 celery_task: logs:項目運行時/開發時日誌目錄包 luffapi:項目同名文件夾 apps:項目所有應用的集合文件夾 libs:第三方類庫的保存目錄[第三方組件、模塊] - 包 media:用戶提交的文件目錄文件夾 settings:配置目錄,包含開發時的配置文件和上線 ...
  • 話說在前面,我不是小黑子~ 我是超級大黑子😏 表弟大周末的跑來我家,沒事幹天天騷擾我,搞得我都不能跟小姐姐好好聊天了,於是為了打發表弟,我決定用Python做一個小游戲來消耗一下他的精力,我思來想去,決定把他變成小黑子,於是做了一個坤坤打籃球的游戲,沒想到他還挺愛玩的~ 終於解放了,於是我把游戲寫 ...
  • 使用腳本自動跑實驗(Ubuntu),將實驗結果記錄在文件中,併在實驗結束之後將結果通過郵件發送到郵箱,最後在windows端自動解析成excel表格。 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...