Python 和下划线 (_)
原文towardsdatascience.com/python-and-the-underscore-82d7ce8706dPYTHON 编程https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f8a9681864f93e44144eb2d614d5a5d0.png你会在 Python 代码中找到很多水平线它们以下划线的形式出现。图片由 Jussara Romão 在 Unsplash 上提供下划线——即_字符——在 Python 编程中扮演着重要且有时相当具体的角色。每个 Python 程序员都应该了解其多功能性并理解如何在他们的编码中有效地利用下划线。从提高可读性和管理私有属性到在数据处理和国际化的特定功能中启用下划线不仅仅是一个字符它是 Python 语法中使用的重要字符之一是 Python 语言中的基本工具。本文分析了下划线在 Python 中的不同角色探讨了常见和特定用途使_成为 Python 语言中的基本字符。无论你是初学者还是高级程序员理解下划线的用法将显著提高你的编码技能。下划线使用场景命名下划线最常见且重要的用途可能是命名。根据 PEP 8,函数名应该是小写的必要时用下划线分隔单词以提高可读性。变量名遵循与函数名相同的约定。因此下划线用于在函数和变量名中分隔单词。同样的约定也用于方法名和类实例变量。这是一种 Python 的习惯命名约定。以下是各种编程语言中使用的最重要的命名约定骆驼命名myVariableName第一个单词小写后续单词的首字母大写。用于JavaScript、Java、C#、Swift。帕斯卡命名MyVariableName每个单词的首字母大写。用于Python类名、C#、Pascal、Java、C。蛇形命名my_variable_name单词全部小写并用下划线分隔。用于Python变量和函数名、Ruby。撒泼命名MY_VARIABLE_NAME所有字母大写单词用下划线分隔。用于Python常量、C、C、Java。麻花命名my-variable-name单词全部小写并用连字符分隔。用于URL 和 CSS 类名。匈牙利命名法iCount、strName变量名使用前缀来指示类型或作用域。用于较老的 C 和 C 代码。以下是一些使用下划线的 Python 风格变量名的示例write_to_database()read_data()df_history df_actual下划线在 Python 的命名中又扮演了另一个角色。根据PEP 8如果你需要创建一个名称例如参数的名称与保留名称冲突可以在名称末尾添加下划线如果函数参数的名称与保留关键字冲突通常最好在名称末尾添加单个下划线而不是使用缩写或拼写错误。因此class_比clss更好。常见的用法例如class_和type_。下划线也用于常量名称。PEP 8再次常量通常在模块级别定义并使用全部大写字母单词之间用下划线分隔。这些是常量名称的三个例子NO_OF_DAYS SIGNIF_LEVEL RUN_DEBUGGER正如你所见下划线在 Python 的命名中扮演着多种角色。其中一些比其他更重要——但关键是Python 中使用的几个命名约定在很大程度上依赖于下划线。然而请记住Python 类通常不使用下划线。所以你不太可能将类命名为book_publisher而是BookPublisher。虽然有一些非常著名的例外比如list或dict但这并不意味着你应该自己制造这样的例外。Dunder双下划线或魔法方法这个角色也与命名有关但这里我们谈论的是 Python 语言中的内部名称。你会在所谓的魔法方法的名称中看到很多下划线。这些是开始和结束都带有双下划线__的特殊方法。由于双下划线的使用这些方法有时被称为“dunder”方法——就像双下划线中的“_d_ouble _under_score”。Dunder 方法被 Python 语言的各种特性和语法所使用。它们名称中的双下划线是必不可少的因为正是它们表明了这些方法是特殊的。这种命名约定防止自定义方法覆盖这些内置魔法方法。这里是 Python 中 dunder 方法的几个例子__init__负责创建类的实例。__str__定义了在对象上使用的str()和print()函数的行为参见这篇文章了解更多信息。__len__返回容器的长度。__getitem__允许并定义索引。__add__,__mul__, 等允许对象支持算术运算注意你不应该直接使用 dunder 方法相反它们是在 Python 解释器执行各种操作期间被调用的。例如当你调用len(x)时Python 内部调用x.__len__()。虽然你不应该使用后者但它会正常工作x[1,2,3]len(x)3x.__len__()3最好不要定义新的自定义 dunder 方法。然而覆盖现有的魔法方法或在自定义类中定义它们是可以的。特殊属性以双下划线开头和结尾的方法被称为魔法或 dunder遵循此命名约定的属性通常被称为特殊属性。这些属性由 Python 自动创建和管理提供有关对象的信息。以下是一些示例__name__由模块、类、类方法和函数有趣的是使用[functools.partial](https://docs.python.org/3/library/functools.html#functools.partial)创建的偏函数没有这个属性使用以保存对象的名字。__doc__保存模块、类、方法或函数的文档字符串。__file__由模块使用以存储从其中加载模块的文件路径。虚拟变量另一个常见的下划线用法是作为虚拟变量。这意味着下划线被用作一个名字来表示一个在当前代码中不会被使用的变量。类似的情况在循环中经常使用当我们不使用循环变量时。比较以下情况使用循环变量foriinrange(1,4):...print(fnumber{i})123不要使用循环变量for_inrange(3):...print(Zuma Cuma)Zuma Cuma Zuma Cuma Zuma Cuma当一个对象从函数或方法返回而这个对象不需要被使用时使用下划线来捕获这个对象也是一个好的实践就像这里defsave(obj:Any,path:pathlib.Path)-bool:# the object is saved,# with or without successifnotsuccess:returnFalsereturnTrue_save(obj,pathlib.Path(file.csv)在这里我们将save()的输出赋值给_因为我们不需要在代码中使用这个输出。如果你需要使用它你会这样做savedsave(obj,pathlib.Path(file.csv)通常你将看到一种替代方案——在我看来更糟糕的用法其中完全忽略了输出save(obj,pathlib.Path(file.csv)我不喜欢这种方法因为这样的代码稍微有点不清楚因为它暗示save()函数没有返回任何内容。我只在函数返回None时忽略函数的输出无论什么情况。指示私有方法和属性在面向对象编程中Python 没有真正的私有方法或属性。你可以在这里了解这一点Python 类中属性指示和藏猫猫隐私尽管如此你可以通过在名称前加单个_或双__下划线来指示用户哪些类方法或属性你想保持私有阅读上面的文章了解区别。当你这样做时就像告诉用户他们不应该在类外使用这些方法或属性。用户仍然可以这样做但这取决于他们——他们被告知不应该这样做。考虑以下类classMe:def__init__(self,name,smile:-D):self.namename self.smilesmile self._thoughts[]defsay(self,what):returnstr(what)def_think(self,what):self._thoughtswhat我们有一个名为Me的类它代表嗯你。你可以创建自己如下所示.name一个公共属性 → 你的名字肯定是公开的.smile一个公共属性 → 你的微笑在外面可见所以它是公开的._thoughts一个私有属性 → 你的想法肯定是私密的不是吗如你所见两个公共属性的命名没有使用下划线而唯一的私有属性的名字以下划线开头。现在让我们看看这些方法.say()一个公共方法 → 当你说些什么时人们可以听到你。._think(), 一个私有方法 → 当你思考些什么时那是你的私人想法如果你想大声说出来请使用公共的.say()方法但如果你想保守你的想法你应该使用私有_think()方法。你可以创建一个公共方法来大声说出一个私有想法defsay_thought(self,which):returnself._thoughts[which]交互会话中的最后一个操作在 Python 3 中下划线还用于在解释器会话中存储最后一个操作的结果。当计算没有分配给变量名时这可以快速使用上一个操作的结果进行新操作非常有用。例如123_*39y10_9100_100如你所见下划线只保留最后一个非赋值操作的结果即使它只是一个对象而不进行任何计算如上面代码块中的100。格式化数值截至 Python 3.6下划线可以用作视觉分隔符以改善大数值的可读性。这个特性对于大整数特别有帮助但它也可以应用于浮点数。例如x1_000_000x10000001.009_232_1121.0092321121_021_232.198_231_1111021232.198231111虽然 _ 下划线 _ 通常用于大整数但它也可以增强十进制值的可读性尽管这种做法不太常见。functools.singledispatch用例在[functools.singledispatch](https://docs.python.org/3/library/functools.html#functools.singledispatch)中下划线 (_) 通常用作函数名以指示分派函数是匿名实现用于处理特定类型。这种风格选择表明函数的名称无关紧要相反重要的是函数处理的类型。这种用法有助于保持命名空间的整洁并强调逻辑直接与singledispatch机制相关联而不是直接调用。以下是从 PEP 443 中的一个示例fromfunctoolsimportsingledispatchsingledispatch...deffun(arg,verboseFalse):...ifverbose:...print(Let me just say,,end )...print(arg)fun.register(int)...def_(arg,verboseFalse):...ifverbose:...print(Strength in numbers, eh?,end )...print(arg)...fun.register(list)...def_(arg,verboseFalse):...ifverbose:...print(Enumerate this:)...fori,eleminenumerate(arg):...print(i,elem)在这个设置中_用于实现特定类型的操作行为而不在命名空间中添加未在其他地方使用的函数名称从而避免混乱。如果你想在上面的代码上使用静态检查器如[MyPy](https://mypy-lang.org/)请注意它可能会抛出一个错误表明你正在多次定义_。解决这个问题最简单的方法是在定义_的行末添加# type: ignore注释。或者你可以给当前称为_的函数命名这将是functools.singledispatch的一个非典型方法。国际化和本地化国际化通常缩写为 i18n和本地化缩写为 l10n使应用程序能够适应不同的语言和地区而无需进行工程更改。多亏了国际化应用程序可以适应各种语言和地区而无需修改其代码。另一方面本地化通过添加特定地区的组件和翻译文本帮助适应特定地区或语言的国际化软件。在 Python 中这两个过程可以使用[gettext](https://docs.python.org/3/library/gettext.html)模块来执行。它允许应用程序支持多种语言。在gettext中常见的做法是将下划线_用作gettext函数的别名这标志着字符串需要翻译importgettextimportlocale Set the locale to Polish:locale.setlocale(locale.LC_ALL,pl_PL)Set the path to the.mo translation filesandselect the text domain:gettext.bindtextdomain(...myapp,.../path/to/my/locale/directory...)gettext.textdomain(myapp)The underscoreistypically usedasan aliasforgettext.gettext:_gettext.gettext_(Hello, World!)Witaj,świecie!在这里_()将待翻译的文本包裹起来。当在具有翻译的 locale 中运行时gettext.gettext()——以及因此_()——检索翻译后的字符串。使用下划线简单得多比较gettext.gettext(Hello, World!)Witaj,świecie!_(Hello, World!)Witaj,świecie!这对于应用程序广泛使用gettext.gettext——以及因此_——特别有帮助。忽略解包中的值在 Python 中您可以使用下划线在解包序列时忽略不必要的值。这使得代码更简洁、更易读因为您不需要在代码中定义根本不会使用的变量。因此可以将不需要的值赋给下划线_它充当一个废弃的变量a,_,b(1,2,3)a1b3在这里_用于忽略中间的值2。如果需要忽略多个值尤其是在较长的序列中可以使用带星号的下划线*_a,*_,b[1,2,3,4,5]a1b5我们将列表的第一个和最后一个值分别赋给a和b。其他值——2、3和4——被赋给*_这意味着它们将被忽略并且不再使用。使用下划线这种方式可以提高代码的可读性因为它清楚地表明这些特定的值将不会被使用因此不需要。这有助于保持代码及其读者专注于相关数据。此外如果我们不打算使用这三个值为什么还要将它们赋给变量呢这违背了良好的编码风格。结论只是一个小小的字符一行简短的代码下划线在 Python 编程中是一个极其有用的字符。它有多种不同的用途使它成为任何 Python 程序员的必备工具。它也是 Python 本身的一个重要元素而且很多时候不知道_的含义可能会让您遇到麻烦——或者至少是对 Python 代码的理解出现误解。我们已经涵盖了下划线最重要的用途我可能忽略了一些不太重要的案例但是如果有请在评论中告诉我们。无论如何所有这些用途都使下划线成为 Python 编程中不可或缺的字符。它可能是最有用的字符每个 Python 程序员都应该熟悉其各种用途。

相关新闻

Python 装饰器非常有用,但何时使用它们?

Python 装饰器非常有用,但何时使用它们?

原文:towardsdatascience.com/python-decoration-is-very-useful-but-when-to-use-them-e4f5faab43ec 作为 Python 中最独特的特点之一,装饰器可能并不容易理解。然而,无论你是数据科学家、数据工程师还是 Web 开发者,它都将为我们…

2026/7/5 23:51:57 阅读更多 →
AI数据机房液冷设备CDU数据采集系统方案

AI数据机房液冷设备CDU数据采集系统方案

AI算力的爆发迅速堆高了服务器的功率密度,使得数据机房的功率直线上升,带来了越来越严重的散热问题。传统空调风冷技术是依靠冷空气流动带走服务器表面的热量,不仅难以解决芯片局部热点问题,还会不断增加PUE(能源使用效…

2026/7/8 8:21:05 阅读更多 →
FLUX.1-dev-fp8-dit创意应用:小说场景可视化生成器

FLUX.1-dev-fp8-dit创意应用:小说场景可视化生成器

FLUX.1-dev-fp8-dit创意应用:小说场景可视化生成器 想象一下,当你读到一段精彩的小说描写时,脑海中浮现的画面能够瞬间变成真实的图像——这就是FLUX.1-dev-fp8-dit带来的魔法。 1. 从文字到画面的创作革命 作为一名文学创作者,你…

2026/7/6 3:11:41 阅读更多 →

最新新闻

Velox与Spark、Flink对比:如何选择最适合的数据处理执行引擎

Velox与Spark、Flink对比:如何选择最适合的数据处理执行引擎

Velox与Spark、Flink对比:如何选择最适合的数据处理执行引擎 【免费下载链接】velox Velox is a composable execution engine distributed as an open source C library. It provides reusable, extensible, and high-performance data processing components that…

2026/7/8 11:12:13 阅读更多 →
容器故障检测系统CPDS-analyzer:终极指南,快速诊断容器亚健康状态

容器故障检测系统CPDS-analyzer:终极指南,快速诊断容器亚健康状态

容器故障检测系统CPDS-analyzer:终极指南,快速诊断容器亚健康状态 【免费下载链接】cpds-analyzer Analyze exceptions for Container Problem Detect System 项目地址: https://gitcode.com/openeuler/cpds-analyzer 前往项目官网免费下载&#…

2026/7/8 11:12:13 阅读更多 →
鸿蒙数理体系视域下:全域耦合雨洪一体化演化模型,前置预判应对极端天气

鸿蒙数理体系视域下:全域耦合雨洪一体化演化模型,前置预判应对极端天气

一、模型科学意义 本全域耦合雨洪一体化演化模型,构建了串联大气微物理、多相流体动力学、地表水文过程的统一微分方程组,打通云层水汽成滴、雨滴空中输运、地表产汇流、流域洪水演进全物理链条,具备完整理论自洽性与工程适配性,其…

2026/7/8 11:10:11 阅读更多 →
2026重庆 5310 无缝钢管供应 行业供货模式经验分享

2026重庆 5310 无缝钢管供应 行业供货模式经验分享

2026 年,重庆 5310 无缝钢管供应行业竞争激烈,供货模式的优劣直接影响企业的效益与发展。本文将分享行业供货模式的经验,助你解决供货难题,获取实用的供货方法与策略。行业现状与痛点当前,重庆 5310 无缝钢管供应行业存…

2026/7/8 11:10:10 阅读更多 →
个人微信API二次开发,刚打的Hook钩子瞬间失效?难道不明白SMC自修改代码的内核级对抗吗?

个人微信API二次开发,刚打的Hook钩子瞬间失效?难道不明白SMC自修改代码的内核级对抗吗?

在个人微信API二次开发的激烈攻防战中,不少逆向工程师都遭遇过极其诡异的现象:经过几天几夜的分析,终于在微信的 WeChatWin.dll 中找到了关键的发消息汇编地址,成功通过 VirtualProtect 提权并写入了一个 JMP 实现了 Inline Hook。…

2026/7/8 11:06:06 阅读更多 →
3分钟学会Mermaid Live Editor:零代码绘制专业图表的神器!

3分钟学会Mermaid Live Editor:零代码绘制专业图表的神器!

3分钟学会Mermaid Live Editor:零代码绘制专业图表的神器! 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/merm…

2026/7/8 10:59:53 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻