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.mzph.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…