Heim  >  Artikel  >  Backend-Entwicklung  >  Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?

Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?

coldplay.xixi
coldplay.xixinach vorne
2020-10-21 17:12:461633Durchsuche

Die Spalte

Python-Video-Tutorial führt Sie in die in Python integrierten Funktionen ein.

Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?

Im vorherigen Artikel von Python Cat haben wir zwei Methoden zum Erstellen von Listen verglichen, nämlich die wörtliche Verwendung [] und die integrierte Typverwendungsliste (), und dann den Unterschied analysiert ihre Laufgeschwindigkeit. Python猫的上一篇文章中,我们对比了两种创建列表的方法,即字面量用法 [] 与内置类型用法 list(),进而分析出它们在运行速度上的差异。

在分析为什么 list() 会更慢的时候,文中说到它需要经过名称查找与函数调用两个步骤,那么,这就引出了一个新的问题:list() 不是内置类型么,为什么它不能直接就调用创建列表的逻辑呢?也就是说,为什么解释器必须经过名称查找,才能“认识”到该做什么呢?

其实原因很简单:内置函数/内置类型的名称并不是关键字,它们只是解释器内置的一种便捷功能,方便开发者开箱即用而已。

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

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

内置函数的名称并不属于关键字,它们是可以被重新赋值的。

比如下面这个例子:

# 正常调用内置函数list(range(3))  # 结果:[0, 1, 2]# 定义任意函数,然后赋值给 listdef test(n):
    print("Hello World!")
list = test
list(range(3)) # 结果:Hello World!复制代码

Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?

在这个例子中,我们将自定义的 test 赋值给了 list,程序并没有报错。这个例子甚至还可以改成直接定义新的同名函数,即"def list(): …"。

这说明了 list 并不是 Python 限定的关键字/保留字。

查看官方文档,可以发现 Python 3.9 有 35 个关键字,明细如下:

Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?

如果我们将上例的 test 赋值给任意一个关键字,例如"pass=test",就会报错:SyntaxError: invalid syntax。

由此,我们可以从这个角度看出内置函数并不是万能的:它们的名称并不像关键字那般稳固不变,虽然它们处在系统内置作用域里,但是却可以被用户局部作用域的对象所轻松拦截掉!

因为解释器查找名称的顺序是“局部作用域->全局作用域->内置作用域”,因此内置函数其实是处在最低优先级。

对于新手来说,这有一定的可能会发生意想不到的情况(内置函数有 69 个,要全记住是有难度的)。

那么,为什么 Python 不把所有内置函数的名称都设为不可复写的关键字呢?

一方面原因是它想控制关键字的数量,另一方面可能是想留给用户更多的自由。内置函数只是解释器的推荐实现而已,开发者可以根据需要,实现出与内置函数同名的函数。

不过,这样的场景极少,而且开发者一般会定义成不同名的函数,以 Python 标准库为例,ast模块有 literal_eval() 函数(对标 eval() 内置函数)、pprint 模块有 pprint() 函数(对标 print() 内置函数)、以及itertools

Bei der Analyse, warum list() langsamer ist, wurde im Artikel erwähnt, dass es zwei Schritte durchlaufen muss: Namenssuche und Funktionsaufruf. Dies führt dann zu einer neuen Frage:

list() ist kein integrierter Typ. Warum kann die Logik zum Erstellen einer Liste nicht direkt aufgerufen werden? Warum muss der Dolmetscher also eine Namenssuche durchführen, um zu „wissen“, was zu tun ist?

Tatsächlich ist der Grund ganz einfach: Die Namen integrierter Funktionen/integrierter Typen sind keine Schlüsselwörter, sondern lediglich eine praktische, in den Interpreter integrierte Funktion, die Entwickler sofort verwenden können.

Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?PS: Die integrierte Funktion ist dem integrierten Typ sehr ähnlich, aber list() ist eigentlich ein integrierter Typ und keine integrierte Funktion. Ich habe einige Analysen zu diesen beiden verwirrenden Konzepten durchgeführt. Bitte lesen Sie diesen Artikel. Um das Verständnis und den Ausdruck zu erleichtern, werden sie im Folgenden zusammenfassend als integrierte Funktionen bezeichnet.

1. Die Suchpriorität integrierter Funktionen ist am niedrigsten.

Die Namen integrierter Funktionen sind keine Schlüsselwörter und können neu zugewiesen werden.

Zum Beispiel das folgende Beispiel: rrreee

Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?

Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?In diesem Beispiel haben wir den benutzerdefinierten Test der Liste zugewiesen und das Programm hat keinen Fehler gemeldet. Dieses Beispiel kann sogar geändert werden, um direkt eine neue Funktion mit demselben Namen zu definieren, also „def list(): ...“.

Dies zeigt, dass list kein eingeschränktes Schlüsselwort/reserviertes Wort in Python ist.

🎜Wenn Sie sich die offizielle Dokumentation ansehen, können Sie feststellen, dass Python 3.9 35 Schlüsselwörter hat. Die Details lauten wie folgt: 🎜🎜Verstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?🎜🎜Wenn wir den Test im obigen Beispiel einem beliebigen Schlüsselwort zuweisen, beispielsweise „pass=test“ , wird ein Fehler gemeldet: SyntaxError: ungültige Syntax. 🎜🎜Aus dieser Perspektive können wir sehen, dass integrierte Funktionen nicht allmächtig sind: 🎜Ihre Namen sind nicht so stabil wie Schlüsselwörter. Obwohl sie sich im integrierten Bereich des Systems befinden, können sie vom Benutzer lokal verwendet werden . Scope-Objekte können leicht abgefangen werden! 🎜🎜🎜Da die Reihenfolge, in der der Interpreter nach Namen sucht, „lokaler Bereich -> globaler Bereich -> integrierter Bereich“ ist, haben integrierte Funktionen tatsächlich die niedrigste Priorität. 🎜🎜Für Anfänger können unerwartete Situationen auftreten (es gibt 69 integrierte Funktionen, es ist schwierig, sich alle zu merken). 🎜🎜Also, 🎜Warum macht Python die Namen aller integrierten Funktionen nicht zu nicht überschreibbaren Schlüsselwörtern? 🎜🎜🎜Einerseits möchte es die Anzahl der Schlüsselwörter kontrollieren und andererseits möchte es den Benutzern möglicherweise mehr Freiheiten lassen. Integrierte Funktionen sind nur empfohlene Implementierungen des Interpreters. Entwickler können je nach Bedarf Funktionen mit demselben Namen wie die integrierten Funktionen implementieren. 🎜🎜Solche Szenarien sind jedoch selten und Entwickler definieren normalerweise Funktionen mit unterschiedlichen Namen. Am Beispiel der Python-Standardbibliothek verfügt das ast-Modul über die Funktion literal_eval() (die integrierte eval(). )-Funktion), das Modul pprint verfügt über die Funktion pprint() (im Vergleich zur integrierten Funktion print()) und das Modul itertools verfügt über die Funktion zip_longest() (im Vergleich zur integrierten Funktion zip())...🎜🎜2 Die integrierte Funktion ist möglicherweise nicht die schnellste🎜🎜Da der Name der integrierten Funktion kein reserviertes Schlüsselwort ist, und das ist er auch In der letzten Reihenfolge der Namenssuche ist die integrierte Funktion möglicherweise nicht die schnellste. 🎜🎜🎜🎜🎜Der vorherige Artikel hat gezeigt, dass [] zwei bis drei Mal schneller ist als list(). Tatsächlich kann dies auch auf integrierte Typen wie str(), tuple(), set( erweitert werden. ), dict() usw. ist die Verwendung aller Literale etwas schneller als die Verwendung integrierter Typen. 🎜🎜Bei diesen integrierten Typen kann beim Aufruf von xxx() einfach verstanden werden, dass die Klasse instanziiert wird. In objektorientierten Sprachen ist es üblich, dass Klassen zuerst instanziiert und dann verwendet werden. 🎜🎜Allerdings erscheint dieser Ansatz manchmal umständlich. 🎜Zur Vereinfachung der Verwendung bietet Python Literaldarstellungen für einige häufig verwendete integrierte Typen, nämlich „“, [], (), {} usw., die Datentypen wie Zeichenfolgen, Listen, Tupel und Wörterbücher darstellen. 🎜🎜🎜🎜🎜🎜Dokumentquelle: docs.python.org/3/reference…🎜

Im Allgemeinen müssen alle Programmiersprachen eine wörtliche Darstellung haben, sie sind jedoch grundsätzlich auf numerische Typen, Zeichenfolgen, boolesche Typen und Basistypen wie Null beschränkt.

Python hat auch Literale für mehrere Datenstrukturtypen hinzugefügt, sodass es praktischer ist. Dies erklärt auch, warum die integrierten Funktionen möglicherweise nicht die schnellsten sind.

Im Allgemeinen sind integrierte Funktionen bei gleichen vollständigen Funktionen immer schneller als unsere benutzerdefinierten Funktionen, da der Interpreter einige zugrunde liegende Optimierungen durchführen kann, z. B. sind integrierte Funktionen definitiv schneller als benutzerdefinierte x .len() Die Funktion ist schnell.

Einige Leute haben auf dieser Grundlage das Missverständnis gebildet, dass „eingebaute Funktionen immer schneller sind“.

Im Vergleich zu benutzerdefinierten Funktionen befinden sich die integrierten Funktionen des Interpreters in der Nähe der Hintertür, während die wörtliche Darstellung im Vergleich zu den integrierten Funktionen eine schnellere Hintertür darstellt.

Das heißt, einige integrierte Funktionen/integrierte Typen sind nicht die schnellsten, wenn es eine wörtliche Darstellung gibt!

Zusammenfassung

Es stimmt, dass Python selbst nicht allmächtig ist und auch keine seiner grammatikalischen Komponenten (eingebaute Funktionen/Typen) allmächtig ist. Im Allgemeinen denken wir jedoch, dass integrierte Funktionen/Typen immer „überlegen“ sind, viele Sonderbehandlungen erhalten und „allmächtig“ erscheinen.

Dieser Artikel löst das Problem „list() verliert tatsächlich gegen []“ und zeigt, dass es tatsächlich einige Mängel integrierter Funktionen aus zwei Perspektiven gibt: Der Name der integrierten Funktion ist kein Schlüsselwort und Der integrierte Bereich befindet sich in der Namenssuche mit der niedrigsten Priorität, daher werden einige integrierte Funktionen/Typen beim Aufruf deutlich langsamer ausgeführt als ihre entsprechenden Literaldarstellungen.

Dieser Artikel erweitert die Diskussion zum vorherigen Thema „Warum Python“. Einerseits bereichert er den vorherigen Inhalt und hilft andererseits auch jedem, mehrere grundlegende Konzepte von Python und seiner Implementierung zu verstehen.

Wenn Ihnen dieser Artikel gefällt, liken Sie ihn bitte und unterstützen Sie ihn! Darüber hinaus habe ich auch über 20 ähnliche Themen geschrieben. Bitte folgen Sie Python猫, um es sich anzusehen, und geben Sie mir einen kleinen Stern auf Github~~

Verwandte kostenlose Lernempfehlungen: Python-Video-Tutorial

Das obige ist der detaillierte Inhalt vonVerstehen Sie, warum die integrierten Funktionen von Python nicht alles sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen