Pythonicコードを効果的に書く方法を学ぶにはどうすればよいですか?


46

「pythonic」のグーグル検索を行うと、幅広い解釈が明らかになります。ウィキペディアのページは言います:

Pythonコミュニティの一般的な新語法はpythonicです。これは、プログラムスタイルに関連した幅広い意味を持つことができます。コードがpythonicであると言うことは、Pythonのイディオムをうまく使用していること、自然である、または言語が流であることを示すことです。同様に、インターフェイスまたは言語機能についてpythonicであると言うことは、Pythonイディオムとうまく機能し、その使用が他の言語とうまく噛み合うと言うことです。

「unpythonic」という用語についても説明します。

対照的に、非Pythonコードの特徴は、PythonでC ++(またはLisp、Perl、Java)コードを記述しようとすることです。つまり、別の言語の形式の慣用的な翻訳ではなく、大まかな転写を提供します。pythonicityの概念は、読みやすさのPythonのミニマリスト哲学と密接に結びついており、「それを行うには複数の方法があります」アプローチを避けています。判読不能なコードまたは理解できないイディオムは、Pythonではありません。

「pythonic」という用語の意味は何ですか?実際にそれを効果的に適用する方法を学ぶにはどうすればよいですか?


6
あなたの質問はどんなプログラミング言語にも拡張できると思います。多くの場合に正確であり、改訂、読みやすさ、およびメンテナンスを改善するために、常に推奨されるプログラミング方法があります。私は...また、これらの勧告に挑戦することは、言語の進化と進歩を作ることができると思う
アミン

@アミンはとても真実。実際、言語のイディオムを正確にどこで学ぶか-すべての言語-で構成されるコミュニティWikiを検討する必要があると思います。
ヤティサガデ


1
コメンター:無関係なコメントを投稿しないでください。何らかの理由で削除されました。答えがある場合は、答えとして残してください。この質問のトピックについて議論したい場合は、チャット使用してください。

1
Pythonを練習することで!
ダイナミック

回答:


22

ほとんどの人が「Pythonic」とはどういう意味であるかについて独自の解釈を持っていることがわかりました。ウィキペディアから:

Pythonコミュニティの一般的な新語法はpythonicです。これは、プログラムスタイルに関連した幅広い意味を持つことができます。コードがpythonicであると言うことは、Pythonのイディオムをうまく使用していること、自然である、または言語が流であることを示すことです。同様に、インターフェイスまたは言語機能についてpythonicであると言うことは、Pythonイディオムとうまく機能し、その使用が他の言語とうまく噛み合うと言うことです。

対照的に、非Pythonコードの特徴は、PythonでC ++(またはLisp、Perl、Java)コードを記述しようとすることです。つまり、別の言語の形式の慣用的な翻訳ではなく、大まかな転写を提供します。pythonicityの概念は、読みやすさのPythonのミニマリスト哲学と密接に結びついており、「それを行うには複数の方法があります」アプローチを避けています。判読不能なコードまたは理解できないイディオムは、Pythonではありません。

私はないよりも倍は、より「神託」の例は、実際にPythonのイディオムと巧妙になろうとして国民に由来していると(ある事実上読めない自分のコードのレンダリング(ないよりも、再び、多くの倍)ことがわかってきたではない Python的に)。

Pythonのイディオムにこだわり、PythonでC ++(または他の言語)スタイルを使用しようとしない限り、あなたはPythonicです。

WorldEngineerが指摘したように、PEP8は従うべき優れた標準です(VIMを使用している場合は、PEP8リンティングに使用できるプラグインがあります)。


実際のところ、結局のところ、もしあなたのソリューションが機能し、完全に恐ろしく維持できず、遅くないなら、誰が気にしますか?あなたの仕事は、可能な限り最も洗練されたpythonicコードを書くのではなく、タスクを完了することです。


別のサイドノート(ちょうど私の意見では、それのためにdownvote気軽に;)):私もPythonコミュニティがで満たされることがわかってきたトン自我の(ほとんどのコミュニティがないということではありません、それはほんの少しより多くの流行ですCやPythonなどのコミュニティで)。そのため、エゴと「pythonic」であると誤解された解釈を組み合わせると、多くの根拠のない否定性が生じる傾向があります。他の人から読んだものを一粒の塩で取りましょう。公式の標準とドキュメントに固執すれば大丈夫です。


2
素敵な答えを得るために+1(OPで使用したので引用を除く)。

Ugh .. Shouldaは引用を投稿する前にOPを読み直します:P
デミアンブレヒト

3
むしろ、エゴとオンラインでアクティブであることの間には高い相関関係があり、あらゆるコミュニティで意見を表明しています。基本的に、彼らはそもそもそれほど多くを書いていないので、非自己主義的な人々をそれほど見ません。
イザランディ

17

Pythonicは、Pythonで慣用的にコーディングすることです。これは、プログラミングの観点からだけでなく、コミュニティの読書の観点からもPythonに適した構造とフォーマットを使用することを意味します。K&Rが長い間Cプログラミングスタイルの標準を設定した方法に非常によく似ています。このガイドは、Pythonで慣用的にコーディングする必要があることを示しています。PEP 8はそのガイドで参照されているので、おそらく読む価値があります。


1
@MattFenwickプログラミングとはその90%ではありませんか?優れたプログラマーはコードの読み取りに多くの時間を費やし、残りの時間に大量のコードを作成します。Pythonicコードを多く読み、Pythonで書くほど、コードはPythonicになります。ここにはショートカットはないと思います。
クリスハーパー

2
素晴らしいリンク!
イーサンファーマン

13

「Pythonic」コードを書くIMHOは、言語が提供する(V)HLL機能を効果的に利用しているだけです。遍在する例として、

x, y = 7, 'fuhrer'

それは非常に Pythonicです。Pythonのみを数か月使用した後、C#を学び始めたときのことを覚えています。

int x, y = 10, z;

どういうわけか私を混乱させましたが、C / C ++のルートに戻るには1分かかりました。

別のPython的な方法は、ラムダを使用することです。

l = [1, 2, 3, 4, 5]
print(sorted(l, key=lambda x: -x))

実際にlは降順でソートされて印刷されます。

次に、非常によく使用されますが、あまり理解されていない「カモタイピング」があります。カモのように歩き、話している場合、カモとして扱います。これは、他のオブジェクト指向言語のインターフェイスと大まかに関連しています。

また、mapやreduceの使用など、該当する場合は関数型プログラミング手法を使用することもpythonicと見なされます。

入力中に回答が投稿されたのを見て、素敵なリンクが含まれています。PS:Pythonの知識が限られているわけではありません。Pythonはあなたの第一言語ではなかったに違いないので、(ほとんどのpythonistaのように)ヘビで「イディオマティック」を習得する必要があります。乾杯!


入力中にリンクが既に投稿されたため、リンクは含めませんでした-WorldEngineerの答え:)あなたや他の人のために言語機能を「活用する」ことを考えてください。そのリンク
yati sagade

4
実際には、多くの紛争ことmapreducelambdaおよびなどは、それ自体慣用されています。リスト内包表記とジェネレーター式は代替手段であり、多くの場合、合理的に可能な限りそれらを好みます(特に、ラムダが必要な場合はノイズが少なくなります)。それらには確かに用途があり、関数型プログラミングは他のイディオム(例えば装飾者)で示されています。

@delnanは同意しました-そしてPython 3に関してはさらにそうです。結論は、機能的な機能は必要な場所で正確に使用されるべきだということです。そして、それ(それを行う明白な方法は1つしかありません)は慣用的です:)
yati sagade

個人的に、最初の例に対する人々の好みを理解したことはありません。これは、精神的に解析する方がはるかに簡単である(どちらであるのPythonの禅、コードはより頻繁にそれが書かれているよりも、読まれる):(x, y) = (7, 'fuhrer')-まだ私はほとんどの場合、括弧なしでそれを書くための最良の方法であることを「修正」しています!
イズカタ

2
あなたの特定のソートの例は、pythonicではないと主張します。できれば、なぜ再導入するだけで、ラムダで並べ替えprint(sorted(l, reverse=True))に加えて、明示的に何が起こっているのか、読者に伝えています。あなたの最初の例もまた議論の余地があると思います。2つの割り当てが1つに圧縮されています。大丈夫ですが、あまりPythonicとは言いません。読者は、2つの課題を持っている場合と比較して、それが何をするかをより長く見る必要があります。
フレネル

7
--> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

Pythonicコードは次のとおりです。

  • 読みやすい
  • シンプル(可能な限りシンプルだがシンプルではない)
  • よく考えた

1
+1。PythonのZenは、イディオムのリストに従うよりもPythonコードを書くために重要です。後者はすべての状況をカバーするわけではありません。
ドーバル14年

6

新しい言語を学ぼうとするたびに、手の甲のような言語を知っている人がコードを読んで、奇妙に見えるものを調べたり、質問したりして、自分のスタイルを模倣しようとすることがわかりました最善のこと。例:

Pythonについては、私たちが主題であるため、Dive Into Pythonのサンプルが開始に非常に役立つことがわかりました。彼らはPythonの基本を教えるだけでなく、イディオムの Python を本当に強調する傾向があります。

Dを学習するとき、言語は非常に最先端であったため当時はドキュメントが素晴らしくなかったので、標準ライブラリ、特にAndrei Alexandrescuの傑作のいくつかをコードを読むことで学びました。

C ++を学習するとき、私はかなり優れたC ++プログラマーからコードベースを継承し、STLコンテナーを参照で渡すなどの主張から、慣用的なC ++プログラミングについて多くのことを学びました。

すべての言語で、その言語に関するStackOverflowの質問を参照し、基本的なことを達成するために人々が通常行うことを確認すると役立ちます。


+1言語の基本を理解したら、コードを読むことは本を読むことよりもはるかに役立ちます。
ペース

3

PythonはJavaではないので、役に立つアドバイスがあります。どんな問題に遭遇しているか知らずにこれ以上言うことはできませんが、別の言語(この場合は特にJava)から来たプログラマーがPythonを異なる方法で実行するための非常に具体的なアドバイスです。


2

誰かが言い換えて、Pythonicとは何かを学ぶために、いくつかのコードを打ち消すように言いました。私はそれに同意しません。高密度のコードを書くのが好きなら、それでPythonicになることはありません。

自分自身に関する限り、Pythonicとは何かを定義するのに役立つ1つの方法は、「なぜPython言語を使用するのか」と自問してみてください。それについてあなたにアピールするものは何ですか?

私にとっては、読みやすさとコンパイルとオープンソースの欠如(ほとんどすべて)です。たくさんのライブラリをダウンロードして、他の多くの言語よりもライセンスに関するストレスが少ないソースコードを読むことができます。

私にとってPythonは視覚的に美しいです。Guido(Pythonの作成者)は、PEPSへの返信と議論を通じて、彼が言語を作成した方法に対する彼の選択が、作成方法に関する私自身のアイデアよりも優れていることを証明しています。

私にとって、優れたプログラマーとは、コーディングの際にどの方向に進むべきかについて、十分な情報に基づいた意思決定スキルを備えた人です。私にとって、Pythonはこれらの選択を迅速に行うのに役立ちます。

明示的な型キャストの代わりにアヒルの入力を許可することでソースコードの構文を簡素化し、コードをレビューするコーダーが「振る舞いの良いコーダー」を期待することで、私も「Pythonic」と呼ぶものができます。

したがって、Pythonicには2つの側面があります。1つは構文的で、もう1つは実践です。「Pythonic」とは何かの深い側面を説明する方法

Pythonでは、これを行うことは大したことではありません:alist = ['one'、 'two'、 'three \ n'] alist.append((1234、 'Atuple'))

そして、タプルはオブジェクトタイプに関係なくリストに追加されます。Pythonicの部分は、あなたがこれを行うことができるということではありませんが、あなたのコードはこれを期待し、ただ動作/適応するべきです。

-alist-オブジェクトで動作するものはすべて、他のコーダーが入ってリストに非文字列を追加し、新しいコーダーによるソースコードの適応を難しくするべきではないという考えで記述する必要があります。結局のところ、ducktypeの利点です。


-2

おすすめの本を買う。それを読んで。言語を使用する良い基礎を提供し、コミュニティスタイルに合ったメカニズムで提供する必要があります。

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