ホームページ  >  記事  >  バックエンド開発  >  Python の組み込み関数がすべてではない理由を理解していますか?

Python の組み込み関数がすべてではない理由を理解していますか?

coldplay.xixi
coldplay.xixi転載
2020-10-21 17:12:461633ブラウズ

Python ビデオ チュートリアル コラムでは、Python の組み込み関数を紹介します。

Python の組み込み関数がすべてではない理由を理解していますか?

Python Cat の前回の記事では、リストを作成する 2 つの方法、つまりリテラルの使用方法を比較しました。走行速度の違いを分析する内蔵タイプ。

list() が遅い理由を分析すると、名前検索と関数呼び出しの 2 つのステップが必要であると記事に記載されていましたが、これは新たな疑問につながります。組み込み型?なぜリスト作成ロジックを直接呼び出せないのでしょうか?つまり、インタプリタは何をすべきかを「知る」ために、なぜ名前検索を行う必要があるのでしょうか?

実際、理由は非常に簡単です: 組み込み関数/組み込み型の名前はキーワードではなく、開発者が外部から使用するためにインタープリターに組み込まれた便利な関数にすぎません。ボックス。

PS: 組み込み関数は組み込み型とよく似ていますが、list() は実際には組み込み関数ではなく組み込み型です。これら 2 つの混乱する概念を分析しました。この記事を参照してください。理解と表現を容易にするために、以下ではこれらを総称して組み込み関数と呼びます。

1. 組み込み関数の検索優先順位は最も低くなります

組み込み関数の名前はキーワードではなく、再割り当てすることができます。

たとえば、次の例:

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

Python の組み込み関数がすべてではない理由を理解していますか?

この例では、カスタム テストをリストに割り当てましたが、プログラムはカスタム テストを割り当てませんでした。エラーを報告してください。この例は、同じ名前の新しい関数、つまり「def list(): ...」を直接定義するように変更することもできます。

これは、list が Python の制限されたキーワード/予約語ではないことを示しています。

公式ドキュメントを見ると、Python 3.9 には 35 個のキーワードがあることがわかります。詳細は次のとおりです。

Python の組み込み関数がすべてではない理由を理解していますか?

If we assign the test in the上記の例を「pass=test」などのキーワードに指定すると、「SyntaxError: 無効な構文」というエラーが報告されます。

この観点から、組み込み関数は全能ではないことがわかります:

関数の名前は、システムの組み込みスコープ内にありますが、キーワードほど安定していません。ユーザーのローカル スコープ内のオブジェクトによって簡単に傍受される可能性があります。

インタープリタが名前を検索する順序は「ローカル スコープ -> グローバル スコープ -> 組み込みスコープ」であるため、実際には組み込み関数の優先順位が最も低くなります。

初心者の場合、予期せぬ状況が発生する可能性があります(69 個の組み込み関数があり、すべてを覚えるのは困難です)。

それでは、

なぜ Python はすべての組み込み関数の名前をオーバーライド不可能なキーワードに設定しないのでしょうか?

その理由は、一方ではキーワードの数を制御したいということですが、他方ではユーザーにより多くの自由を残したいということもあります。組み込み関数はインタプリタの実装として推奨されるものであり、開発者は必要に応じて組み込み関数と同じ名前の関数を実装できます。

ただし、そのようなシナリオはまれであり、開発者は通常、異なる名前で関数を定義します。Python 標準ライブラリを例に取ると、

ast モジュールには literal_eval() 関数 (標準 eval ( ) 組み込み関数)、pprint モジュールには pprint() 関数があり (print() 組み込み関数と比較して)、itertools モジュールには zip_longest() があります。 function (zip() 組み込み関数と比較して) function)...

2. 組み込み関数は最速ではない可能性があります

組み込み関数の名前はfunction は予約されたキーワードではなく、名前検索シーケンスの最後にあるため、組み込み関数はおそらく最速ではありません。

Python の組み込み関数がすべてではない理由を理解していますか?

前の記事では、[] が list() より 2 ~ 3 倍高速であることを示しました。実際、これは str()、tuple() にも拡張できます。 )、set( )、dict() およびその他の組み込み型を使用する場合、リテラルの使用は組み込み型の使用よりわずかに高速です。

これらの組み込み型の場合、xxx() を呼び出すと、クラスがインスタンス化されていることが簡単に理解できます。オブジェクト指向言語では、クラスが最初にインスタンス化されてから使用されるのが通常です。

ただし、このアプローチは面倒に見える場合があります。

使いやすさを考慮して、Python では、一般的に使用されるいくつかの組み込み型、つまり文字列、リスト、タプル、辞書。

Python の組み込み関数がすべてではない理由を理解していますか?

ドキュメント ソース: docs.python.org/3/reference…

一般に、すべてのプログラミング言語には何らかのリテラル表現が必要ですが、基本的には数値型、文字列、ブール型、null などの基本型に限定されます。

Python では、いくつかのデータ構造タイプのリテラルも追加されているため、より便利になっていますが、これは、組み込み関数が最速ではない理由も説明しています。

一般的に言えば、同じ完全な関数の場合、組み込み関数は常にカスタム関数よりも高速です。これは、インタプリタがいくつかの基礎的な最適化を行うことができるためです。たとえば、len() 組み込み関数はユーザーよりも確実に高速です。 -define x .len() 関数は高速です。

このことから、「組み込み関数のほうが常に速い」という誤解を生む人もいます。

ユーザー定義関数と比較すると、インタプリタの組み込み関数はバックドアに近いですが、リテラル表現は組み込み関数に比べて高速なバックドアです。

言い換えれば、一部の組み込み関数/組み込み型は、リテラル表現がある場合には最速ではありません。

概要

確かに、Python 自体は全能ではなく、その文法コンポーネント (組み込み関数/型) も全能ではありません。しかし、一般的に私たちは、組み込み関数/型は常に「優れている」ものであり、多くの特別な優遇を受け、「全能」であるように見えると考えています。

この記事では、「list() は実際には [] に負けている」という問題を解決し、2 つの観点から実際に組み込み関数にいくつかの欠点があることを明らかにします。 組み込み関数の名前はキーワードではありませんが、組み込み関数 Scope は名前検索の優先順位が最も低いため、一部の組み込み関数/型は、呼び出されたときに対応するリテラル表現よりも実行が大幅に遅くなります。

この記事は、前のトピック「なぜ Python なのか」に関する議論を拡張したものです。一方で、前の内容を充実させるものです。また、他方で、Python のいくつかの基本概念と、その実装。

この記事が気に入ったら、「いいね」とサポートをお願いします!さらに、同様のトピックを 20 件書いています。Python猫 をフォローして閲覧し、Github で小さなスターを付けてください~~

関連の無料学習推奨事項: Python ビデオ チュートリアル

以上がPython の組み込み関数がすべてではない理由を理解していますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。