了解为什么说 Python 内置函数并不是万能的?-Python教程

资源魔 23 0

python视频教程栏目带各人意识 Python 内置函数。

正在Python猫的上一篇文章中,咱们比照了两种创立列表的办法,即字面量用法 [] 与内置类型用法 list(),进而剖析出它们正在运转速率上的差别。

正在剖析为何 list() 会更慢的时分,文中说到它需求通过称号查找与函数挪用两个步骤,那末,这就引出了一个新的成绩:list() 没有是内置类型么,为何它不克不及间接就挪用创立列表的逻辑呢?也就是说,为何诠释器必需通过称号查找,能力“意识”到该做甚么呢?

其实缘由很简略:内置函数/内置类型的称号并非要害字,它们只是诠释器内置的一种便捷性能,不便开发者开箱即用罢了。

PS:内置函数 built-in function 以及内置类型 built-in type 很类似,但 list() 实际是一种内置类型而没有是内置函数。我曾对这两种易混杂的概念做过辨析,请查看这篇文章。为了不便了解与表述,如下统称为内置函数。

一、内置函数的查找优先级最低

内置函数的称号其实不属于要害字,它们是能够被从新赋值的。

比方上面这个例子:

# 失常挪用内置函数list(range(3))  # 后果:[0, 1, 2]# 界说恣意函数,而后赋值给 listdef test(n):
    print("Hello World!")
list = test
list(range(3)) # 后果:Hello World!复制代码

正在这个例子中,咱们将自界说的 test 赋值给了 list,顺序并无报错。这个例子乃至还能够改为间接界说新的同名函数,即"def list(): …"。

这阐明了 list 并非 Python 限定的要害字/保存字。

查看民间文档,能够发现 Python 3.9 有 35 个要害字,明细以下:

假如咱们将上例的 test 赋值给恣意一个要害字,例如"pass=test",就会报错:SyntaxError: invalid syntax。

由此,咱们能够从这个角度看出内置函数并非全能的:它们的称号其实不像要害字那般稳定没有变,尽管它们处正在零碎内置作用域里,然而却能够被用户部分作用域的工具所轻松阻拦掉!

由于诠释器查找称号的程序是“部分作用域->全局作用域->内置作用域”,因而内置函数实际上是处正在最低优先级。

关于老手来讲,这有肯定的可能会发作意想没有到的状况(内置函数有 69 个,要全记住是有难度的)。

那末,为何 Python 没有把一切内置函数的称号都设为不成复写的要害字呢?

一方面缘由是它想管制要害字的数目,另外一方面多是想留给用户更多的自在。内置函数只是诠释器的保举完成罢了,开发者能够依据需求,完成出与内置函数同名的函数。

不外,这样的场景少少,并且开发者普通会界说成没有同名的函数,以 Python 规范库为例,ast模块有 literal_eval() 函数(对标 eval() 内置函数)、pprint 模块有 pprint() 函数(对标 print() 内置函数)、和itertools模块有 zip_longest() 函数(对标 zip() 内置函数)……

二、内置函数可能没有是最快的

因为内置函数的称号并不是保存的要害字,和它处于称号查找的末位程序,以是内置函数有可能没有是最快的。

上篇文章展现了 [] 比 list() 快 2~3 倍的现实,其实这还能够推行到 str()、tuple()、set()、dict() 等等外置类型中,都是字面量用法稍稍快于内置类型用法。

关于这些内置类型,当咱们挪用 xxx() 时,能够简略了解成在做类的实例化。正在面向工具言语中,类先实例化再应用,这是再失常不外的。

然而,这样的做法有时也显患上繁琐。为了不便应用,Python 给一些罕用的内置类型提供了字面量示意法,也就是""、[]、()、{} 等等,示意字符串、列表、元组以及字典等数据类型。

文档出处:docs.python.org/3/reference…

普通而言,一切编程言语都必需有一些字面量示意,但根本都局限正在数字类型、字符串、布尔类型和 null 之类的根底类型。

Python 中还添加了几种数据构造类型的字面量,以是是更为不便的,同时这也诠释了为何内置函数可能没有是最快的。

普通而言,一样的齐备性能,内置函数老是比咱们自界说的函数要快,由于诠释器能够做一些底层的优化,例如 len() 内置函数一定比用户界说的 x.len() 函数快。

有些人据此构成了“内置函数老是更快”的意识误区。

诠释器内置函数绝对于用户界说函数,前者靠近于走后门;而字面量示意法绝对于内置函数,前者是正在走更快的后门。

也就是说,正在有字面量示意法的状况下,某些内置函数/内置类型并非最快的!

小结

固然,Python 自身并非全能的,那它的任何语法形成局部(内置函数/类型),就更没有是全能的了。然而,普通咱们会以为内置函数/类型总归是“出人头地”的,是遭到诸多非凡亏待的,显患上像是“全能的”。

本文从“list() 居然会败给 []”破题,从两个角度揭示了内置函数其实存正在着某种有余:内置函数的称号并非要害字,而内置作用域位于称号查找的最低优先级,因而正在挪用时,某些内置函数/类型的执行速率就显著慢于它们对应的字面量示意法。

本文对上一个“Python为何”话题做了延展探讨,一方面空虚了后面的内容,另外一方面,也有助于各人了解 Python 的几个根底概念及其完成。

假如你喜爱本文,请点赞支持下吧!另外,我还写了 20+ 篇相似的话题,请存眷Python猫查看,并正在 Github 上给我一颗小星星吧~~

相干收费学习保举:python视频教程

以上就是理解为何说 Python 内置函数并非全能的?的具体内容,更多请存眷资源魔其它相干文章!

标签: Python python教程 python编程 python使用问题 内置函数

抱歉,评论功能暂时关闭!