web-dev-qa-db-ja.com

Pythonの「それを行う唯一の方法」の格言の具体例?

私はPythonを学び、PEP 20の次の点に興味を持っていますThe Zen of Python

それを行うには、明白な方法が1つ(できれば1つだけ)あるはずです。あなたがオランダ人でない限り、その方法は最初は明白ではないかもしれませんが。

誰かがこの格言の具体的な例を提供できますか?特にRubyなどの他の言語との対比に興味があります。 Ruby設計哲学の一部(Perlを起源とすると思いますか?))は、それを行う複数の方法がA Good Thingであることです。各アプローチの長所と短所を示す例を誰かが提供できますか?注:私はどちらが良いか(おそらく主観的になりすぎて答えられない)の答えではなく、2つのスタイルを公平に比較​​しています。

34
Charles Roper

Perlのような言語と比較して、Pythonには制御構造の数に制限があります:

  • ifのみで、unlessはありません。
  • シーケンスを反復するforのみで、foreachまたはCスタイルのforは反復しません。
  • whileのみ。ループごとに条件をチェックし、_do-while_はチェックしません。
  • _if-Elif_のみで、switchはありません。
  • コメント構文は_#_だけで、すべての行について、前の行を見なくてもコメントアウトされているかどうかを確認できます。

また、ソースをインデントする方法はほぼ1つです。創造的なインデントのほとんどのケースは構文的に除外されています。

これにより、Pythonソースの解析が人間にとって簡単になります。

組み込み型と標準ライブラリでは、最小限ではあるが完全であるようにする試みがあります。

  • 変更可能なリストでは、組み込みのlistタイプのみを使用します。 O(1)ほとんどの操作では、適切な実装を選択する必要はありません。
  • 不変リストの場合も同様に、Tupleタイプを使用するだけで、
  • マップの場合、ほとんどの場合で非常に効率的である唯一の組み込みdictを使用します。どの実装を使用するかを考える必要はありません。

Python 3はこれを整数に拡張します。整数がどんなに大きい場合でも、同じ型を使用し、強制を気にしません。

Pythonは構文糖を避けようとします。しかしときどき明白な方法を明らかにするためだけに構文糖を追加します。 「is not」は特殊なケースであるため、if not (foo is None)の代わりに_if foo is not None_を記述できます。それでも_foo is not None_は読みやすく、誤解されることはなく、考える必要はありません。明らかなことを書くだけです。

もちろん、Python canのより複雑なことのほとんどは、いくつかの方法で行われます。宣言または単純なスロット割り当てによってクラスにメソッドを追加できます。多くの創造的な方法で関数への引数など。それは、言語の内部がほとんど公開されているからです。

重要なのは、最良になることを意図した方法が常に1つあることです。他の方法が存在する場合、それらは同等の代替手段(ifunlessなど)として追加されず、内部の仕組みを公開するだけです。ゆっくりとしかし着実に、そのような代替手段は、既知の最良のメカニズムを強化することによって廃止されます(排除されません!)。

デコレータはAOP関数呼び出しをラップします。 2.6より前のバージョンでは、クラスのメタクラスを宣言するために___metaclass___マジックメンバーを使用する必要がありました。これでも同じデコレータ構文を使用できます。 3.0より前のバージョンには、バイト指向とUnicodeの2種類の文字列があり、うっかり混合してしまう可能性がありました。これで、ユニコードstrとバイナリ透過型bytesが1つだけになりました。誤って混在させることはできません。

47
9000

別の例は次のとおりです。
len()は、すべてのシーケンスに存在するメソッドではなく関数です。 Javaと比較した場合、_.length_、.size().getSize()、およびシーケンス内の要素の数を見つけるための他のメソッドがあります。 。

別の例は、.join()stringメソッドであり、すべてのシーケンスに存在するメソッドではないという事実です。結合パラメーターがリスト、セット、内包などのどれであるかを知る必要はありません。

10
Vito De Tullio

Cでは、変数の値を1つ増やすための多くの可能な方法があります:

i++     // Post-increment, returns the number before the increment
++i     // Pre-increment, returns the number after the increment
i += 1 

どちらもiの値を1だけ増やしますが、それぞれ少しずつ異なります。

Pythonでは、実際には1つの方法しかありません。追加するだけです。

i += 1

これを行うには構文的に有効な方法が複数ありますが(たとえば、i = i + 1)、同じことを同じ副作用で実行しています。

8
user32308

別の可能性はリスト内包表記かもしれません。 Pythonでは、あなたはcouldこれを行います:

new_list = []
    for item in list_of_items:
       if item < 10:
           new_list.append(item)

しかし、これを行う「明白な」方法(オランダ語を使用している場合、またはPythonに精通している場合)は、リスト内包表記を使用することになります。

new_list = [item for item in list_of_items if item < 10]

それはより短く、new_listは1つのステップで作成され、より速く実行され、エレガントです。マイナス面としては、それほど明白ではないと感じるかもしれませんが、慣れてしまえば、それは同じくらい明白だと思います。

6
Chelonian