关于LeetCode中Python与Python3版本代码语法差异的疑问
首先明确版本对应关系
LeetCode上标注为「Python」的运行环境是已经停止维护的 Python 2.7 版本,标注为「Python 3」的是目前仍在迭代、所有学习资料和新项目通用的Python 3.x系列,两个大版本存在不兼容的语法差异,新手学习全程用Python3即可,不需要特意适配Python2。
你看到的两种函数头的具体差异
你观察到的写法区别不全是版本差异,是语法特性、编码规范、模板设计共同导致的:
关于类型标注部分
LeetCode Python3环境里的函数头:def twoSum(self, nums: List[int], target: int) -> List[int]:里面的
: List[int]、-> List[int]是Python 3.5版本之后新增的**类型提示(Type Hints)**语法:- 参数名后接
: 类型用于标注这个参数期望接收的数据类型 - 函数括号后接
-> 类型用于标注函数的返回值类型 - 这个语法是完全可选的,不会在代码运行时强制做类型校验,作用是方便IDE补全、静态工具查错、帮读代码的人快速理解参数要求,LeetCode只是把它写在默认模板里,你就算把所有类型标注删掉,写成
def twoSum(self, nums, target):,在Python3环境里也能正常运行。
你之前接触到的写法:
def two_sum(list, int):这里的
list和int根本不是类型声明,是参数名——很多入门教程为了让新手快速理解参数含义,会直接用类型名当参数名,示意第一个位置传列表、第二个位置传整数。这种写法在Python2和Python3里语法上都合法,但非常不推荐,因为会覆盖Python内置的list()、int()方法,很容易引发奇怪的bug。- 参数名后接
关于
self参数和函数名的差异
函数头里的self是类实例方法的固定第一个参数,和Python版本没有关系——不管Python2还是Python3,只要把函数写在类里面作为实例方法,就需要带这个参数。LeetCode的模板默认把解题代码封装成类的方法,所以会带上self,你自己平时写独立的函数完全不需要加这个参数。
至于函数名twoSum(驼峰命名)和two_sum(蛇形命名)只是编码风格差异,和版本无关,只要符合命名规则怎么写都可以。
新手学习提示
不用花精力研究Python2的语法差异,现在所有公开教程、生产环境的项目都已经迁移到Python3,你在LeetCode刷题直接选Python3环境即可。类型提示属于进阶可选语法,刚入门的时候完全可以先不写,等熟悉基础语法之后再慢慢用就行。
内容的提问来源于stack exchange,提问作者mybraincellssayhi

