当前位置: 首页 > news >正文

Python 进阶指南(编程轻松进阶):四、起个好名字

原文:http://inventwithpython.com/beyond/chapter4.html

计算机科学中最困难的两个问题是命名事物、缓存失效引起错误."这个经典的笑话,出自利昂·班布里克之手,并基于菲尔·卡尔顿的一句话,包含了一个真理的核心:很难为变量、函数、类和编程中的任何其他东西想出一个好名字,正式的名称是标识符。简洁、描述性的名称对于程序的可读性非常重要。但是创造名字说起来容易做起来难。如果你要搬到一个新房子,把你所有的搬家箱子都贴上“东西”的标签是简洁的,但不具有描述性的,你不知道箱子里具体装的什么东西。一本编程书籍的描述性名称可能是“用 Python 开发的电脑游戏”,但这并不简洁。

除非你正在编写一次性的程序,之后就不打算再进行代码维护,否则你应该考虑在程序中选择好的名字。如果你简单地使用abc作为变量名,你以后要维护代码时就要多花些时间努力去回忆这些变量最初是用来做什么的。

名字是你必须做出的主观选择。一个自动化的格式化工具,比如第三章描述的 Black,不能帮你给你的变量取名。这一章为你提供了一些指导,帮助你选择合适的名字,避免不合适的名字。和往常一样,这些指导方针并不是一成不变的:你自己拿捏好何时将它们应用到你的代码中。


元语法变量

当我们需要一个通用的变量名时,我们通常在教程或代码片段中使用一个元语法变量。在 Python 中,我们经常在一些不注重变量名的代码片段中见到如下变量名spameggsbaconham。这就是为什么本书在代码示例中使用这些名称;它们并不意味着您可以在实际的程序中使用它们。这些名字来自于蒙蒂·派森的《垃圾邮件》小品en.wikipedia.org/wiki/Spam_(Monty_Python)。名称foobar也是元同步变量的常见名称。这些源自 FUBAR,这是二战时期美国陆军俚语的首字母缩略词,表示“乱七八糟”。


变量名风格

因为 Python 标识符区分大小写,并且不能包含空白,所以程序员对包含多个单词的标识符使用以下几种风格:

  1. 用下划线分隔单词,下划线在每个单词之间看起来像一条扁平的蛇。这种情况通常意味着所有的字母都是小写的,尽管常量通常是用UPPER_SNAKE_CASE写的。
  2. 通过在第一个单词后大写每个单词的开头来分隔单词。这种情况通常意味着第一个单词以小写字母开头。大写字母看起来像骆驼的驼峰。
  3. PascalCase,因其在 Pascal 编程语言中的使用而得名,与camelCase相似,但也将第一个单词大写。

大小写是一个代码格式问题,我们将在第 3 章中讨论。最常见的风格有snake_casecamelCase。只要您的项目始终使用其中一种,而不是两种都使用,那么使用任何一种都可以。

PEP8 的命名惯例

第 3 章中介绍的 PEP8 文档对 Python 命名约定有一些建议:

  • 所有字母都应该是 ASCII 字母,即没有重音符号的大写和小写英文字母。
  • 模块应该用短的,全部小写的名字。
  • 类名要使用PascalCase风格。
  • 常量变量要用大写SNAKE_CASE风格。
  • 函数、方法和变量名应该用小写snake_case书写。
  • 方法的第一个参数应该总是用小写字母命名self
  • 类方法的第一个参数应该总是用小写字母命名cls
  • 类中的私有属性应该总是以下划线(_)开头。
  • 类中的公共属性不应该以下划线(_)开头。

你可以根据需要改变或打破这些规则。例如,尽管英语是编程中的主导语言,但您可以使用任何语言中的字母字符作为标识符: コンピューター = 'laptop'是语法上有效的 Python 代码。正如你在这本书里看到的,我对变量名的偏好违背了 PEP8,因为我用的是camelCase而不是snake_case。PEP8 包含一个提醒,程序员不需要严格遵循 PEP8。重要的可读性因素不是你选择哪种风格,而是使用该风格的一致性。

你可以在www.python.org/dev/peps/pep-0008/#naming-conventions在线阅读 PEP8 的“命名约定”部分。

适当的名称长度

显然,名字不能太长或太短。长变量名输入起来很繁琐,而短变量名可能会令人困惑或难以理解。因为代码被阅读的次数比被编写的次数多,所以宁可选择过长的变量名更加妥当一些。我们来看一些名字太短和太长的例子。

名字太短

最常见的命名错误是选择太短的名字。当你第一次写名字的时候,简短的名字通常对你来说是有意义的,但是几天或几周后,它们的确切含义可能会丢失。让我们考虑几种类型的简称。

  • g这样的一两个字母的名字可能指的是其他一些以g开头的单词,但是有很多这样的单词。只有一两个字母的首字母缩写和名字对你来说很容易写,但对其他人来说却很难读懂。
  • 一个像mon一样的缩写名,可以代表监控器、月份、怪兽、或者任何数量的单词。
  • 一个像start一样的单字名可以是含糊的:什么的开始?这样的名字可能缺少上下文,当被其他人阅读时不容易看出来。

一个或两个字母、缩写或单个单词的名称对您来说可能是可以理解的,但是您始终需要记住,其他程序员(甚至几周后的您)将很难理解它们的含义。

有一些例外情况,短变量名是可以的。例如,在遍历一系列数字或列表索引的for循环中,通常使用i(代表索引)作为变量名,如果有嵌套循环,则使用jk(因为它们在字母表中位于i之后):

>>> for i in range(10):
...     for j in range(3):
...        print(i, j)
...
0 0
0 1
0 2
1 0
`--snip--`

另一个例外是将xy用于笛卡尔坐标。在大多数其他情况下,我警告不要使用单字母变量名。虽然用wh作为widthheight的简写,或者用n作为number的简写可能很有诱惑力,但是这些意思对其他人来说可能并不明显。


不要从你的源代码中删除字母

虽然像memcpy(内存复制)和strcmp(字符串比较)这样的名字中的首字母在 20 世纪 90 年代之前的 C 编程语言中很流行,但它们是一种不可读的命名风格,你今天不应该使用。如果一个名字不容易发音,它就不容易理解。

此外,请随意使用短语,使您的代码看起来像简单的英语。比如number_of_trials比单纯的number_trials可读性更强。


名字太长

一般来说,名字的范围越大,描述性就应该越强。像payment这样的短名字对于单个短函数中的局部变量来说是合适的。但是如果您在一个 10,000 行的程序中使用它作为一个全局变量,那么payment可能不够具有描述性,因为这样一个大型程序可能会处理多种支付数据。更具描述性的名字,如salesClientMonthlyPaymentannual_electric_bill_payment,可能更合适。名称中的附加单词提供了更多的上下文并消除了歧义。

描述过度总比描述不够好。但是有指导方针来决定什么时候长名字是不必要的。

名称中的前缀

在名称中使用常见的前缀可能表示名称中不必要的细节。如果一个变量是一个类的属性,前缀可能提供不需要在变量名中的信息。例如,如果你有一个带有weight属性的Cat类,很明显weight指的是猫的体重。所以catWeight这个名字画蛇添足了,而且不必要的长。

类似地,一个旧的现在已经过时的实践是使用匈牙利符号在名称中包含数据类型缩写的实践。比如名字strName表示变量包含字符串值,iVacationDays表示变量包含整数。现代语言和 ide 可以将这种数据类型信息传递给程序员,而不需要这些前缀,这使得匈牙利符号在今天已然过时。如果您发现您的名称中包含了某个数据类型的名称,请考虑将其移除。

另一方面,包含布尔值的变量或者返回布尔值的函数和方法的前缀ishas使得这些名称更易读。考虑以下名为is_vehicle的变量和名为has_key()的方法的使用:

`if item_under_repair.has_key('tires'):` `is_vehicle = True` 

has_key()方法和is_vehicle变量支持对代码的简单英文解读:“如果正在维修的项目有一个名为‘轮胎’的键,那么这个项目就是一辆汽车。”

类似地,在你的名字中添加单位可以提供有用的信息。存储浮点值的weight变量是不明确的:重量是以磅、千克还是吨为单位?这个单元信息不是数据类型,所以包含前缀或后缀kglbstons与匈牙利符号不同。如果您没有使用包含单位信息的特定于体重的数据类型,将变量命名为类似于weight_kg的名称可能是谨慎的。事实上,在 1999 年,当洛克希德·马丁公司提供的软件使用英制标准单位进行计算时,火星气候轨道器机器人太空探测器丢失了,而美国宇航局的系统使用公制,导致了不正确的轨迹。据报道,该航天器耗资 1.25 亿美元。

名称中的连续数字后缀

名称中的连续数字后缀表示您可能需要更改变量的数据类型或为名称添加不同的细节。数字本身通常不能提供足够的信息来区分这些名字。

payment1payment2payment3这样的变量名不能告诉阅读代码的人这些支付值之间的区别。程序员可能应该将这三个变量重构为一个名为payments的列表或元组变量,其中包含三个值。

具有类似于makePayment1(amount)makePayment2(amount)等调用的函数可能应该被重构为一个接受整数参数的函数:makePayment(1, amount)makePayment(2, amount)等等。如果这些函数有不同的行为来证明独立的函数,那么这些数字背后的含义应该在名字中说明:例如:makeLowPriorityPayment(amount)makeHighPriorityPayment(amount),或者make1stQuarterPayment(amount)make2ndQuarterPayment(amount)

如果你有一个合理的理由选择带有连续数字后缀的名字,使用它们是没问题的。但是如果你使用这些名字是因为这是一个容易做出的选择,考虑修改它们。

使名字可搜索

除了小程序之外的所有程序,你可能需要使用你的编辑器或者 IDE 的Ctrl+F“查找”特性来定位你的变量和函数被引用的位置。如果你选择一个短的通用变量名,比如numa,你将会得到几个错误的匹配结果。为了使名称易于立即找到,可以使用包含特定细节的较长变量名来形成唯一的名称。

一些 ide 具有重构特性,可以根据程序使用名字的方式来识别名字。例如,一个共同的特性是“重命名”工具,它可以区分名为numnumber的变量,以及局部num和全局num变量。但是您仍然应该选择名称,就好像这些工具不可用一样。

记住这条规则自然会帮助你选择描述性的名字,而不是一般的名字。email这个名字很模糊,所以考虑一个更具描述性的名字,比如emailAddressdownloadEmailAttachmentemailMessagereplyToAddress。这样的名称不仅更准确,而且在源代码文件中也更容易找到。

避免玩笑、双关语和特殊文化

在我之前的一份软件工作中,我们的代码库包含一个名为gooseDownload()的函数。我不知道这意味着什么,因为我们正在创造的产品与鸟类或下载鸟类毫无关系。当我找到最初编写这个函数的更资深的同事时,他解释说goose是一个动词,意思是“推动引擎”,我也不知道这句话是什么意思。他不得不进一步解释“推动引擎”是汽车术语,意思是踩下油门让引擎跑得更快。因此,gooseDownload()是一个让下载速度更快的函数。我点点头,回到我的办公桌。多年后,在这位同事离开公司后,我将他的职能重新命名为increaseDownloadSpeed()

在程序中选择名称时,您可能会尝试使用笑话、双关语或特殊文化来为代码添加一些轻松的元素。不要这样。笑话可能很难在文本中传达,这个笑话将来可能不会那么有趣了。双关语也很容易被忽略,处理来自同事的重复错误报告,他们会把双关语误认为是打字错误,这是非常令人头疼的。

特定于区域性的引用可能会妨碍清楚地传达代码的意图。互联网使得与世界各地的陌生人分享源代码变得前所未有的容易,这些陌生人不一定精通英语,也不一定听得懂英语笑话。正如本章前面提到的,Python 文档中使用的名称spameggsbacon引用了一个 Monty Python 喜剧小品,但我们仅将它们用作 metasyntactic 变量;在现实世界的代码中使用它们是不明智的。

最好的策略是以非英语母语者容易理解的方式编写代码:礼貌、通俗、严谨。我以前的同事可能认为gooseDownload()是一个有趣的笑话,但如果失去了可解释性,这个笑话也就没有什么意义了。

不要覆盖内置名称

你也不应该对你自己的变量使用 Python 的内置名称。例如,如果你命名一个变量为listset,你将覆盖 Python 的list()set()函数,这可能会导致你的代码出现错误。list()函数创建列表对象。但是覆盖它会导致以下错误:

>>> list(range(5))
[0, 1, 2, 3, 4]
>>> list = ['cat', 'dog', 'moose'] # 1
>>> list(range(5)) # 2
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'list' object is not callable

如果我们给名称list 1 分配一个列表值,我们将失去原来的list()函数。试图调用list() 2 会导致TypeError。要了解 Python 是否已经在使用一个名称,可以在交互式 Shell 中键入它,或者尝试导入它。如果这个名字没有被使用,你会得到一个NameError或者ModuleNotFoundError。例如,Python 使用名称opentest,但没有使用spameggs

>>> open 
<built-in function open >
>>> import test
>>> spam 
Traceback (most recent call last):File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> import eggs 
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'eggs'

一些常见的被改写的 Python 名字有allanydateemailfileformathashidinputlistminmaxobjectopenrandomsetstrsumtesttype。不要使用这些名字作为你的标识符。

另一个常见的问题是给你的.py文件命名与第三方模块同名。例如,如果您安装了第三方 pyperclip 模块,但还创建了一个pyperclip.py文件,则import pyperclip语句会导入pyperclip.py而不是 Pyperclip 模块。当你试图调用 Pyperclip 的copy()paste()函数时,你会得到一个错误,说它们不存在:

>>> # Run this code with a file named pyperclip.py in the current folder.
>>> import pyperclip # This imports your pyperclip.py, not the real one.
>>> pyperclip.copy('hello')
Traceback (most recent call last):File "<stdin>", line 1, in <module>
AttributeError: module 'pyperclip' has no attribute 'copy'

注意覆盖 Python 代码中的现有名称,尤其是当您意外地得到这些has no attribute错误消息时。

有史以来最糟糕的变量名

名称data是一个糟糕的通用变量名,因为实际上所有变量都包含数据。命名变量var也是一样,有点像给你的宠物狗取名“狗”。temp这个名字对于临时保存数据的变量来说很常见,但仍然是一个糟糕的选择:毕竟,从长远的角度来看,所有变量都是临时的。不幸的是,尽管这些名字模糊不清,却经常出现;请避免在代码中使用它们。

如果您需要一个变量来保存温度数据的统计方差,请使用名称temperatureVariance。不言而喻,名称tempVarData将是一个糟糕的选择。

总结

选择名字与算法或计算机科学无关,但它是编写可读代码的重要部分。最终,变量的命名由您自己决定,但是请注意存在的许多准则。PEP8 文档推荐了几种命名约定,比如模块的小写名称和类的PascalCase名称。名字不应该太短或太长。但是,宁可描述得太详细,也不要描述得不够详细。

名字应该简洁但有描述性。使用Ctrl+F搜索功能很容易找到的名称是独特的描述性变量的标志。想想你的名字有多容易被搜索到,以此来判断你是否使用了一个过于普通的名字。此外,考虑一个英语比较菜的程序员是否能理解这个名字:避免在你的名字中使用笑话、双关语和文化参考;相反,选择有礼貌的,通俗的,严肃的名字。

虽然本章中的许多建议只是简单的指南,但是您应该总是避免使用 Python 的标准库已经使用的名称,例如allanydateemailfileformathashidinputlistminmaxobjectopenrandomsetstrsumtesttype。使用这些名称可能会导致代码中出现细微的错误。

计算机不在乎你的名字是描述性的还是模糊的。名字使代码更容易被人类阅读,而不是更容易被计算机运行。如果你的代码是可读的,就很容易理解。如果容易理解,就容易改变。而且如果很容易改变,那么修复 bug 或者增加新功能就更容易了。使用容易理解的名字是生产高质量软件的基础步骤。

相关文章:

Python 进阶指南(编程轻松进阶):四、起个好名字

原文&#xff1a;http://inventwithpython.com/beyond/chapter4.html 计算机科学中最困难的两个问题是命名事物、缓存失效引起错误."这个经典的笑话&#xff0c;出自利昂班布里克之手&#xff0c;并基于菲尔卡尔顿的一句话&#xff0c;包含了一个真理的核心&#xff1a;很…...

STL容器适配器之<priority_queue>

文章目录测试环境priority_queue介绍头文件模块类定义对象构造元素访问元素插入和删除容器大小迭代器其他函数测试环境 系统&#xff1a;ubuntu 22.04.2 LTS 64位 gcc版本&#xff1a;11.3.0 编辑器&#xff1a;vsCode 1.76.2 priority_queue介绍 容器适配器。支持在末端插入…...

线程——线程同步

案例&#xff1a;卖票 需求&#xff1a;某电影院目前正在上映国产大片&#xff0c;共有100张票&#xff0c;而它有三个窗口卖票&#xff0c;请设计一个程序模拟该电影院卖票 思路&#xff1a; 定义一个类SellTicket实现Runnable接口&#xff0c;里面定义一个成员变量&#xff…...

安卓录屏使用VirtualDisplay虚拟屏幕;MediaRecorder,媒体录影机;

1.跟截屏一样&#xff0c;判断权限&#xff0c;然后在onActivityResult里面给mediaProjection赋能&#xff1b; 2.初始化录像机&#xff1a; //初始化Recorder录像机 fun initRecorderStart() { //新建Recorder val displayMetrics DisplayMetrics() val width displayMetri…...

Java FileChannel文件的读写实例

一、概述&#xff1a; 文件通道FileChannel是用于读取&#xff0c;写入&#xff0c;文件的通道。FileChannel只能被InputStream、OutputStream、RandomAccessFile创建。使用fileChannel.transferTo()可以极大的提高文件的复制效率&#xff0c;他们读和写直接建立了通道&#x…...

2023 年男生还推荐报计算机专业吗?

计算机专业确实是一个非常热门的专业&#xff0c;就业前景也很广阔。 但是&#xff0c;近些年随着各个大学对计算机专业及其相关专业疯狂扩招&#xff0c;而且每年的毕业人口都在增多&#xff0c;行业是根本容纳不下的&#xff0c;就业竞争力度也急剧上升。因此&#xff0c;选…...

【华为OD机试真题】积木最远距离(相同数字的积木游戏1)(javapython)

相同数字的积木游戏1 知识点数组循环map 时间限制:1s 空间限制:256MB 限制语言:不限 题目描述: 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数…...

STM32F103RCT6驱动SG90舵机-完成正反转角度控制

一、SG90舵机介绍 SG90是一种微型舵机&#xff0c;也被称为伺服电机。它是一种小型、低成本的直流电机&#xff0c;通常用于模型和机器人控制等应用中。SG90舵机可以通过电子信号来控制其精确的位置和速度。它具有体积小、重量轻、响应快等特点&#xff0c;因此在各种小型机械…...

【4.13(补)】二叉搜索树的遍历、插入、删除

文章目录二叉搜索树的最近公共祖先二叉搜索树中的插入操作删除二叉搜索树中的节点二叉搜索树的最近公共祖先 235. 二叉搜索树的最近公共祖先 - 力扣&#xff08;LeetCode&#xff09; 因为二叉搜索树是有序的&#xff0c;第一次找到p和q中间的值&#xff0c;就是最近的公共祖先…...

Web 攻防之业务安全:Callback自定义测试(触发XSS漏洞)

Web 攻防之业务安全&#xff1a;Callback自定义测试 业务安全是指保护业务系统免受安全威胁的措施或手段。广义的业务安全应包括业务运行的软硬件平台&#xff08;操作系统、数据库&#xff0c;中间件等&#xff09;、业务系统自身&#xff08;软件或设备&#xff09;、业务所提…...

Java访问底层操作系统

native方法定义&#xff1a; 简单地讲&#xff0c;一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法&#xff1a;该方法的实现由非java语言实现&#xff0c;比如C。这个特征并非java所特有&#xff0c;很多其它的编程语言都有这一机…...

Python 进阶指南(编程轻松进阶):十六、面向对象编程和继承

原文&#xff1a;http://inventwithpython.com/beyond/chapter16.html 定义一个函数&#xff0c;并从几个地方调用它&#xff0c;可以省去复制和粘贴源代码的麻烦。不复制代码是一个很好的实践&#xff0c;因为如果你需要修改它&#xff08;无论是为了修复一个错误还是添加新特…...

【计算机系统结构】第一章 计算机系统结构基本概念

文章目录第一章 计算机系统结构基本概念1.1 计算机系统结构的概念1.2 计算机体系结构的发展1.3 系统结构中并行性的发展1.4 系统结构的设计1.5 定量分析技术基础第一章 计算机系统结构基本概念 课程内容 A I P S N 工业革命 1.1 计算机系统结构的概念 引言 第一台通用计算机 …...

e2fsprogs logsave Ubuntu 安装失败 unable to make backup link of ‘./usr/bin/chattr‘

最近给服务器从 Ubuntu 18.04 LTS 升级到 20.04 LTS&#xff0c;过程中崩溃&#xff0c;重新尝试执行&#xff0c;提示依赖错误。这时候 apt install 所有的东西都会报错&#xff0c;提示依赖不满足。&#xff08;这里的报错忘了复制了&#xff09;执行 apt upgrade 也是一样。…...

在排序数组中查找元素的第一个和最后一个位置(二分查找进阶)

在写这个题目之前需要大家自行看一下我之前写的博客有关二分查找思想,如何判断什么时候使用二分查找以及边界值的确定:二分查找思想力扣实例_徐憨憨&#xff01;的博客-CSDN博客 题目:给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定…...

1 Nginx跨域配置

跨域问题在之前的单体架构开发中&#xff0c;其实是比较少见的问题&#xff0c;除非是需要接入第三方SDK时&#xff0c;才需要处理此问题。但随着现在前后端分离、分布式架构的流行&#xff0c;跨域问题也成为了每个Java开发必须要懂得解决的一个问题。 跨域问题产生的原因 产…...

ChatGTP如此强大,我们普通人如何利用它来赚钱?

我从效率提升的角度&#xff0c;分享了我这段时间看到的、用到的&#xff0c;以及思考的一些内容。 最近这段时间&#xff0c;我算是密集的学习。不得不说&#xff0c;优质的资料在推特和油管上特别多&#xff0c;看科技大佬的分享真是一种享受。 很多大神也会录制各种详细的…...

常见的九种大数据分析模型

常见的9种大数据分析模型分别为&#xff1a; 事件分析、 属性分析、 渠道分析、 Session分析、 留存分析、 归因分析、 漏斗分析、 路径分析、 分布分析 1、【事件分析】 事件分析&#xff0c;是指用户在 APP、网站等应用上发生的行为&#xff0c;即何人&#xff0c;何时&…...

射频识别(RFID)技术的基本原理、特性、发展和应用

何谓射频识别 随着高科技的蓬勃发展&#xff0c;智能化管理已经走进了人们的社会生活&#xff0c;一些门禁卡、第二代身份证、公交卡、超市的物品标签等&#xff0c;这些卡片正在改变人们的生活方式。其实秘密就在这些卡片都使用了射频识别技术&#xff0c;可以说射频识别已成…...

3.3 二维随机变量条件分布

学习目标&#xff1a; 要学习二维随机变量的条件分布&#xff0c;我可能会采取以下步骤&#xff1a; 复习边缘分布和联合分布&#xff1a;首先需要了解二维随机变量的边缘分布和联合分布的概念以及相应的公式。 复习条件概率&#xff1a;学习条件概率的定义和计算公式&#x…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...