Python 中下劃線 “_” 的多面性:從變量到約定

# Python中下劃線“_”的多面性:從變量到約定

在Python的語法體系里,下劃線“_”看似毫不起眼,實則扮演著極為重要且多樣化的角色。它不僅能作為普通變量參與編程,更在多個特殊場景下有著獨特的用途與約定。深入理解下劃線的各種用法,對于寫出地道、高效且易于維護的Python代碼至關重要。

## 一、作為臨時或無關緊要的變量

在編程過程中,我們常常會遇到某些變量值并不重要,僅為滿足語法結構的情況。此時,下劃線“_”便成為理想的選擇。

### (一)循環中的占位

當我們只關注循環的執行次數,而不關心每次迭代中的具體元素時,使用下劃線可以讓代碼更清晰地表達我們的意圖。例如,若要執行某個操作特定次數,可如下編寫代碼:

```python

for _ in range(5):

??? print("執行某項操作")

```

在這個例子中,下劃線“_”作為循環變量,僅僅是為了滿足`for`循環的語法要求,它并不代表任何實際數據,我們更關注的是循環體中的操作會被執行5次。

### (二)函數返回值的部分舍棄

許多函數會返回多個值,但在特定場景下,我們可能只對其中部分值感興趣。此時,下劃線可以用來“占位”舍棄不需要的值。例如,`divmod`函數會返回商和余數:

```python

quotient, _ = divmod(10, 3)

print(quotient)

# print(_)

```

這里,我們只關心`10`除以`3`的商,而余數對于當前邏輯并無用處,使用下劃線接收余數,讓代碼簡潔明了,同時也避免了創建一個無意義的變量名。當然,實際上下劃線是可以實際接收到余數的值,也可以正常的使用,這里想說的是,用下劃線接收代表并不需要這個變量。

## 二、在交互式解釋器中的特殊意義

Python的交互式解釋器為開發者提供了一個即時測試代碼的環境,而下劃線在其中有著特殊的功能——它會存儲上一次表達式的計算結果。

```python

>>> 2 + 3

5

>>> _

5

```

當我們在交互式解釋器中輸入`2 + 3`,解釋器返回結果`5`,隨后輸入`_`,解釋器便會輸出上一次計算的結果`5`。這一特性在需要復用前一次計算結果進行后續操作時非常便捷,例如:

```python

>>> result = _ * 2

>>> print(result)

10

```

通過下劃線,我們可以輕松地基于上一次的計算結果進行進一步的運算,無需重新輸入或記錄中間值。

注意:只有在交互式解釋器中,下劃線才具備這樣的功能。如果是在一段連續的python程序代碼,下劃線并不具備這種默認行為。

## 三、用于國際化和本地化

在國際化(i18n)和本地化(l10n)的編程實踐中,下劃線“_”被廣泛用作函數名,用于標記需要翻譯的字符串。

```python

import gettext

# 初始化翻譯

t = gettext.translation('messages', localedir='locales', languages=['zh_CN'])

_ = t.gettext

# 使用 _ 函數標記需要翻譯的字符串

print(_('Hello, World!'))

```

在這段代碼中,通過將`gettext`函數賦值給下劃線“_”,我們可以在后續代碼中方便地使用`_('字符串')`的形式來標記需要翻譯的文本。當程序運行時,這些被標記的字符串會根據用戶設置的語言環境進行相應的翻譯,從而實現多語言支持。

## 四、作為變量名的考量

從語法角度看,下劃線“_”可以作為普通變量名使用。

```python

_ = 100

print(_)

```

上述代碼將`100`賦值給下劃線“_”并打印輸出。然而,由于下劃線在Python中有諸多特殊用途,將其作為普通變量名會降低代碼的可讀性和可維護性,容易讓閱讀代碼的人產生誤解。因此,在實際編程中,除非有特殊需求,否則應避免將下劃線作為普通變量名使用。

## 五、單下劃線和雙下劃線的其他用途

### (一)單下劃線開頭的變量和方法

在Python中,以單下劃線開頭的變量或方法通常被視為私有成員。雖然Python并沒有像其他編程語言那樣提供嚴格的訪問限制機制,但這種命名約定向開發者傳達了一個重要信息:這些成員不應該在類的外部直接訪問,它們主要用于類內部的邏輯實現。

```python

class MyClass:

??? def __init__(self):

??????? self._private_variable = 10

??? def _private_method(self):

??????? print("This is a private method.")

obj = MyClass()

# 雖然可以訪問,但不建議這樣做

print(obj._private_variable)

obj._private_method()

```

在這個例子中,`_private_variable`和`_private_method`被約定為私有成員。盡管在類外部仍可以訪問它們,但這違背了代碼的設計初衷,并且在后續代碼維護或擴展時可能引發問題。

### (二)雙下劃線開頭的變量和方法

以雙下劃線開頭的變量或方法會經歷名稱修飾(name mangling)過程。Python會對這些名稱進行改寫,以避免在子類中意外被覆蓋。

```python

class Parent:

??? def __init__(self):

??????? self.__private_variable = 201

class Child(Parent):

??? pass

child = Child()

# 無法直接訪問 __private_variable

# print(child.__private_variable)? # 會報錯

# 實際的名稱被修改為 _Parent__private_variable

print(child._Parent__private_variable)

```

在上述代碼中,`Parent`類中的`__private_variable`在類定義時被修改為`_Parent__private_variable`。這樣,即使`Child`類定義了同名的變量或方法,也不會與父類的`__private_variable`產生沖突,從而保證了類的封裝性和繼承體系的穩定性。

下劃線“_”在Python中是一個多功能的符號,從簡單的臨時變量到復雜的面向對象編程約定,它貫穿于Python編程的各個層面。正確理解和運用下劃線的不同用途,不僅能提升代碼的質量,還能讓開發者更好地融入Python的編程文化,編寫出更專業、更優雅的Python代碼。

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

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

相關文章

深入 Linux 聲卡驅動開發:核心問題與實戰解析

1. 字符設備驅動如何為聲卡提供操作接口? 問題背景 在 Linux 系統中,聲卡被抽象為字符設備。如何通過代碼讓應用程序能夠訪問聲卡的錄音和播放功能? 核心答案 1.1 字符設備驅動的核心結構 Linux 字符設備驅動通過 file_operations 結構體定…

基于Spring Boot的圖書管理系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

記錄 macOS 上使用 Homebrew 安裝的軟件

Homebrew 是 macOS 上最受歡迎的軟件包管理器之一,能夠輕松安裝各種命令行工具和 GUI 應用。本文記錄了我通過 Homebrew 安裝的各種軟件,并對它們的用途和基本使用方法進行介紹。 🍺 Homebrew 介紹 Homebrew 是一個開源的包管理器&#xff…

個人AI助手的未來:Yi AI開源系統助力快速搭建

摘要 Yi AI推出了一站式個人AI助手平臺解決方案,助力用戶快速搭建專屬AI助手。該平臺采用全套開源系統,涵蓋前端應用、后臺管理及小程序功能,并基于MIT協議開放使用。同時,平臺集成了本地RAG方案,利用Milvus與Weaviate…

dpkg-architecture命令詳解

dpkg-architecture 是 Debian 系系統中用于處理軟件包架構相關操作的工具,尤其在軟件包構建和交叉編譯環境中至關重要。以下是其核心功能及用法的詳細說明: ?一、核心功能? ?架構查詢與驗證? 顯示或驗證當前系統(DEB_HOST_ARCH&#xff…

STM32HAL庫,解決串口UART中斷接收到的第一個字節數據丟失

1.問題描述: 只有上電后第一次接收到的第一字節數據會丟失,往后再接收也不會存在問題了。 2.先貼出來重寫UART中斷回調函數 我在接收到第一字節數據后開啟定時器中斷的,做一個超時處理,每次接收到數據會對定時器計數值清零&…

解決 vxe-table 固定列對不齊,滾動后錯位、展開行遮擋的問題,解決渲染空白、邊框丟失問題

解決 vxe-table 固定列對不齊,滾動后錯位、展開行遮擋的問題,解決渲染空白、邊框丟失問題。 解決方法,更新到最新版本就完美解決了;v4 版本更新到 v4.12,v3版本更新到 v3.14 查看官網:https://vxetable.cn…

React相關面試題

以下是150道React面試題及其詳細回答,涵蓋了React的基礎知識、組件、狀態管理、路由、性能優化等多個方面,每道題目都盡量詳細且簡單易懂: React基礎概念類 1. 什么是React? React是一個用于構建用戶界面的JavaScript庫&#xff…

設備健康管理系統是什么,設備健康管理系統多少錢?

想象一下,你的汽車在儀表盤報警前 3 天,手機就收到 “發動機軸承剩余壽命 1500 公里” 的提醒 —— 這就是 ** 設備健康管理系統(EHM)** 的日常。在制造業,設備故障每年造成全球 3.4 萬億美元損失,而 80% 的…

Redis項目:秒殺業務

/*** 搶購秒殺券** param voucherId* return*/TransactionalOverridepublic Result seckillVoucher(Long voucherId) {// 1、查詢秒殺券SeckillVoucher voucher seckillVoucherService.getById(voucherId);// 2、判斷秒殺券是否合法if (voucher.getBeginTime().isAfter(LocalD…

區塊鏈(Blockchain)

區塊鏈(Blockchain)是一種去中心化、分布式的賬本技術,它通過密碼學保證數據的安全性和不可篡改性。它的核心特點包括去中心化、不可篡改性、可追溯性、智能合約等。 區塊鏈的關鍵概念 區塊(Block):每個區…

和鯨科技受邀赴中國氣象局氣象干部培訓學院湖南分院開展 DeepSeek 趨勢下的人工智能技術應用專題培訓

為深入貫徹落實國家關于人工智能與氣象業務深度融合的戰略部署,提升在實際業務中應用人工智能技術解決問題的能力,推動氣象現代化高質量發展,中國氣象局氣象干部培訓學院湖南分院于 2025 年 3 月 14 日組織開展 “DeepSeek 等人工智能技術在氣…

Ubuntu 24 常用命令方法

文章目錄 環境說明1、賬號管理1.1、啟用 root 2、包管理工具 apt & dpkg2.1、apt 簡介 & 阿里源配置2.2、dpkg 簡介2.3、apt 和 dpkg 兩者之間的關系2.4、常用命令 3、啟用 ssh 服務4、防火墻5、開啟遠程登錄6、關閉交換分區7、build-essential(編譯和開發軟…

OpenCV計算攝影學(22)將輸入的彩色圖像轉換為兩種風格的鉛筆素描效果函數pencilSketch()

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 鉛筆風格非寫實線描圖。 該函數通過圖像處理技術將輸入的彩色圖像轉換為兩種風格的鉛筆素描效果: dst1:炭筆效果的灰度圖…

hackmyvm-Smol

信息收集 ┌──(root?kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: Cannot open MAC/Vendo…

使用DeepSeek和墨刀AI,寫PRD文檔、畫原型圖的思路、過程及方法

使用DeepSeek和墨刀AI,寫PRD文檔、畫原型圖的思路、過程及方法 現在PRD文檔要如何寫更高效、更清晰、更完整? 還是按以前的思路寫PRD,就還是以前的樣子。 現在AI這么強大,產品經理如何使用DeepSeek寫PRD文檔,產品經…

SpringData Redis緩存:自定義序列化與過期策略

文章目錄 引言一、Spring Cache與Redis集成基礎二、Redis緩存配置基礎三、自定義序列化策略四、實現自定義序列化器五、多級緩存配置六、自定義過期策略七、緩存注解的高級應用八、實現緩存預熱與更新策略九、緩存監控與統計總結 引言 在現代高并發分布式系統中,緩…

HOVER:人形機器人的多功能神經網絡全身控制器

編輯:陳萍萍的公主一點人工一點智能 HOVER:人形機器人的多功能神經網絡全身控制器HOVER通過策略蒸餾和統一命令空間設計,為人形機器人提供了通用、高效的全身控制框架。https://mp.weixin.qq.com/s/R1cw47I4BOi2UfF_m-KzWg 01 介紹 1.1 摘…

C++ :頂層const與底層const的區別

頂層const與底層const的區別 定義與核心區別 頂層 const (Top-level const)底層 const (Low-level const)?作用對象變量本身是常量(不可修改)變量指向或引用的對象是常量(不可修改)?典型場景指針本身不可變、普通變量為常量指…

Chainlit 自定義元素開發指南:使用 JSX 和受限導入實現交互式界面

自定義元素 Custom Element 類允許你渲染一個自定義的 .jsx 代碼片段。.jsx 文件應當放置在 public/elements/ELEMEN_NAME.jsx 目錄下。 屬性 name 字符串 自定義元素的名稱。它應該與你的JSX文件名相匹配(不包括 .jsx擴展名)。 props 字典 傳遞給 JSX 的屬性。 display El…