Python 面试时千万别这样命名函数,因为这个被淘汰可太不值了

在《11款常用的Python虚拟环境管理器》这篇文章中,我介绍了 Python 的虚拟环境,不知道大家有没有自己动手尝试一下。

如果还没有,建议大家亲自安装试一试,找到最适合自己的 Python 虚拟环境管理器。

本篇文章我想给大家讲讲 Python 标识符命名的规范。

为什么要讲标识符命名呢?我给大家讲一个朋友的经历,大家就知道了。

我有位朋友,咱们就叫他小白哥吧。

小白哥刚大学毕业那会儿,想转行做 Python 数据分析,自学了一段时间,就去面试了。

只不过,在头一次面试中他很快就被淘汰了。

为什么呢?请大家看下他写的代码。

import pandas as pd

# 读取 Excel 文件中的数据
wenjian = 'shuju.xlsx'
shuju = pd.read_excel(wenjian, sheet_name='Sheet1')

# 显示前五行数据
print(shuju.head())

# 处理缺失值
quchuqueshizhi = shuju.dropna()

# 显示处理后的数据
print(quchuqueshizhi.head())

咱也不多写了,就说面试官一看他那代码,把他给 pass 了。

小白哥还追着问面试官问为啥啊,我这 Pandas 用得挺好的呀,数据都出来了,也统计对了。

面试官笑了一下,告诉他,就冲你这命名方式,我就能看出你的进步空间还很大,继续努力吧,我看好你。

要知道,专业且规范的标识命名能体现出一位开发者的基本素养,也是一个开发团队协作的重要基础。

如果连命名规范都做不好,在面试时可就会贻笑大方啦。

废话不多说,我尽量以最简洁清晰的方式,以给函数命名为例,给大家介绍一下 Python 中给标识符命名的路数应该是怎样的。

注:Python 代码风格指南(https://peps.python.org/pep-0008/),即 PEP 8,包含更多命名规范相关内容,有兴趣的朋友可以去看一下。

标识符命名的一些基本规则

Python 的标识符包括变量、常量、函数、类、类的方法、类的属性等。标识符的命名规则主要有以下几点。

  • 要遵循 Python 命名惯例 ~ PEP8。
  • 标识符的名称可以使用大小写英文字母、0~9、下划线等字符。
  • 标识符的名称不能以数字开头。
  • 标识符的名称支持使用中文、日文等 Unicode 字符,但为了代码易读、易懂,不推荐使用。
  • 标识符的名称最好只使用 ASCII 中的字符,让代码更好读。
  • 标识符的名称要清晰易懂,容易理解才能易于维护。
  • 除非团队约定或行内约定俗成,不要使用单个字母或英文单词简写命名。
  • 不要使用拼音命名。

函数命名的一些基本规则

  • 函数名应清晰、简洁地说明函数要执行的操作。如,read()
  • 函数名应使用英文的动词或以动词开头的多个单词。如,read_excel()
  • 函数名要使用小写字母,如 find()
  • 函数命名要遵循蛇形命名法。即,如果在函数名中包含多个单词,则要使用下划线分隔单词。如 read_data_for_groupby()
  • 蛇形命名法是 PEP 8 中函数命名的首选方法

有效的函数名

  • find(),有效。
  • user_name(),有效,但不推荐,因为没有表现出函数要执行的动作。
  • get_99_user_name(),有效。
  • _get_users(),可以以下划线为开头。
  • 获取用户名(),Unicode 中的字符是有效的,但不推荐使用。
  • hello⁀world() 作为 Unicode 中的标点符号是有效的,但不推荐使用。

无效命名

  • 10_users(),不能以数字开头。
  • save_success!(),除了下划线,不允许使用叹号、问号等其他 ASCII 标点符号。

包含下划线的命名法

  • 当函数名以单下划线开头时,如 _get_users(),表示这个函数是内部的,不能在模块外部使用。
  • 当函数名以单下划线结尾时,可以避免你的函数名与 Python 内置函数名或关键字发生冲突。如 import_(),可以避免与关键字 import 冲突, max_() 可以避免与内置函数 max() 冲突。
  • 当函数名以双下划线开头时,主要用于类中的方法或属性,也被称为名称修饰。Python 解释器会修改使用这种命名方式定义类的属性或方法的名称,不能在类之外,甚至在子类中访问该命名法定义的方法或属性。这个知识点属于类的内容,不在此赘述。
  • 双下划线开头和结尾的命名法被称为 dunder 命名法,dunder 是 double underscore 的简写。在 Python 中这种方式也叫魔术方法,这种命名法主要用于定义类的方法和变量,示例如下。
class UserInfo:
    def __init__(self, id_number, username):
        self.id_number = id_number
        self.username = username

    def __repr__(self):
        return (
          f"{type(self).__name__}({self.id_number}, {self.username})"
        )

UserInfo 类中就包含了两个魔术方法。

  • .__init__() 在创建类的实例时被调用,用于初始化对象。
  • .__repr__() 定义对象的字符串表示,包括类名及其参数的信息。

Python 内置的魔术方法很多,以后会有专门的文章介绍。现在你只需要记住 dunder 命名法主要是用于 Python 内置的方法,自定义方法时应避免这种命名方式。

函数名要清晰易懂

代码清晰易懂是成熟开发者的重要标志。那么,如何才能起一个可读性强的函数名呢?

例如,要编写获取单词首字母的函数。

如果函数名如下例所示,则既难理解该函数的目的,也容易引起混淆。

def init(n):
    return " ".join(f"{i[0]}." for i in n.split())

initinitial 的简写形式, 即首字母的意思,但它也有初始化的意思。

如果使用简写形式,既容易与 __init__() 混淆,还可能会被误解为初始化。

因此,在起函数名时,尽量不要使用英文简写。

当然,更不要使用汉语拼音和单个字母

那这个名字应该怎么起好呢?我们在这里可以根据函数的功能 ~ “获取首字母”,起一个直观的名字。如 get_initials(),这个名字就很清晰了。

当然也可以加入参数名和介词,如 get_initials_from(fullname),这样是不是就更直观了?

大家不要害怕函数名太长会增加输入的负担,现代 IDE 都支持代码自动补全,可以帮你快速输入较长的名称。

但也不要矫枉过正,还是要避免给函数起过长的名字。这就需要你折中取舍了,不过不用担心,只要遵循本文的原则,你很快就会熟练起来的。

方法的命名惯例

方法(method)是什么?越是简单的名词越难以理解,我之前就搞不明白方法与函数的区别。

其实,方法和函数没有什么本质上的区别,它只是在类中定义的函数,约定俗成地把它叫作“方法”罢了。

因此,在命名方法时也要遵循函数的命名惯例,使用蛇形命名法,并应以动词或动词开头的多个单词命名。如 check_user_age()show_use_info()

如果要在类定义某个方法,但又不想将其作为类的接口,并且不需要调用类中的这个方法时,则可以在方法名称前添加单个下划线,如 _check_user_age()

这种方式不能阻止直接调用该方法,示例如下。

class UserInfo:
    def _check_user_age(self, age):
        return self.age >= age

在 REPL 中输入如下代码,可以发现返回的内容。

>>> from user_info import UserInfo
>>> user = UserInfo("Johnson", 50)
>>> user._check_user_age(25)
False

以下划线开头的 _check_user_age() 方法不会在 VSCode 等 IDE 的代码自动补全提示中显示。但像在 REPL 中一样,我们仍可以输入并调用该方法。

到这里基本上就讲完了函数名/方法名的命名规则了。下面再简单介绍一下命名函数与命名其他标识符的异同之处。

函数与其他标识符命名规则的相同点

  • 都不能以数字开头。
  • 都不能有除下划线以外的 ASCII 标点符号。
  • 都尽量避免使用单个字母或英文简写命名,除非是大家约定俗成的简写方式。
  • 变量也要使用小写字母命名。
  • 变量也要使用蛇形命名法。

函数与其他标识符命名规则的不同点

  • 类使用首字母大写的方式命名。
  • 类不使用蛇形命名法,而是使用大驼峰命名法,即所有首字母都大写,如 UserInfor
  • 还有一个是常量,常量也使用大写字母命名,但使用下划线分割多个单词。如 TIME_LIMIT

结语

本文主要介绍了以下知识点。

  • Python 的代码风格指南(PEP8)是 Python 好好学习的参考手册,这里介绍一个支持库,叫 autopep8,大家可以安装使用。
  • Python 标识符的命名基本规则。
  • Python 函数/方法命名的基本规则与示例。
  • 下划线在标识符命名中的特殊作用。
  • 函数与其他标识符的命名的异同。

总之,Python 标识符的命名很重要,既涉及代码可读性,也涉及开发团队的协作,大家一定要规范命名。

如果你觉得这篇文章对你有帮助,可以去关注Python学研大本营哦。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容