7

你真的懂Python命名吗? - 测试蔡坨坨

 2 years ago
source link: https://www.cnblogs.com/caituotuo/p/16413917.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

转载请注明出处❤️

作者:测试蔡坨坨

原文链接: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

202206261114482.png

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

202206261123008.png

官方的意思大概是:

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

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

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

Python中使用的变量格式

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

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

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

    202206261148573.png

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

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

Python中的下划线“_”

单下划线 _

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

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

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

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

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

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

    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("测试蔡坨坨")
202206261236693.png
双前置下划线 __xx

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

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

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

202206261328526.png

后置下划线 xx_

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

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

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

def my_func(pass_):
    class_ = 1
    return class_

前后各有两个下划线 __xx__

202206261247098.png

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,都是不可取的。


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK