Python 中下划线 “_” 的多面性:从变量到约定

news2025/3/20 5:28:40

# 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.coloradmin.cn/o/2318167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3项目开发:状态管理实践指南

# Vue3项目开发:状态管理实践指南 一、引言 背景介绍 在Vue项目中,状态管理是一个非常重要的话题。合理的状态管理能够帮助我们更好地组织和管理数据,提升项目的可维护性和可扩展性。本文将深入探讨Vue3项目中状态管理的最佳实践,…

数据结构-------栈

顺序栈: 一、数据结构定义 数据元素 DATATYPE typedef struct person {char name[32];char sex;int age;int score; } DATATYPE;顺序栈结构 SeqStack typedef struct list {DATATYPE *head; // 栈空间首地址int tlen; // 栈总容量(total leng…

机器学习概要

文章目录 一、什么是机器学习 二、机器学习的种类 1. 有监督学习 2. 无监督学习 3.强化学习 三、机器学习的应用 四、机器学习的步骤 1. 数据的重要性 2. 数据和学习的种类 3. 可视化 一、什么是机器学习 机器学习指的是计算机根据给定的问题、课题或环境进行学习&a…

【LangChain入门 2 Model组件】开始!LLM Models简单对话

文章目录 一、使用langchain_ollama二、采用DeepSeek的API三、Model 介绍3.1 OllamaLLM 预训练模型3.2 ChatOllama 聊天预训练模型3.3 OllamaEmbeddings 实现一个helloworld,跑通一个简单的对话。 后面章节会正式介绍LangChain的各个功能。 后台llm的端口可以任意选…

C++20 中线程管理与取消机制的深度剖析

文章目录 std::jthread:更智能的线程管理背景与优势构造函数与 std::stop_token 的集成 std::stop_token、std::stop_source 和 std::stop_callback:灵活的取消机制std::stop_token:取消请求的指示器std::stop_source:取消请求的发…

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析

Vue3 核心特性解析:Suspense 与 Teleport 原理深度剖析 一、Teleport:突破组件层级的时空传送 1.1 实现原理图解 #mermaid-svg-75dTmiektg1XNS13 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-s…

FPGA——实现LED流水灯

文章目录 一、Quartusll_18.1和VS Code软件的关联二、DE2-115的时钟电路三、流水灯的分层次设计四、总结 一、Quartusll_18.1和VS Code软件的关联 1.先打开Quartus II 软件,然后选择菜单栏“Tools”下的“Options…”。 2.点击“Options…”,在弹出的对…

Excel 小黑第12套

对应大猫13 涉及金额修改 -数字组 -修改会计专用 VLOOKUP函数使用(查找目标,查找范围(F4 绝对引用),返回值的所在列数,精确查找或模糊查找)双击填充柄就会显示所有值 这个逗号要中文的不能英…

滚动元素的新api

点击的时候需要双重视图滚动 itemClick(id) {// 滚动到对应位置this.$nextTick(() > {// 找到对应 id 在 initList2 中的索引const index this.initList2.findIndex((item) > item.id Number(id));if (index ! -1) {// 获取所有菜单项const menuItems document.queryS…

多机调度问题(C语言)

代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>int compare(void* a, void* b)//比较函数&#xff0c;用于qsort按处理时间从大到小排序 {return *(int*)a - *(int*)b; }int LPT(int jobs[], int n, int m)//多机调度问题的LPT算法 {qsort(jobs, n, …

烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包&#xff0c;关于烽火HG680-KA&#xff0f;HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下&#xff0c;汇总总结一些常遇到的情况&#xff0c;这次固件会分开发布&#xff0c;以免混淆。 上一个帖子地址&#xff1a;烽火HG680-KA&#xff0…

996引擎 - 红点系统

996引擎 - 红点系统 总结NPC 红点(TXT红点)Lua 红点1. Red_Point.lua2. UI_Ex.lua参考资料以下内容是在三端 lua 环境下测试的 总结 红点系统分几个部分组成。 M2中设置变量推送。 配置红点表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填写 ids 列。 主界面挂载…

3.17BUUCTF练习day1

BUUCTF练习day1 [极客大挑战 2019]EasySQL1&#xff08;字符型&#xff0c;账号密码型&#xff0c;get型&#xff09; 判断闭合方式 在用户名输入1‘&#xff0c;此时密码先输入任何数字时&#xff0c;出现语法错误 说明闭合方式为单引号闭合&#xff0c;在判断完闭合方式后…

【贪心算法】柠檬水找零

1.题目解析 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 2.讲解算法原理 分情况讨论 5---》直接收下 10---》找五元&#xff0c;收下 20----》105△ ----》555 由于5元更有用&#xff0c;则尽可能保留5元 3.代码 class Solution {public boolean lemonadeCh…

黑马跟学.苍穹外卖.Day08

黑马跟学.苍穹外卖.Day08 苍穹外卖-day8课程内容1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码导入1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试1.3.1 接口文档测试1.3.2 前后端联调测试 1.4 代码提交 2. Ap…

ABAP语言的动态编程(4) - 综合案例:管理费用明细表

本篇来实现一个综合案例&#xff1a;管理费用明细表。报表在实际项目中&#xff0c;也有一定的参考意义&#xff0c;一方面展示类似的报表&#xff0c;比如管理费用、研发费用等费用的明细&#xff0c;使用业务比较习惯的展示格式&#xff1b;另一方面正好综合运用前面学习的动…

通过Geopandas进行地理空间数据可视化

目录 引言 安装与导入 数据加载与探索 数据预处理 基本地图可视化 添加其他数据到地图上 空间分析与查询 地图叠加与分组 空间缓冲区 交互式地图可视化 实际应用案例 城市规划 环境监测 结论 引言 在数据科学领域,地理空间数据可视化扮演着至关重要的角色。它不…

在Vue3中使用Echarts的示例

1.常用-引用ts文件方式 1.1 导出ts文件-一个简单的柱状图 export const baseBarChart (xdata: string[], data: number[][], legendData: string[]) > {if (data.length 0) {return noData;}// 定义颜色数组const color [#00CCCC,#FF9900,#1677DC,#FF6666,#B366FF,#666…

GHCTF web方向题解

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

Logic-RL:小参数qwen模型复现DeepSeek R1 zero

最近很多参照DeepSeek模型训练推理模型的工作,本文将深入 “Logic-RL: Unleashing LLM Reasoning with Rule-Based Reinforcement Learning” 的论文,该论文提出了一种Rule-Based Reinforcement Learning, Logic-RL框架,旨在提升 LLM 的逻辑推理能力,在qwen2.5-7b-instruct…