Python學習過程筆記:主模塊(main) 異常處理 命令行參數解析 日志記錄 socket模塊 類的私有方法 字節字符串

文章目錄

    • 1.Python中的主程序
    • 2.Python中的異常處理
    • 3.Python中的命令行參數解析
    • 4.Python中的日志記錄
    • 5.網絡編程socket模塊
    • 6.Python中的私有方法
    • 7.Python中的字節字符串

1.Python中的主程序

if __name__ == '__main__'

在Python中,if __name__ == '__main__' 是一個常見的代碼塊。它的作用是判斷當前模塊是否作為主程序直接運行,還是作為模塊被其他程序導入使用。

當一個 Python 腳本被直接執行時,其 __name__ 屬性的值會被設置為 '__main__'。而當該腳本被作為模塊導入時,__name__ 的值將是模塊的名稱。

因此,通過使用 if __name__ == '__main__' 條件判斷,我們可以將一些代碼片段放在這個條件塊內,這些代碼只有在該腳本作為主程序執行時才會被執行,而在作為模塊被導入時不會執行。

這種用法通常用于將某些測試代碼或者執行特定任務的代碼放在主程序中,而不會在模塊導入時自動執行。這樣做可以使模塊更加靈活和可重用。

2.Python中的異常處理

在 Python 中,try 塊用于捕獲可能引發異常的代碼。其語法結構如下:

try:# 可能引發異常的代碼
except ExceptionType1:# 處理 ExceptionType1 類型的異常
except ExceptionType2:# 處理 ExceptionType2 類型的異常
else:# 當沒有異常發生時執行的代碼
finally:# 無論是否發生異常都會執行的代碼
  • try模塊try 塊中包含的代碼是可能會引發異常的部分。如果在 try 塊中的代碼引發了異常,Python 將跳過剩余的 try 塊代碼,并找到與引發的異常類型匹配的 except 塊來處理異常。
  • except部分except 塊可以有零個或多個,用于處理特定類型的異常。可以指定異常類型,如
    ExceptionType1ExceptionType2 等,也可以使用通用的 Exception 來捕獲所有異常。當引發的異常類型與某個 except 塊指定的異常類型匹配時,該 except 塊中的代碼將被執行。
  • else部分else 塊是可選的,它包含的代碼將在 try 塊中的代碼沒有引發任何異常時執行。通常在 else塊中可以放置處理沒有異常發生時的邏輯。
  • finally塊finally 塊也是可選的,它包含的代碼無論是否發生異常都會被執行。通常在 finally 塊中放置一些清理資源的代碼,例如關閉打開的文件或釋放其他資源。

注意事項except 塊至少需要一個,而 else 塊和 finally 塊都是可選的。try 塊和至少一個 except 塊是最基本的語法結構,用于捕獲和處理異常。

3.Python中的命令行參數解析

argparse 是 Python 標準庫中的一個模塊,用于解析命令行參數和生成用戶友好的命令行界面。其中,ArgumentParserargparse 模塊中的一個重要類。

ArgumentParser 類是用來定義命令行參數的解析規則,它提供了一種簡單而靈活的方式來處理命令行參數。通過創建一個 ArgumentParser 對象,你可以定義程序所需的參數,并編寫代碼來處理這些參數。

下面是 ArgumentParser 類的一些常用方法:

 ArgumentParser(prog=None, description=None, epilog=None)
  • 創建一個 ArgumentParser 對象。prog 參數用于指定程序的名稱(默認為 sys.argv[0]),description 參數用于添加程序的描述信息,epilog 參數用于添加程序的結尾信息。一般情況下可以不加參數地進行創建。
.add_argument(name or flags, action, nargs, const, default, type, choices, required, help, metavar)

定義一個命令行參數。這個方法有很多參數,其中一些常用的包括:

  • name or flags:參數的名稱或者選項標志。
  • action:參數的動作,默認為存儲參數值。一般情況下無需設置這個參數。
  • nargs:參數的個數,可以是固定值或者可變數量。其中nargs='?' 表示參數可以有零個或一個值。
  • const:某些動作(如 store_const)時使用的常量值。
  • default:參數的默認值。
  • type:參數的類型。
  • choices:參數值的限定范圍。
  • required:參數是否是必需的。
  • help:參數的幫助信息。
  • metavar:參數在幫助信息中顯示的名稱。
.parse_args(args=None, namespace=None)

解析命令行參數,并返回一個命名空間對象,其中包含參數的值。args 參數是一個字符串列表,用于指定要解析的命令行參數。如果不提供 args 參數,則默認使用 sys.argv[1:]。namespace 參數用于指定命名空間對象,如果不提供,則會創建一個新的命名空間對象。

4.Python中的日志記錄

Python 的 logging 模塊是一個用于記錄日志的強大工具,它提供了靈活的日志記錄功能,可以幫助你在應用程序中捕獲、記錄和管理各種類型的日志信息。

下面是 logging 模塊的一些核心組件和概念:

  • LoggerLoggerlogging 模塊最主要的組件之一。它提供了記錄日志消息的方法,如 debug()info()warning()error()critical()。你可以創建多個 Logger 實例,用于不同的日志記錄需求。
  • HandlerHandler 用于確定日志記錄的目的地,例如控制臺、文件或網絡。logging 模塊提供了多種類型的 Handler,如 StreamHandlerFileHandlerRotatingFileHandlerTimedRotatingFileHandler 等。
  • FormatterFormatter 確定日志消息的輸出格式。你可以定義自定義的格式,包括日期、時間、日志級別、日志信息等。
  • FilterFilter 用于過濾和選擇要記錄的日志消息。通過應用過濾器,你可以決定哪些日志消息應該被記錄下來,哪些應該被忽略。
  • Logger.setLevel():通過調用 setLevel() 方法,你可以設置日志記錄的最低級別。只有達到該級別或更高級別的日志消息才會被記錄。
  • Logger.addHandler():使用 addHandler() 方法,你可以將一個或多個處理程序(Handler)添加到日志記錄器(Logger)中。這樣,日志消息將被傳遞給這些處理程序進行處理。

使用 logging 模塊記錄日志的基本步驟如下:

  • 導入 logging 模塊。
  • 創建一個 Logger 實例。
  • 創建一個或多個 Handler 實例,并設置它們的級別和格式。
  • Handler 添加到 Logger 中。
  • 使用 Logger 的記錄方法記錄日志消息。

下面是一個簡單的示例,演示了如何使用 logging 模塊記錄日志:

import logging# 創建 Logger 實例
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)# 創建文件處理程序
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.INFO)# 創建控制臺處理程序
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)# 創建 Formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')# 將 Formatter 應用于處理程序
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)# 將處理程序添加到 Logger
logger.addHandler(file_handler)
logger.addHandler(console_handler)# 記錄日志消息
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')

在上面的示例中,我們創建了一個名為 my_loggerLogger 實例,并設置其級別為 DEBUG。然后,我們創建了一個文件處理程序和一個控制臺處理程序,并為它們設置了級別和格式。最后,我們將這兩個處理程序添加到 Logger 中,并使用 Logger 的記錄方法記錄了不同級別的日志消息。

logging 模塊中,日志級別是通過整數值來表示的,具有以下預定義的級別(按照從低到高的順序排列):

  • DEBUG:用于詳細的調試信息。
  • INFO:用于提供程序的運行信息。
  • WARNING:用于表示可能的問題,但不會影響程序的正常運行。
  • ERROR:用于表示錯誤情況,但程序仍能繼續運行。
  • CRITICAL:用于表示嚴重的錯誤,可能導致程序無法繼續運行。

這些級別的整數值分別是 10、20、30、40 和 50。級別值越低,表示的日志級別越低;級別值越高,表示的日志級別越高。

當設置 LoggerHandler 的級別時,只有達到該級別或更高級別的日志消息才會被記錄。例如,如果將 Logger 的級別設置為 WARNING,那么 WARNINGERRORCRITICAL 級別的日志消息將被記錄,而 DEBUGINFO 級別的日志消息將被忽略。

此外,logging 模塊還提供了一個特殊的級別 NOTSET,其整數值為 0。如果將 LoggerHandler 的級別設置為 NOTSET,它將使用其父級別的級別。如果沒有父級別,則默認級別為 WARNING

5.網絡編程socket模塊

當涉及到網絡編程時,Python中的socket模塊是一個重要的工具。它允許你創建套接字對象來實現網絡通信。

以下是對socket模塊的簡單介紹:

  • 套接字:套接字(Socket)是網絡通信的基本組件,用于在不同主機之間傳輸數據。socket()函數用于創建套接字對象。需要指定地址族(如AF_INET表示IPv4)和套接字類型(如SOCK_STREAM表示TCP套接字)。一旦創建了套接字對象,可以使用bind()方法將套接字綁定到特定的地址和端口上。
  • 偵聽:通過使用listen()方法,可以開始偵聽傳入的連接請求。
  • 接收連接:服務器可以使用accept()方法接受客戶端的連接請求,并創建一個新的套接字對象來處理與客戶端的通信。一旦建立連接,可以使用套接字對象的send()方法發送數據,使用recv()方法接收數據。

以下是一個簡單的示例,展示了如何使用socket模塊創建一個簡單的TCP服務器:

import socket# 創建套接字對象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 綁定地址和端口
server_address = ('localhost', 8888)
server_socket.bind(server_address)# 監聽連接
server_socket.listen(1)
print('服務器正在監聽端口 8888...')# 接受連接并處理請求
while True:client_socket, client_address = server_socket.accept()print('接受來自', client_address, '的連接')# 接收數據data = client_socket.recv(1024)print('接收到的數據:', data.decode())# 發送響應response = 'Hello, client!'client_socket.send(response.encode())# 關閉連接client_socket.close()

在上面的示例中,我們創建了一個TCP服務器,綁定到本地主機的端口8888。服務器開始監聽連接,并在接受連接后接收客戶端發送的數據,并發送響應。

另外,當需要獲取當前主機的主機名用于在bind函數中綁定套接字時,可以使用socket.gethostname() 函數。該函數通過查詢操作系統來獲取主機名。它返回一個字符串,表示當前主機的主機名。

下面將辨析一下socket模塊中的send方法和sendall方法:

在Python的socket模塊中,send()函數和sendall()函數都用于發送數據到已連接的套接字,但它們在處理數據的方式上有一些區別。

  • send方法send()函數用于發送數據塊。它將盡可能多地發送指定的數據,并返回實際發送的字節數。如果send()無法立即發送所有數據(例如,套接字的發送緩沖區已滿),它可能只發送部分數據。在這種情況下,你可以再次調用send()來發送剩余的數據。
  • sendall方法sendall()函數也用于發送數據塊,但它會盡力發送所有指定的數據。它會持續發送數據,直到所有數據都被發送成功,或者發生錯誤。如果在發送過程中發生錯誤,sendall()函數將引發異常。因此,它可以保證在發送所有數據之前不會返回。

選擇使用哪個函數取決于需求。如果希望在發送數據時能夠了解實際發送的字節數,或者需要手動處理發送剩余的數據,那么可以使用send()函數。如果希望確保所有數據都被完整地發送并且不想手動處理發送錯誤,那么可以使用sendall()函數。

6.Python中的私有方法

在Python中,沒有嚴格意義上的私有方法。然而,約定上使用雙下劃線(__)作為方法名的前綴,可以將方法標識為類的內部使用,即表示它們是私有方法。

當方法名以雙下劃線開頭時,Python解釋器會自動對方法名進行名稱修飾(name mangling),將其轉換為_ClassName__method的形式。這樣做是為了防止在子類中意外地覆蓋父類的方法。

7.Python中的字節字符串

在Python中,有兩種主要的字符串類型:字符串(str)和字節字符串(bytes)。

  • 字符串:字符串(str)是由Unicode字符組成的序列,用于表示文本數據。字符串在Python中是不可變的,可以使用單引號或雙引號括起來,例如 ‘Hello’ 或 “World”。
  • 字節字符串:字節字符串(bytes)是由字節組成的序列,用于表示二進制數據。字節字符串在Python中也是不可變的,以b開頭,可以使用單引號或雙引號括起來,例如 b'\x48\x65\x6c\x6c\x6f'

在處理文本數據時,通常使用字符串(str)類型。而在處理二進制數據(例如文件讀寫、網絡傳輸等)時,使用字節字符串(bytes)類型更為常見。

在進行網絡傳輸時,往往使用字節字符串而不是字符串的原因有幾個:

  • 網絡傳輸的基本單位是字節:計算機網絡是以字節為單位進行數據傳輸的。無論是在互聯網上還是在本地網絡中,數據都是以二進制形式通過網絡傳輸的。因此,將數據編碼為字節字符串可以更直接地映射到網絡傳輸的實際數據。
  • 二進制數據的表達和傳輸效率更高:在網絡傳輸中,往往需要處理各種類型的數據,包括文本、圖像、音頻、視頻等。這些數據通常以二進制形式表示,并且使用特定的編碼方案進行傳輸。使用字節字符串可以更有效地表示和處理這些二進制數據,而不會引入額外的轉換和處理開銷。
  • 字符編碼和字符集的一致性問題:在跨越不同計算機系統、操作系統和國家地區的網絡傳輸中,字符編碼和字符集的一致性問題是一個重要考慮因素。字符串在不同的編碼方案下可能會有不同的表示形式,而字節字符串則是直接的二進制數據表示形式。通過使用字節字符串,可以避免字符編碼和字符集之間的不一致性問題,從而減少數據傳輸中的潛在錯誤和混淆。
  • 兼容性和互操作性:字節字符串是一種通用的數據表示形式,幾乎可以在任何編程語言和平臺上使用。它們具有更廣泛的兼容性和互操作性,能夠無縫地與各種網絡協議和數據傳輸庫進行集成。

在Python中,encode() 是字符串對象的方法,用于將字符串編碼為字節字符串。它接受一個參數,即指定要使用的字符編碼方案。

下面是 encode() 方法的基本語法:

encoded_bytes = string.encode(encoding)

其中:

  • string 是要編碼的字符串。
  • encoding 是一個字符串,指定要使用的字符編碼方案。常見的字符編碼方案包括 UTF-8、ASCII、Latin-1 等。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36254.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百日筑基篇——python爬蟲學習(一)

百日筑基篇——python爬蟲學習(一) 文章目錄 前言一、python爬蟲介紹二、URL管理器三、所需基礎模塊的介紹1. requests2. BeautifulSoup1. HTML介紹2. 網頁解析器 四、實操1. 代碼展示2. 代碼解釋1. 將大文件劃分為小的文件(根據AA的ID數量劃…

簡單認識Zabbix監控系統及配置

文章目錄 一、zabbix概述1、定義2、zabbix監控原理3、監控對象4、zabbix的3種架構(1) C/S架構(2)分布式架構:zabbix-proxy-client架構(3) master-node-client架構 5、zabbix監控模式 二、部署za…

項目實戰 — 消息隊列(8){網絡通信設計①}

目錄 一、自定義應用層協議 🍅 1、格式定義 🍅 2、準備工作 🎄定義請求和響應 🎄 定義BasicArguments 🎄 定義BasicReturns 🍅 2、創建參數類 🎄 交換機 🎄 隊列 &#x1f38…

【網絡】傳輸層——TCP(滑動窗口流量控制擁塞控制延遲應答捎帶應答)

🐱作者:一只大喵咪1201 🐱專欄:《網絡》 🔥格言:你只管努力,剩下的交給時間! 上篇文章對TCP可靠性機制講解了一部分,這篇文章接著繼續講解。 🎨滑動窗口 在…

Springboot 實踐(2)MyEclipse2019創建項目修改pom文件,加載springboot 及swagger-ui jar包

MyEclipse2019創建工程之后,需要添加Springboot啟動函數、添加application.yml配置文件、修改pom文件添加項目使用的jar包。 添加Springboot啟動函數 創建文件存儲路徑 (1)右鍵單擊“src/main/java”文件夾,彈出對話框輸入路徑…

Android 簡單的視頻、圖片壓縮工具

首頁需要壓縮的工具包 1.Gradle implementation com.iceteck.silicompressorr:silicompressor:2.2.3 2.添加相關權限&#xff08;手機得動態申請權限&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE"/> <uses-p…

05 - 研究 .git 目錄

查看所有文章鏈接&#xff1a;&#xff08;更新中&#xff09;GIT常用場景- 目錄 文章目錄 1. HEAD2. config3. refs4. objects 1. HEAD 2. config 3. refs 4. objects Git對象一共有三種&#xff1a;數據對象 blob、樹對象 tree以及提交對象 commit&#xff0c;這些對象都被保…

Vue 目錄結構 vite 項目

Vue3 項目常用的目錄結構和每個文件的作用【通過 vite 創建的項目】 vite目錄結構&#xff1a; dist // 打包后生成的文件目錄 node_modules // 環境依賴 public // 公共資源目錄 favicon.ico …

深入探析設計模式:工廠模式的三種姿態

深入探析設計模式&#xff1a;工廠模式的三種姿態 1. 簡單工廠模式1.1 概念1.2 案例1.3 優缺點 2. 抽象工廠模式2.1 概念2.2 案例&#xff1a;跨品牌手機生產2.3 優缺點 3. 超級工廠模式3.1 概念3.2 案例&#xff1a;動物園游覽3.3 優缺點 4. 總結 歡迎閱讀本文&#xff0c;今天…

go入門實踐四-go實現一個簡單的tcp-socks5代理服務

文章目錄 前言socks協議簡介go實現一個簡單的socks5代理運行與壓測抓包驗證 前言 SOCKS是一種網絡傳輸協議&#xff0c;主要用于客戶端與外網服務器之間通訊的中間傳遞。協議在應用層和傳輸層之間。 本文使用先了解socks協議。然后實現一個socks5的tcp代理服務端。最后&#…

英語詞法——代詞

代詞是用來代替名詞、起名詞作用的短語、分句和句子的詞。英語中代詞根據其意義和作用可分為九類:人稱代詞、物主代詞、反身代詞、相互代詞、指示代詞、疑問代詞、不定代詞、關系代詞和連接代詞。 第一節 人稱代詞 一、人稱代詞的形式和用法 人稱代詞單數復數第一人稱第二人…

【ARM 嵌入式 編譯系列 4 -- GCC 編譯屬性 __read_mostly 詳細介紹】

文章目錄 __read_mostly 介紹__read_mostly 在 linux 中的使用.data.read_mostly 介紹 __read_mostly 介紹 __read_mostly 是一個在Linux內核編程中用到的宏定義&#xff0c;這是一個gcc編譯器的屬性&#xff0c;用于告訴編譯器此變量主要用于讀取&#xff0c;很少進行寫入&am…

MYSQL中用字符串2022-07去匹配Date類型大于2022-07-01并小于2022-07-31

正文 需求上&#xff0c;是有個日期字符串&#xff0c;例如2022-07&#xff0c;代表著年月。數據庫中表對于這個字段存的是年月日&#xff0c;例如&#xff1a;2022-07-15。 我希望的是&#xff1a;獲取到2022-07-01到2022-07-31&#xff0c;之間的數據&#xff0c;條件是&…

21款美規奔馳GLS450更換中規高配主機,漢化操作更簡單

很多平行進口的奔馳GLS都有這么一個問題&#xff0c;原車的地圖在國內定位不了&#xff0c;語音交互功能也識別不了中文&#xff0c;原廠記錄儀也減少了&#xff0c;使用起來也是很不方便的。 可以實現以下功能&#xff1a; ①中國地圖 ②語音小助手&#xff08;你好&#xf…

【BASH】回顧與知識點梳理(二十六)

【BASH】回顧與知識點梳理 二十六 二十六. 二十一至二十五章知識點總結及練習26.1 總結26.2 模擬26.3 簡答題 該系列目錄 --> 【BASH】回顧與知識點梳理&#xff08;目錄&#xff09; 二十六. 二十一至二十五章知識點總結及練習 26.1 總結 Linux 操作系統上面&#xff0c…

unittest單元測試

當你在編寫測試用例時&#xff0c;可以使用Python內置的unittest模塊來進行單元測試。下面是一個逐步指南&#xff0c;幫助你理解如何編寫和運行基本的單元測試。 導入必要的模塊&#xff1a; 首先&#xff0c;你需要導入unittest模塊和需要測試的模塊&#xff08;例如&#xf…

運維監控學習筆記8

在服務器端&#xff0c;我們添加了nginx-server的主機&#xff1a; 在解決Error問題的過程中&#xff0c;我還通過zabbix_get這個命令進行了測試&#xff0c;發現是沒有的&#xff0c;后來確認是在web頁面配置的過程中&#xff0c;我輸錯了密碼。 yum install zabbix-getzabbi…

uniapp-原生地圖截屏返回base64-進行畫板編輯功能

一、場景 vue寫uniapp打包安卓包&#xff0c;實現原生地圖截屏&#xff08;andirod同事做的&#xff09;-畫板編輯功能 實現效果&#xff1a; 二、邏輯步驟簡略 1. 由 原生地圖nvue部分&#xff0c;回調返回 地圖截屏生成的base64 數據&#xff0c; 2. 通過 uni插件市場 im…

《圖解HTTP》——HTTP協議詳解

一、HTTP協議概述 HTTP是一個屬于應用層的面向對象協議&#xff0c;由于其簡捷、快速的方式&#xff0c;適用于分布式超媒體信息系統。它于1990年提出&#xff0c;經過幾年的使用與發展&#xff0c;得到不斷地完善和擴展。目前在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP…

muduo 29 異步日志

目錄 Muduo雙緩沖異步日志模型: 異步日志實現: 為什么要實現非阻塞的日志