常⽤用模塊-01

来源:https://www.cnblogs.com/presleyren/archive/2018/10/08/9757121.html
-Advertisement-
Play Games

主要內容:1. 模塊的簡單認識2. collections模塊3. time時間模塊4. random模塊5. os模塊6. sys模塊 一. 模塊的簡單認識什麽是模塊. 模塊就是我們把裝有特定功能的代碼進行歸類的結果. 從代碼編寫的單位來看我們的程式, 從小到大的順序: 一條代碼 < 語句句塊 < ...


主要內容:
1. 模塊的簡單認識
2. collections模塊
3. time時間模塊
4. random模塊
5. os模塊
6. sys模塊

一. 模塊的簡單認識
什麽是模塊. 模塊就是我們把裝有特定功能的代碼進行歸類的結果. 從代碼編寫的單位
來看我們的程式, 從小到大的順序: 一條代碼 < 語句句塊 < 代碼塊(函數, 類) < 模塊. 我們目前寫
的所有的py文件都是模塊.

  引入模塊的⽅方式:
    1. import 模塊
    2. from xxx import 模塊

☆ 對於模塊方面,可以自己安裝和插入第三方模塊

二. collections模塊:
  collections模塊主要封裝了了⼀一些關於集合類的相關操作. 比如, Iterable, Iterator等等. 除了了這些以外, collections還提供了了⼀一些除了了基本數據類型以外的數據集合類
    型. Counter, deque, OrderDict, defaultdict以及namedtuple
1. Counter
counter是⼀一個計數器. 主要⽤用來計數
計算⼀一個字元串串中每個字元出現的次數:

# 計算字元串中每個字元出現的次數
s = "abcdefadsfasfasdfbadsfasdbfdasfdas" # 可迭代
dic = {}
for c in s:
    dic[c] = dic.get(c, 0) + 1
print(dic)


from collections import Counter # 引入模塊, 計數器
c = Counter(s)  # 創來和字典差不多
print(c)

  

2. deque 雙向隊列.
※說雙向隊列之前我們需要了解兩種數據結構:     1. 棧, 2. 隊列

1. 棧: FILO. 先進後出 -> 砌牆的磚頭, 老師傅做饅頭
2. 隊列列: FIFO. 先進先出 -> 買火⻋車票排隊, 所有排隊的場景
由於python沒有給出Stack模塊. 所以我們⾃自⼰己⼿手動寫⼀一個粗略版本(註意, 此版本有嚴重的併發問題)

# 裝饅頭的桶
# 1. 入棧
# 2. 出棧
# 屬性:   1. 列表(容器) 2.大小(size) 3. 棧頂指針(下一個裝元素的位置)
class StackFullError(Exception):
    pass
class StackEmptyError(Exception):
    pass
class Stack:
    def __init__(self, size):
        self.index = 0  #  棧頂指針
        self.size = size
        self.lst = []  # 容器

    def push(self, el):
        if self.index < self.size:  #  還沒有裝滿
            self.lst.insert(self.index, el)
            self.index += 1
        else:   # 裝滿了
            raise StackFullError("the stack is full!")

    def pop(self):
        if self.index > 0:
            self.index -= 1
            return self.lst[self.index]
        else:
            raise StackEmptyError("the stack is empty!")

  def clear(self):
    self.lst.clear()
    self.index = 0
  def __sizeof__(self):
    return len(self.lst)
  def max(self):
    return self.size
  def now(self):
    return self.index

# 使用
# 1.實例化棧
s = Stack(5)
s.push("饅頭1")
print(s.pop())
s.push("饅頭2")
print(s.pop())
s.push("饅頭3")
print(s.pop())
s.push("饅頭4")
print(s.pop())
s.push("饅頭5")
print(s.pop())
s.push("饅頭6")
print(s.pop())

  


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

import queue
q = queue.Queue()
q.put("李李嘉誠")
q.put("張開")
q.put("張毅")
print(q)
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()) # 左側刪除

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

from collections import namedtuple
# 自己定義了了一個元組, 如果靈性夠好, 這其實就是創建了一個類 nt = namedtuple("point", ["x", "y"]) p = nt(1, 2) print(p)
print(p.x) print(p.y)

 

4. orderdict 和 defaultdict
  orderdict 顧名思義. 字典的key預設是無序的. 而OrderedDict是有序的

dic = {'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'}
print(dic)
from collections import OrderedDict od = OrderedDict({'a':'娃哈哈', 'b':'薯條', 'c':'胡辣湯'}) print(od)

◎defaultdict: 可以給字典設置預設值. 當key不存在時. 直接獲取預設值:from collections import defaultdict

dd = defaultdict(list) # 預設值list
print(dd['娃哈哈'])     # [] 當key不不存在的時候. 會自動執行行構造方法中傳遞的內容.
# 11 22 33 44 55 66 77 88 99
lst = [11, 22, 33, 44, 55, 66, 77, 88, 99]
dic = {}
for el in lst:
  if el > 66:
    dic.setdefault("key1", []).append(el)
  else:
       dic.setdefault("key2", []).append(el)
print(dic)
lst = [11, 22, 33, 44, 55, 66, 77, 88, 99]
dd = defaultdict(list)
for el in lst:
   if el > 66:
       dd['key1'].append(el)
   else:
       dd['key2'].append(el)
print(dd)

  

  

三. time 時間模塊(重點)
   時間模塊是我們寫程式的時候經常能用到. 比如, 如何計算時間差. 如何按照客戶的要求展⽰示時間. 等等.

import time
print(time.time()) # 1538927647.483177 時間戳(系統時間) 

  此時, 我們已經獲取到了了系統時間, 但是這個時間....看不懂. 怎麼辦呢. 需要對時間進
    行格式化. 那這樣就引出了了另⼀一種時間的格式. 在python中時間分成三種表現形式:

1. 時間戳(timestamp). 時間戳使用的是從1970年01月01日 00點00分00秒到現在一共經過了多少秒... 使用float來表示
2. 格式化時間(strftime). 這個時間可以根據我們的需要對時間進行任意的格式化.

3. 結構化時間(struct_time). 這個時間主要可以把時間進行分類劃分. 比如. 1970年01月01日 00點00分00秒 這個時間可以被細分為年, 月, 日.....一大堆東西.
時間戳我們已經見過了 就是time.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())
結果:
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)

  


  好了. 先在看到的都是當前系統時間, 那如果碰到時間轉換呢? 比如. 我們的資料庫中存
儲了這樣一個時間: 1888888888. 如何顯示成xxxx年xx月xx日. 那時間的轉化必須要記住: 所
有的轉化都要通過結構化時間來轉化.

t = time.localtime(1888888888) # 結構化時間
s = time.strftime("%Y-%m-%d %H:%M:%S", t) # 格式化這個時間 f:format 格式化
print(s)

 

  那如果說, 我讓用戶輸入一個時間, 怎麼把它轉化成我們資料庫存儲的時間戳呢? 還是要用到結構化時間:

s = "2020-10-01 12:18:12"
t = time.strptime(s, "%Y-%m-%d %H:%M:%S") # 轉化成結構時間 p:parse 轉換
print(time.mktime(t)) # 轉換成時間戳

 

計算時間差:

import time
true_time = time.mktime( time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
time_now = time.mktime( time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
dif_time = time_now-true_time
struct_time = time.localtime(dif_time)
print(struct_time)
print('過去了%d年%d月%d天%d小時%d分鐘%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
struct_time.tm_mday-1,struct_time.tm_hour, struct_time.tm_min,struct_time.tm_sec))

  

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

import random
print(random.random())          # 0-1⼩小數
print(random.uniform(3, 10))    # 3-10⼩小數
print(random.randint(1, 10)) # 1-10整數 [1, 10] print(random.randrange(1, 10, 2)) # 1-10奇數 [1,10)
print(random.choice([1, '周傑倫', ["蓋倫", "胡辣湯"]])) # 1或者2 3或者[4,5]) print(random.sample([1, '23', [4, 5]], 2)) # 列表元素任意2個組合
lst = [1, 2, 3, 4, 5, 6, 7, 8] random.shuffle(lst) # 隨機打亂順序 print(lst)

 

五. os模塊
  所有和操作系統相關的內容都在os模塊

os.makedirs('dirname1/dirname2') 可生成多層遞歸目錄
os.removedirs('dirname1') 若目錄為空,則刪除,並遞歸到上一級目錄,如若也為空,則刪除,依此類推
os.mkdir('dirname') 生成單級目錄;相當於shell中mkdir dirname os.rmdir('dirname') 刪除單級空目錄,若目錄不為空則無法刪除,報錯;相當於shell中 rmdir dirname os.listdir('dirname') 列出指定目錄下的所有文件和子目錄,包括隱藏文件,並以列列表方式列印 os.remove() 刪除一個文件 os.rename("oldname","newname") 重命名文件/目錄 os.stat('path/filename') 獲取文件/目錄信息 os.system("bash command") 運行shell命令,直接顯示 os.popen("bash command).read() 運行shell命令,獲取執行結果 os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 os.chdir("dirname") 改變當前腳本工作目錄;相當於shell下cd
# os.path os.path.abspath(path) 返回path規範化的絕對路徑 os.path.split(path) 將path分割成目錄和文件名二元組返回 os.path.dirname(path) 返回path的目錄。其實就是os.path.split(path)的第一個元素 os.path.basename(path) 返回path最後的⽂文件名。如何path以/或\結尾,那麼就會返回空值。 即os.path.split(path)的第二個元素
os.path.exists(path) 如果path存在,返回True;如果path不不存在,返回False os.path.isabs(path) 如果path是絕對路路徑,返回True os.path.isfile(path) 如果path是一個存在的文件,返回True。否則返回False os.path.isdir(path) 如果path是一個存在的目錄,則返回True。否則返回False os.path.join(path1[, path2[, ...]]) 將多個路路徑組合後返回,第一個絕對路路徑之前的參數將被忽略 os.path.getatime(path) 返回path所指向的文件或者目錄的最後訪問時間 os.path.getmtime(path) 返回path所指向的文件或者目錄的最後修改時間 os.path.getsize(path) 返回path的大小
# 特殊屬性: os.sep 輸出操作系統特定的路徑分隔符,win下為"\\",Linux下為"/" 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)是創建時間(詳細信息參見平臺的文檔)。

  


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

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

  


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

-Advertisement-
Play Games
更多相關文章
  • socket API 調用後的錯誤判斷 perror errno 調用完socket API後,需要判斷調用是否成功與失敗。如果失敗,會自動設置errno(是個整數), 並且用perror可以列印出具體的錯誤信息。 註意點: 1,如果有多個socket API調用失敗,errno存放的是最後一個失敗 ...
  • 在考慮一個結果的概率時候,要考慮眾多的屬性,貝葉斯演算法利用所有可能的數據來進行修正預測,如果大量的特征產生的影響較小,放在一起,組合的影響較大,適合於朴素貝葉斯分類 導入類庫 代碼 ...
  •  上次接手一個項目需要整合公眾號、小程式以及APP的用戶,查閱了微信文檔以及一些作者的文章,中間踩了不少坑,在此記錄一下解決的流程。 要點  實現統一信息的有以下幾點:  1. 在微信開放平臺綁定需要統一信息的應用;  2. 公眾號採用以snsapi_user ...
  • 二叉樹的深度: 輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 思路: 1.非遞歸層序遍歷 2.使用輔助隊列,根結點先入隊列 3. 迴圈判斷隊列是否為空,如果不為空就繼續迴圈隊列裡面的每個結點 4. 迴圈隊列時,當前當前結點出... ...
  • 題目 一直沒有頭緒的一道題 明明只有普及-難度 看了看題解用的大多是方程和Fibonacci 於是更加懵逼了。。。 今天立志AC此題 結果用大模擬還真過了 說一下思路 然而並沒有思路 按照題意敲代碼 不妨設第二站上下車了k人 分別統計每一站a和k的繫數 1、2、n站特殊處理 然後求出k,代入x站中輸 ...
  • Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-f8IeEI/MYSQL-python/錯誤無法安裝python第三方庫需要安裝libmysqlclient-devapt-get inst... ...
  • 內容 本文對JDK1.7下使用segmentShift和segmentMask求解ConcurrentHashMap鍵值對在Segment[]中的下標值進行了探究和論證。 適合人群 ​ Java進階 說明 轉載請註明出處,尊重筆者的勞動成果。 推薦閱讀 探究HashMap線性不安全(二)——鏈表成環 ...
  • 題意 "題目鏈接" Sol 只要知道“迴文連續子串”就能做了吧。。 想要滿足這個條件,肯定是不能出現$aa$或$aba$這種情況 如果沒有$S$的限制,答案為$K (K 1) \prod_{i = 3}^n (k 2)$ 如果有$S$的限制就除一個$K$ 然而考場上沒註意到會乘爆long long於 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...