web-dev-qa-db-ja.com

Pythonはそれを独自の言語としてユニークにするいくつかの特徴は何ですか?

Pythonそれが独自の言語としてユニークにするいくつかの特徴は何ですか?私は良いものから悪いもの、邪魔に役立つもの、構文から実際の使用法まで、あらゆる種類の特徴を探しています、しかし、不明瞭でない観察は、平均的な開発者にとって最も有用でしょう。

私はここの初心者なので、直感的なことを説明する必要があるかもしれません。

12
John

あなたは絶対にユニークである機能を見つけるのに苦労するでしょう。現存するほとんどの言語機能は、当初から複数の言語で採用されています。珍しいものもあるかもしれませんが、それは主にそれらが新しくてまだ不明瞭であるか、あるいは正当な理由で絶滅したためです。それにもかかわらず、それでも、機能の組み合わせを見る方がよいでしょう。

つまり、Python=のいくつかの機能は、比較的ユニークな組み合わせになるはずです。少なくとも、ほとんどの機能セットが重複している、人気のある(そして実用的な)言語としてリモートで認識している言語はありません。コメントでは、Rubyはかなり近いですが、それでも多くの違いがあります。

  • メタクラス -ベースのメタプログラミング。基本的に、クラスの作成時に任意のコードを実行します。 veryに対応しますveryでのクラスのカスタマイズは受信側でほとんど機能しません-例オブジェクトリレーショナルマッピング(ORM)の場合、クライアントクラスはattr = SomeDataType()のような数行を追加して通常どおりに記述でき、大量のコードが自動的に生成されます。この例は Djangoの「モデル」 です。
  • everythingの反復子を使用することをお勧めします。これは特に3.xで明らかであり、イテレータベースの同等のほとんどのリストベースの代替手段は廃止され、後者が推奨されています。イテレータは、コレクションのnigh-universalインターフェースとしても機能します(実際にメモリ内にあるものと、一度だけ必要なものの両方であり、以下の機能を使用して作成します)。コレクションにとらわれない、スペース効率の良い(中間結果用のO(1)スペースは多くの場合自然に発生し、実際にメモリ内のすべてのアイテムを一度に必要とするタスクはほとんどありません)。
  • 上記に関連するジェネレータ式。多くの人は、リストの内包化(非常に便利な構文を使用した、プロセス内の別の反復可能、フィルタリング、およびマッピングからリストを作成する)について聞いたことがあるでしょう。それらを忘れてください、それらは特別な場合の構文糖です。ジェネレーター式は構文的に非常に近く、最終的には非常に同じアイテムのシーケンスになりますが、結果は遅延して生成されます(そのため、明示的に結果を保持しない限り、O(1)スペースが使用されます)。
  • yield 、主にイテレータ(ここではジェネレータと呼ばれます)の記述をはるかに効率的にしますこれらは上記の大物であり、あらゆる種類の制御フローをサポートしています。 C#にも同じキーワードを使用して類似したものがあります。しかし、yieldはまた、限られた種類のコルーチン(たとえば、Luaはより手の込んだサポートを持っています)をサポートするためにオーバーロードされていますが、難しい問題に取り組む賢い人々によってうまく利用されています。私の頭の上の2つの例: バックトレースとスタック制限なしの再帰的降下解析 および 非同期I/O (便利な構文を使用)。
  • マルチターゲット割り当てと反復可能な解凍。ステロイドの割り当て。一度に複数の値に割り当てることができるだけでなく(値を入れ替えたり、反復する場合でも-for key, value in mapping.items())、既知の長さ(正直なところ、ほとんどのタプル)のイテラブルを複数の変数にアンパックできます。 3.x以降は、長さが不明なコレクションの場合でも実用的です。単一のアイテムを取得するいくつかの変数と、残っているものを取得する変数を指定できるためです:first, *everything_in_between, last = values
  • 記述子 、属性アクセスをカスタマイズするさまざまな方法の中でおそらく最も強力です。プロパティ(C#と同じですが、特別な言語サポートはありません)、静的メソッド、クラスメソッドなどがあり、すべて記述子として実装されています。それらも一流のオブジェクトです。ほんの1週間前、私はプロパティに反復的でトリッキーなコードに直面しました。そのため、反復的な部分を生成してproperyオブジェクトにラップする小さな関数を書きました。
  • 純粋にオフサイドのルール(ブロックを区切るためのインデント)。これはわざと最後に入れました。これはPythonを区別しますが、慣れれば(または少なくとも私の経験では)、日常のプログラミングでは特に目立ちません。
22
user7043

Python=をユニークにする唯一のものは、それが公開する機能の特定の組み合わせです。これはほとんどのプログラミング言語に当てはまります。

または、1つ小さなことがあるかもしれません。Pythonが明示的にselfを他の言語で行われるオブジェクトメンバー関数に正式なパラメーターとして渡す方法を見たことはありません。物事、そしてこれが実際に何かを変える方法はわかりません。

しかし、私はPythonがあまり流暢ではないので、間違いがあるかもしれません。

3
Torbjørn
  1. _Generator Expressions_
  2. input()説明しよう。何かを出力するステートメントに値を割り当てることができる言語(これまでのところ)を見たことがない。Rubyの_print/gets_に似ているが、値が割り当てられている代わりに:_print "Foo" bar = gets_
  3. yield
  4. 多くのタイプのデータセット:_ordereddict, namedtuple, array, list, Tuple, dictionary_
1
Billjk

所有者のプロパティになるdocstringの自動処理。一般に、Pythonの優れたイントロスペクション機能はすべて、help()を使用する機能から、オブジェクトのファーストクラスのプロパティとして__doc__を使用する機能まで、非常にユニークな言語にします。例えば:

>>> class DocStringException(Exception):
...     """Error message is the same as docstring"""
...     def __str__(self):
...         return repr(self.__doc__)
... 
>>> class ExampleException(DocStringException):
...     """An example happened"""
... 
>>> raise ExampleException
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.ExampleException: 'An example happened'

その他の有用なイントロスペクション機能:

  • help/help()-インタープリターのヘルプ/オブジェクトのヘルプ
  • キーワード-pythonキーワード
  • locals()-ローカル名を取得します
  • globals()-グローバル名を取得します
  • dir()-オブジェクトのプロパティとメソッドを取得する
  • 。mroメソッド 、issubclass-継承を理解する
  • id()-オブジェクトのメモリアドレスを取得する
1
kojiro