Pythonを独自の言語として一意にする特徴は何ですか?[閉まっている]


12

Pythonを独自の言語として一意にする特徴は何ですか?良いものから悪いものまで、有用なものから障害物まで、構文から実際の使用法まで、あらゆる種類の特性を探しています。

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


9
Pythonはユニークではありません。他の言語には見られない単一のユニークな機能は含まれていません。
SKロジック

10
それは...モンティパイソンの名にちなんで名付けられています、私が知っている唯一の言語だ
ヤニス

@ SK-logicの質問は特性に関するもので、その特徴はサブセットです。Pythonに固有の特性はありませんか?
小次郎

@kojiro、「特性」の正式な定義を見たことがないので、推測したくない。
SKロジック

1
@ kojiro、PL機能は通常、構文とセマンティクスの両方として理解されています。そして、両方とも正式に定​​義されています。
SKロジック

回答:


22

あなたは絶対にユニークな機能を見つけるのに苦労するでしょう。存在するほとんどの言語機能は、開始以来複数の言語で採用されています。いくつかはまれであるかもしれません、主に彼らが新しくて、まだあいまいであるか、正当な理由で死んだので。それでも、その場合でも、機能の組み合わせを見ることをお勧めします。

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

  • メタクラスベースのメタプログラミング。基本的に、クラス作成時に任意のコードを実行します。なり非常にと素敵なクラスのカスタマイズが非常に recievingの終わりにはほとんど仕事-例えばオブジェクトリレーショナルマッピング(ORM)のために、クライアントクラスのようないくつかの余分な線でいつものように書くことができattr = SomeDataType()、コードのトンが自動的に生成されます。この例は、Djangoの「モデル」です。
  • すべてにイテレータを使用することが奨励されています。これは3.xで特に顕著であり、イテレータベースの同等物を持つほとんどのリストベースの代替物が廃止され、後者が採用されました。イテレータは、コレクションの汎用インターフェイスとしても機能します(実際にメモリ内にあるものと、必要なのは一度だけなので、以下の機能で作成するものの両方)。コレクションに依存しない、スペース効率の良い(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を区別しますが、慣れてしまえば、日常のプログラミングでは目立ちません(少なくとも私の経験では)。

私はまだRubyで少し初心者ですが、最後のポイント以外にもヒットすると思いますか?いずれにせよ、私は「ユニーク」はおそらくPythonには見られないが、「他のトップ言語では一般的ではない」ことに気付くことに同意します。
リグ

@Rig:私はRubyの専門家ではありませんが、メタクラス(Rubyはメタプログラミングに関して確かに強力であり、同様の目的に使用する可能性がありますが、私の印象はそれが異なって達成されているということです)もジェネレーターもジェネレーター式も見ませんでした(コルーチンがあるようですが)、反復可能なアンパック(マルチターゲット割り当てもあります)、Rubyの記述子もありません。はい、RubyとPythonは重複しています。しかし、違いがあります

良い、+ 1。私にとって、「ステロイドの割り当て」は実際には「貧弱な人のパターンマッチング」ですが、それでも信じられないほど便利です:)パラメータで関数を渡すのがどれほど柔軟であるかに気付くでしょう:*argsそして**kwargs、タプルと辞書をパラメータにマッピングする痛みのない方法など。
9000

CLOSの一般的なLispは、レイアウトベースの構文の使用を除くすべてのポイントに当てはまると思います。Haskellはオブジェクト指向ではありません(オブジェクト指向拡張機能はありますが)が、メタクラスポイント以外はこれらの機能のすべてに一致すると思います。
ジュール

3

Pythonをユニークなものにしているのは、公開する機能の特定の組み合わせだけだと思います。これは、ほとんどのプログラミング言語に当てはまります。

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

しかし、私はPythonにあまり流ではないので、確かに欠けているものがあるかもしれません!


@デルナン:ああ、私は「明示的に自己を正式なパラメータとして渡す」を逃しました..それが午前2時に読むために得るものだと思います;)
デミアン・ブレヒト

4
明示的な自己は、オベロンでも発生します、fwiw
grrussel

一般的なLispオブジェクトシステムでは、明示的なselfパラメータも使用されます。ただし、CLOSはマルチメソッドを提供します。つまり、selfパラメーターは、Pythonのように特別なものではありません。
ジュール

1

所有者のプロパティになる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()-オブジェクトのメモリアドレスを取得

Rubyは、Common Lisp、Clojure、および他の多くの動的言語と同様に、ほぼ同じ力を持っています。
トルビョルン

@Torbjørnどのパワー?自動ドキュメント、またはイントロスペクション機能?
小次郎

私は両方について考えていました。正確に言うのではなく、精神的に。Rubyには同じドキュメント作成能力があるとは思わないが、内省は確かだ。CLとClojureのは、両方の機能を持っている-と私はイントロスペクションは、それはですので、あなたは、Pythonで見つけるものを超えて道をそこに行くと信じていhomoiconic
トルビョルン

1
  1. Generator Expressions
  2. input()説明してみましょう、私は言語を見ていません(これまでのところ)、何かを印刷するステートメントに値を割り当てることができます、それはruby's print/getsに似ていますが、印刷に割り当てられた値で:print "Foo" bar = gets
  3. yield
  4. 多くのタイプのデータセット: ordereddict, namedtuple, array, list, tuple, dictionary

リスト内包表記を使用して、Haskellでジェネレーター式を実装できます(Haskellリストは、Pythonリストとは異なり、遅延しているため、特定の構文は必要ありません)。「入力」とは、その名前のpython 3関数を意味すると仮定します(python 2関数は危険であり、使用すべきではないため)。これはふるまいの異常な組み合わせであることは確かです(javascript-window.prompt-とBASICにありますが、Pythonはそれを借用していると思います)。しかし、プログラマーによって簡単に実装できますputStrLn s >> getStrLn "はhaskellに対して実行します)。
ジュール

Haskellのような怠zyな言語は、yieldを実際に必要としません-通常のメソッドを使用して作成されたリストを返すだけで、アイテムはオンデマンドで生成されます。それにもかかわらず、ライブラリにはコルーチンの明示的な実装が含まれています。Haskell標準ライブラリには、上記のすべてのデータ構造などが含まれています。
ジュール

-2

大事なことは、Pythonは非常に少ない構文オーバーヘッドを持つ非常に少ない言語の1つであり、リスト/セット/ dictの理解、収量、デコレーター、評価、メタクラスプログラミング、イントロスペクション、最適化された組み込みデータ構造(リスト、これらのすべてが非常に良い方法で共謀し、あなた(開発者)があなたが考えていることとほぼ同じくらい速く簡潔でエレガントなコードであなたの考えを表現する力を与えます。このキラーな機能セットを組み合わせた他の言語は、本当に考えられません。


1
Pythonの構文オーバーヘッドが低いと思う場合(わいせつに複雑な文法と比較的大量の構文シュガーがあるにもかかわらず)、Schemeをどう思いますか?
ティコンジェルビス

Evalは、実際にはどの生産プログラムにも使用すべきではありません(ただし、迅速なハックには便利です)。他の質問のコメントに示されているように、Pythonはこれらの機能を持つという点で決してユニークではありません。たとえば、clojureにはリストされているすべての機能があり、ほとんどの機能は一般的なLispで実行できると思います。
ジュール

-4

if文とループを囲むためにインデントを使用していると思います。他の言語では見たことがない。

Pythonコードを難読化するのがかなり難しくなるので、とても便利だと思います!

また、関数を除いて行ごとにきちんとした行で実行されるようであり、それもそのように解釈できます。


2
ウィキペディアは、それを行う言語でいっぱいの画面を知っています。オフサイドルールと呼ばれます。

3
私は理解しいない どういう意味ですか?
小次郎
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.