1. 先頭の 1 つのアンダースコア: _var
変数名とメソッド名に関しては、1 つのアンダースコア接頭辞には従来の意味があります。これはプログラマーへの注意喚起です。つまり、Python コミュニティはその意味について合意していますが、プログラムの動作には影響しません。
アンダースコア接頭辞の意味は、単一のアンダースコアで始まる変数またはメソッドが内部使用のみであることを他のプログラマに知らせることです。この規則は PEP 8 で定義されています。
これは Python では必須ではありません。 Python には、Java のような「プライベート」変数と「パブリック」変数の明確な区別がありません。これは、誰かが「これは実際にはクラスのパブリック インターフェイスの一部であることを意図したものではありません。そのままにしておいてください。」という小さな下線の警告サインを設置するようなものです。
場合によっては、変数に最も適切な名前がすでにキーワードによって占有されていることがあります。したがって、class や def のような名前は、Python では変数名として使用できません。この場合、次のようにアンダースコアを追加することで名前の競合を解決できます。>>> def make_object(name, class): SyntaxError: "invalid syntax" >>> def make_object(name, class_): ... passつまり、末尾の単一のアンダースコア (サフィックス) は、Python キーワードとの名前の競合を避けるための規則です。 PEP 8 では、この規則について説明しています。
3. 先頭の二重アンダースコア __var
これまで説明したすべての命名パターンの意味は、合意された規則に基づいています。二重アンダースコアで始まる Python クラス属性 (変数やメソッドを含む) の場合、状況は少し異なります。
二重アンダースコア接頭辞により、Python インタープリターはサブクラスでの名前の競合を避けるために属性名を書き換えます。
これは名前マングリングとも呼ばれます。インタープリターは、クラスが拡張されたときに競合する可能性が低くなるように変数の名前を変更します。
#これは抽象的に聞こえるかもしれません。したがって、説明するために小さなコード例をまとめました:class Test: def __init__(self): self.foo = 11 self._bar = 23 self.__baz = 23組み込みの dir() 関数を使用して、このオブジェクトのプロパティを見てみましょう:
>>> t = Test() >>> dir(t) ['_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bar', 'foo']上記は次のとおりです。オブジェクトのプロパティのリスト。このリストを見て、元の変数名
foo、_bar
、__baz
を探してみましょう - いくつかの興味深い変更に気づくでしょう。 self.foo 変数は、プロパティ リストでは変更されずに foo として表示されます。 self._bar も同様に動作します。クラス上では_bar として表示されます。前に述べたように、この場合、先頭のアンダースコアは単なる慣例です。プログラマー向けのヒントです。ただし、
self.__baz の場合は、状況が少し異なります。このリストで
__baz
__バズに何が起こったのですか?
よく見ると、このオブジェクトに
_Test__baz
Test クラスを拡張する別のクラスを作成し、コンストラクターに追加された既存のプロパティをオーバーライドしてみます。
class ExtendedTest(Test): def __init__(self): super().__init__() self.foo = 'overridden' self._bar = 'overridden' self.__baz = 'overridden'さて、foo、
_bar という値が返されると思います。および
__baz
>>> t2 = ExtendedTest() >>> t2.foo 'overridden' >>> t2._bar 'overridden' >>> t2.__baz AttributeError: "'ExtendedTest' object has no attribute '__baz'"ちょっと待って、
t2.__ baz の値を表示しようとすると AttributeError が発生するのはなぜですか?名前変更が再びトリガーされます。このオブジェクトには
__baz 属性さえないことがわかります:
>>> dir(t2) ['_ExtendedTest__baz', '_Test__baz', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bar', 'foo', 'get_vars']ご覧のとおり、偶発的な事故を防ぐために
__baz は
_ExtendedTest__baz になります。変更:
>>> t2._ExtendedTest__baz 'overridden'ただし、元の
_Test__baz はまだ存在します:
>>> t2._Test__baz 42
二重アンダースコア名の変更は、プログラマにとって完全に透過的です。次の例はこれを確認します:
class ManglingTest: def __init__(self): self.__mangled = 'hello' def get_mangled(self): return self.__mangled >>> ManglingTest().get_mangled() 'hello' >>> ManglingTest().__mangled AttributeError: "'ManglingTest' object has no attribute '__mangled'"名前の装飾はメソッド名にも適用されますか?はい、それも当てはまります。名前の装飾は、クラスのコンテキストにおける 2 つのアンダースコア文字
("dunders") で始まるすべての名前に影響します。
class MangledMethod: def __method(self): return 42 def call_it(self): return self.__method() >>> MangledMethod().__method() AttributeError: "'MangledMethod' object has no attribute '__method'" >>> MangledMethod().call_it() 42これは、おそらく驚くべき別の名前の使用法です。 変更された例:
_MangledGlobal__mangled = 23 class MangledGlobal: def test(self): return __mangled >>> MangledGlobal().test() 23この例では、
_MangledGlobal__mangled という名前のグローバル変数を宣言します。次に、MangledGlobal というクラスのコンテキストで変数にアクセスします。名前が変更されたため、クラスの test() メソッド内で
_MangledGlobal__mangled
__mangled
として参照できます。名前
__mangled は 2 つのアンダースコア文字で始まるため、Python インタープリターは名前
__mangled を
_MangledGlobal__mangled
吸収すべきことがたくさんあります。
正直に言うと、これらの例と説明は頭から出てきませんでした。これを思いつくまでには、ある程度の調査と処理が必要でした。私は常に Python を使用しており、長年にわたって使用していますが、このようなルールや特殊なケースが常に思い浮かぶわけではありません。
让这些概念完全沉浸下来,以便你能够理解名称修饰的总体思路,以及我向您展示的一些其他的行为。如果有一天你和它们不期而遇,你会知道在文档中按什么来查。
4.双前导和双末尾下划线 _var_
也许令人惊讶的是,如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被Python解释器修改:
class PrefixPostfixTest: def __init__(self): self.__bam__ = 42 >>> PrefixPostfixTest().__bam__ 42
但是,Python保留了有双前导和双末尾下划线的名称,用于特殊用途。 这样的例子有,__init_
_对象构造函数,或__call__
— 它使得一个对象可以被调用。
这些dunder方法通常被称为神奇方法 - 但Python社区中的许多人(包括我自己)都不喜欢这种方法。
最好避免在自己的程序中使用以双下划线(“dunders”)开头和结尾的名称,以避免与将来Python语言的变化产生冲突。
5.单下划线 _
按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。
例如,在下面的循环中,我们不需要访问正在运行的索引,我们可以使用“_”来表示它只是一个临时值:
>>> for _ in range(32): ... print('Hello, World.')
你也可以在拆分(unpacking)表达式中将单个下划线用作“不关心的”变量,以忽略特定的值。 同样,这个含义只是“依照约定”,并不会在Python解释器中触发特殊的行为。 单个下划线仅仅是一个有效的变量名称,会有这个用途而已。
在下面的代码示例中,我将汽车元组拆分为单独的变量,但我只对颜色和里程值感兴趣。 但是,为了使拆分表达式成功运行,我需要将包含在元组中的所有值分配给变量。 在这种情况下,“_”作为占位符变量可以派上用场:
>>> car = ('red', 'auto', 12, 3812.4) >>> color, _, _, mileage = car >>> color 'red' >>> mileage 3812.4 >>> _ 12
除了用作临时变量之外,“_”是大多数Python REPL中的一个特殊变量,它表示由解释器评估的最近一个表达式的结果。
这样就很方便了,比如你可以在一个解释器会话中访问先前计算的结果,或者,你是在动态构建多个对象并与它们交互,无需事先给这些对象分配名字:
>>> 20 + 3 23 >>> _ 23 >>> print(_) 23 >>> list() [] >>> _.append(1) >>> _.append(2) >>> _.append(3) >>> _ [1, 2, 3]
以上がPython におけるアンダースコアの意味と使い方は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

Pythonは学習と使用が簡単ですが、Cはより強力ですが複雑です。 1。Python構文は簡潔で初心者に適しています。動的なタイピングと自動メモリ管理により、使いやすくなりますが、ランタイムエラーを引き起こす可能性があります。 2.Cは、高性能アプリケーションに適した低レベルの制御と高度な機能を提供しますが、学習しきい値が高く、手動メモリとタイプの安全管理が必要です。

PythonとCは、メモリ管理と制御に大きな違いがあります。 1。Pythonは、参照カウントとガベージコレクションに基づいて自動メモリ管理を使用し、プログラマーの作業を簡素化します。 2.Cには、メモリの手動管理が必要であり、より多くの制御を提供しますが、複雑さとエラーのリスクが増加します。どの言語を選択するかは、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

科学コンピューティングにおけるPythonのアプリケーションには、データ分析、機械学習、数値シミュレーション、視覚化が含まれます。 1.numpyは、効率的な多次元配列と数学的関数を提供します。 2。ScipyはNumpy機能を拡張し、最適化と線形代数ツールを提供します。 3. Pandasは、データ処理と分析に使用されます。 4.matplotlibは、さまざまなグラフと視覚的な結果を生成するために使用されます。

PythonまたはCを選択するかどうかは、プロジェクトの要件に依存するかどうかは次のとおりです。1)Pythonは、簡潔な構文とリッチライブラリのため、迅速な発展、データサイエンス、スクリプトに適しています。 2)Cは、コンピレーションと手動メモリ管理のため、システムプログラミングやゲーム開発など、高性能および基礎となる制御を必要とするシナリオに適しています。

Pythonは、データサイエンスと機械学習で広く使用されており、主にそのシンプルさと強力なライブラリエコシステムに依存しています。 1)Pandasはデータ処理と分析に使用され、2)Numpyが効率的な数値計算を提供し、3)SCIKIT-LEARNは機械学習モデルの構築と最適化に使用されます。これらのライブラリは、Pythonをデータサイエンスと機械学習に理想的なツールにします。

Pythonを1日2時間学ぶだけで十分ですか?それはあなたの目標と学習方法に依存します。 1)明確な学習計画を策定し、2)適切な学習リソースと方法を選択します。3)実践的な実践とレビューとレビューと統合を練習および統合し、統合すると、この期間中にPythonの基本的な知識と高度な機能を徐々に習得できます。

Web開発におけるPythonの主要なアプリケーションには、DjangoおよびFlaskフレームワークの使用、API開発、データ分析と視覚化、機械学習とAI、およびパフォーマンスの最適化が含まれます。 1。DjangoandFlask Framework:Djangoは、複雑な用途の迅速な発展に適しており、Flaskは小規模または高度にカスタマイズされたプロジェクトに適しています。 2。API開発:フラスコまたはdjangorestFrameworkを使用して、Restfulapiを構築します。 3。データ分析と視覚化:Pythonを使用してデータを処理し、Webインターフェイスを介して表示します。 4。機械学習とAI:Pythonは、インテリジェントWebアプリケーションを構築するために使用されます。 5。パフォーマンスの最適化:非同期プログラミング、キャッシュ、コードを通じて最適化

Pythonは開発効率でCよりも優れていますが、Cは実行パフォーマンスが高くなっています。 1。Pythonの簡潔な構文とリッチライブラリは、開発効率を向上させます。 2.Cのコンピレーションタイプの特性とハードウェア制御により、実行パフォーマンスが向上します。選択を行うときは、プロジェクトのニーズに基づいて開発速度と実行効率を比較検討する必要があります。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

メモ帳++7.3.1
使いやすく無料のコードエディター

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ドリームウィーバー CS6
ビジュアル Web 開発ツール
