转载请注明出处️

作者:测试蔡坨坨

原文链接:caituotuo.top/7417a7f0.html


大家好,我是测试蔡坨坨。

今天,我们来聊一下Python命名那些事儿。

名为万物之始,万物始于无名,道生一,一生二,二生三,三生万物。

“怎么给变量命名?”看似是一个非常基础的内容,但还是有很多人在这个部分有一点迷茫。

命名常常被认为是编程中的细节问题,其重要性往往被低估。而所谓的工匠精神,往往体现在细节之处。

程序员在工作中有80%的时间都在阅读和理解代码,好的命名可以提高代码的可读性和表达力,词不达意的命名则会让人摸不着头脑,增加不必要的思维开销。

学好Python,从变量命名开始。

合法的变量名

什么是合法的变量名?

所谓合法的变量名就是Python解释器能够认识的变量名。

也是在编码过程中必须遵循的规则,假设不遵守规则,程序就会报错。

在Python中,一个合法的变量名是由字母下划线数字组成,并且第一个字符不能为数字。

在Python3中,对字母的定义其实是广义的,你可以写一个中文的变量名,也就是说你可以认为中文的这个字也算一种字母,但是一般来说不推荐使用中文变量名,因为有时候可能会由于一些编码的原因产生一些莫名其妙的bug。

caituotuo_666 = "测试蔡坨坨" # √
# 666caituotuo_666 = "测试蔡坨坨" # × 数字开头不合法
蔡坨坨 = "测试蔡坨坨" # √ 不推荐

好的变量名

合法的变量名显然给了我们很大的操作空间,我们可以给变量取各式各样、千奇百怪的名字。

什么是好的变量名?

好的变量名是一种命名规范,虽然不遵循命名规范,程序仍然可以运行,但是使用命名规范可以更加直观地了解代码所代表的含义,因此和Python开发人员用同一套命名系统就显得很重要。

我们可以从内容和形式上判断一个变量名的好坏。

内容

从内容的角度就是这个变量名传递了多少有效信息,是否是一个有意义的变量名。有意义的变量名可以达到代码即文档的效果,有较高的可读性,不需要借助注释和文档,代码本身就能显性地表达开发者的意图。

例如以下三个变量:

n = "测试蔡坨坨"
name = "测试蔡坨坨"
username = "测试蔡坨坨"
  • 三个变量都代表用户名
  • 相对于name,明显username传递出来的有效信息更多
  • 当你的变量名包含的有效信息够多的时候就是一个好的变量名

但是,是不是有效信息越多越好,显然并不是,我们还需要在有效信息和变量名长度上做取舍(这二者之间的平衡取决于项目本身和经验积累),不应该为了展示更多的信息把变量名整的无限长,并不是一寸长一寸强,例如下面这个变量名就显得过长了

student_system_login_username = "测试蔡坨坨"

形式

在编码过程中,一个变量名有时候需要用到两个及以上的单词,当这些单词挤在一起时,我们很难去分清谁是谁。所以在形式上我们又有四种不同的变量名写法:

lower_underscore = "测试蔡坨坨"
UPPER_UNDERSCORE = "测试蔡坨坨"
CamelCase = "测试蔡坨坨"
mixedCase = "测试蔡坨坨"
  • lower_underscore:小写字母跟下划线
  • UPPER_UNDERSCORE:大写字母跟下划线
  • CamelCase:驼峰命名中的大驼峰,通过首字母大写的方式来区别单词
  • mixedCase:驼峰命名中的小驼峰,与大驼峰的区别就是第一个字母为小写

推荐的变量名

什么是被推荐的变量名?

Naming Convention 命名规范

在PEP8里面就有比较详细的描述,原文地址:https://peps.python.org/pep-0008/#naming-conventions

Naming Convention的核心就是consistency(一致性)

官方的意思大概是:

  • Python库的命名规范有点乱,所以永远不会完全一致
  • 尽管如此,还是有目前推荐的命名标准
  • 新的模块和包(包括第三方框架)应该按照这些标准编写,但如果现有库具有不同的风格,则优先考虑内部一致性

当你看到一个变量名的时候,如何快速分辨出是变量 or 常量 or 类 or 函数 or …?

就需要有一致性,也就是说好的变量不仅仅是让你的程序变得好看,同时也能提高编程效率。

Python中使用的变量格式

在Python中用到的格式有三种:lower_underscore、UPPER_UNDERSCORE、CamelCase,不会用到mixedCase。

  • lower_underscore:小写字母跟下划线(除了常量和类名,剩下的所有名字都是小写下划线,包括:module模块variable变量function函数method方法,他们在Python中通常被看做是一个变量被使用、被传递,所以他们的命名方式是一致的)

  • UPPER_UNDERSCORE:大写字母跟下划线,只用来表示常量(其实在Python中并没有真正的常量,更多的是一种约定,你别动我也别动,因此当你要表示常量的时候就可以用大写下划线,同时在Python标准库中你看到大写下划线也就知道它是个常量)

  • CamelCase:驼峰命名中的大驼峰,通过首字母大写的方式来区别单词,只用来表示

  • mixedCase:驼峰命名中的小驼峰,与大驼峰的区别就是第一个字母为小写(不会在Python中使用)

Python中的下划线“_”

单下划线 _

在Python解释器中,对单下划线是有特殊感情的。

  • 单下划线也是Python中一个合法的变量名,通常被当做占位符使用

    for _ in range(5):
    print("测试蔡坨坨") for i in range(5):
    print("测试蔡坨坨")

    从上面的程序可以看出,使用“_”比使用“i”表达出更多的信息,就是显性地告诉别人这个变量是没有用的。

  • _ 会指向你最后一次执行的表达式

  • 使用单个下划线来格式化变量的值,例如金额,通过这样的写法我们能够更加易读

    total_value = 8_000_000_000
    print(total_value) # 8000000000

前置下划线 prefix

在Python中,前置下划线在语义和功能上都有可能对变量本身造成一定的影响。

单前置下划线 _xx

单下划线在Python中叫弱私有(weak “internal use” ),在语义上表达的是private性质,也就是友好给告诉别人这并不是开放的接口,当你使用from module import * 的时候它是不会import单下划线开头的变量的,但是如果你强制使用它还是可以使用的,因此叫做弱私有。

class MyClass:
def _get_name(self):
print("测试蔡坨坨") def get_name(self):
print("测试蔡坨坨")

双前置下划线 __xx

与弱私有相对应的就是强私有,在Python的class definition里面用双前置下划线表示强私有,强行引用就会报错,可以防止被子类重写。

class MyClass:
def __get_name(self):
print("测试蔡坨坨")

其实强私有也是有办法使用的,也就是防君子不妨小人,Python实际上是在class definition里面对双下划线开头的变量进行一个重命名,就是在双下划变量的前面加一个_class名,如果打印的是obj._MyClass__get_name(),还是能正常运行的

后置下划线 xx_

我们知道Python中有很多关键词,例如:class、def、return、pass……,他们都有特殊的定义和意义,所以我们在定义变量或方法的时候不可以使用它们来命名,比如以下代码就是错误的:

# 错误示范
def my_func(pass):
class = 1
return class

如果我们就是想这样定义名称,为了区分,可以在后面添加一个下划线(不过不建议这样命名,虽然它是合法的,但是有那么多名称何必去定义关键词相关的名称呢)

def my_func(pass_):
class_ = 1
return class_

前后各有两个下划线 __xx__

dunderscore:double underscore

专门表示Python中的魔术函数magic method,都是一些Python内置好的一些函数,我们可以拿来就使用,例如:类的初始化方法__init____call__

对于Python使用者来说就是不要用,自己定义的方法永远不要用到这种形式(Never invent such names; only use them as documented.)

其他注意事项

在起名的时候不要覆盖Python中内置的方法(builtin method)

# 错误示范
list = [1, 2, 3, 4] # ×
dict = {"username": "测试蔡坨坨"} # ×
str = "测试蔡坨坨" # ×

在给文件起名的时候,也不要跟内置的module重名,例如:os.py、selenium.py、turtle.py,都是不可取的。

你真的懂Python命名吗?的更多相关文章

  1. 踩过了这些坑,你真的懂python基础吗?

    一.浮点数的计算 思考1:打印结果是什么? a = 0.1 b = 0.2 c = 0.3 print(b == a + a) 思考2:打印结果是什么? a = 0.1 b = 0.2 c = 0.3 ...

  2. 你真的会python嘛?

    前言 我这个博客一直都是一些技术分享,show code的地方,我从来没有写过个人生活或者情感杂谈,当然我也从来没有谈论过我对什么东西的喜恶. 很多人喜欢喷XX语言,喜欢谈论XX和YY的优缺,甚至凑了 ...

  3. python—命名规范

    文件名全小写,可使用下划线 包应该是简短的.小写的名字.如果下划线可以改善可读性可以加入.如mypackage. 模块与包的规范同.如mymodule. 类总是使用首字母大写单词串.如MyClass. ...

  4. 理解Python命名机制

    理解Python命名机制 本文最初发表于恋花蝶的博客(http://blog.csdn.net/lanphaday),欢迎转载,但必须保留此声明且不得用于商业目的.谢谢. 引子 我热情地邀请大家猜测下 ...

  5. python——双下划线与python命名机制

    python中双下划线的作用(1)所有以双下划线开头的成员是私有的(2)python对于私有变量是会进行扎压(mangling)的,扎压规则是原始定义:class A():    __function ...

  6. 你真的懂Redis的5种基本数据结构吗?

    摘要: 你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看. 本文分享自华为云社区<你真的懂Redis的5种基本数据结构吗?这些知识点或许你还需要看看>,作者:李子捌. 一 ...

  7. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  8. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  9. python—命名规范(转)

    文件名全小写,可使用下划线 包应该是简短的.小写的名字.如果下划线可以改善可读性可以加入.如mypackage. 模块与包的规范同.如mymodule. 类总是使用首字母大写单词串.如MyClass. ...

随机推荐

  1. css常见知识点总结

    CSS 中可继承与不可继承属性有哪些 可继承: 字体系列 font-family font-weight font-size 文本系列 color text-align line-height 可见系 ...

  2. DOM的事件传播机制

    在dom传播的过程中,一个事件有触发到响应,经历了三个过程: 1,目标的挖洞过程,先有html标签触发事件,然后向子标签一层一层传播,但未执行,,直到找到事件目标为止,这个过程叫做挖洞过程, 2,目标 ...

  3. html显示与隐藏元素的几种方式

    html显示与隐藏元素的几种方式 1.display none : 无 隐藏元素 block : 显示 转换为块级元素   不占位:当隐藏的时候元素就完全没有了.不能看见和操作该元素. 优点:为其他元 ...

  4. js实时监听dom尺寸变化

    开发过程中总会遇到dom节点尺寸变化,去做一些相应的逻辑,第一想到的应该是用$(window).resize()去做,但是这个是监听浏览器窗口的所以这个时候要用 ResizeObserver Resi ...

  5. HCIE笔记-第三节-数据链路层与MAC地址

    如果数据进行封装时,基于E2或者802.3标准,此时我们称之为是一个以太网数据帧. E2和802.3作用:定义帧头和帧尾的格式. 以太网是现在局域网组网的唯一标准. 数据:对于下层的每个层级而言,上层 ...

  6. XGBoost文本分类,多分类、二分类、10-Fold(K-Fold)

    做机器学习的时候经常用到XGB,简单记录一下 K折交叉验证也是模型常用的优化方法.一起记录... K折交叉验证:类似三个臭皮匠,顶个诸葛亮.我的理解是,就是用民主投票的方式,选取票数最高的那个当结果. ...

  7. 从零开始,开发一个 Web Office 套件(16):拖动控制点,调整编辑器大小

    这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...

  8. 常用的Linux 系统备份、恢复命令

    公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 删库跑路的事常常听说,不过,这只能是个调侃的话题,真正的工作中可不能这么干,否则,库是删了,路怕是跑不了了. 所以,备份很重 ...

  9. go-micro集成RabbitMQ实战和原理

    在go-micro中异步消息的收发是通过Broker这个组件来完成的,底层实现有RabbitMQ.Kafka.Redis等等很多种方式,这篇文章主要介绍go-micro使用RabbitMQ收发数据的方 ...

  10. UDP协议,多道技术,进程,同步与异步,阻塞与非阻塞

    UDP协议 简介 UDP叫做用户数据报协议,是OSI七层参考模型中传输层使用的协议,他提供的是不可靠传输,既它在传输过程 中不保证数据的完整性! 端口号 UDP使用IP地址和端口号进行标识,以此将数据 ...