web-dev-qa-db-ja.com

Pythonicコードを効果的に書くことをどのように学ぶことができますか?

「Pythonic」をグーグル検索すると、幅広い解釈が明らかになります。 wikipedia page は言う:

Pythonコミュニティの一般的な新造語はPythonicであり、プログラムスタイルに関連するさまざまな意味を持つ可能性があります。コードがPythonicであると言うことは、Python慣用句、それは自然であるか、言語に流暢であることを示します。同様に、インターフェイスまたは言語機能についてそれがPythonicであることは、Pythonイディオムは、その使用が言語の他の部分とうまく適合していることです。

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

対照的に、非Pythonicコードの特徴は、PythonでC++(またはLISP、Perl、Java)コードを書き込もうとすることです。つまり、他の言語からのフォームの慣用的な翻訳ではなく、大まかな転写を提供します。 Pythonicityの概念は、Pythonの読みやすさの最小主義の哲学と密接に結びついており、「それを行うには複数の方法がある」というアプローチを避けています。判読不能なコードや理解できないイディオムは、Pythonではありません。

「Pythonic」という用語はどういう意味ですか?実際にそれを効果的に適用する方法を教えてください。

46
user39685

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

Pythonコミュニティの一般的な新造語はPythonicであり、プログラムスタイルに関連するさまざまな意味を持つ可能性があります。コードがPythonicであると言うことは、Python慣用句、それは自然であるか、言語に流暢であることを示します。同様に、インターフェイスまたは言語機能についてそれがPythonicであることは、Pythonイディオムは、その使用が言語の他の部分とうまく適合していることです。

対照的に、非Pythonicコードの特徴は、PythonでC++(またはLISP、Perl、Java)コードを書き込もうとすることです。つまり、他の言語からのフォームの慣用的な翻訳ではなく、大まかな転写を提供します。 Pythonicityの概念は、Pythonの読みやすさの最小主義の哲学と密接に結びついており、「それを行うには複数の方法がある」というアプローチを避けています。判読不能なコードや理解できないイディオムは、Pythonではありません。

私は多くの場合、より多くの「Pythonic」の例は、実際にPythonイディオムと(また、多くの場合))コードを実質的に読み取り不可能にしようとする人々から派生していることに気づきました(これはnot Pythonicです)。

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

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


本当に、しかし、結局のところ、ソリューションが機能し、完全に維持不可能で恐ろしく遅くない場合、誰が気にかけますか?たいていの場合、あなたの仕事はタスクを完了することであり、可能な限り最もエレガントなPythonicコードを書くことではありません。


別のサイドノート(私の意見だけですが、それのために自由に投票してください;)):Pythonコミュニティにが埋められていることもわかりました)エゴのton(ほとんどのコミュニティではないではありません)、Cなどのコミュニティではもう少し普及していますそして、エゴを「パイソン的」であると誤解された解釈と組み合わせると、根拠のない否定性がたくさん生まれる傾向があります。他の人から読んだものを、一粒の塩で取りなさい。公式の基準とドキュメントに固執すれば、大丈夫。

22
Demian Brecht

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

17
World Engineer

「Pythonic」コードの記述IMHOは、言語が提供する(V)HLL機能を効果的に使用しています。ユビキタスな例として、

x, y = 7, 'fuhrer'

それはvery Pythonicです。 Pythonだけの数ヶ月後にC#の学習を始めたときのことを覚えています。

int x, y = 10, z;

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

Pythonicのもう1つの方法は、ラムダを使用することです。

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

実際には、降順でソートされたlを出力します。

それから、非常によく使われますが、あまり理解されていない「アヒルのタイピング」です-それが歩いてアヒルのように話すなら、あなたはそれをアヒルとして扱います。これはゆるく他の言語のインターフェースに関連していますOO言語です。

また、mapやreduceの使用など、該当する場合は関数型プログラミングメソッドの使用はPythonicと見なされます。

入力中に回答が投稿され、Niceリンクが含まれているのがわかりました。 PS:Pythonの知識が限られているというわけではありません。Pythonは最初の言語ではなかったため、(ほとんどの私たちのpythonistaのように) )ヘビで「慣用」を習得する必要があります!乾杯!

13
yati sagade
--> 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コードは:

  • 読みやすい
  • シンプル(できるだけシンプルですが、シンプルではありません)
  • よく考え抜かれた
7
Ethan Furman

新しい言語を学ぼうとしたときはいつでも、手の甲のようなその言語を知っている人がコードを読んで、奇妙に見えるものを探したり尋ねたりして、自分のスタイルを模倣することがやるべきこと。例:

Pythonでは、この件について説明しているので、 Dive Into Python の例は、始めるのに非常に便利です。彼らはPythonの基本を教えるだけでなく、慣用的Pythonを本当に強調する傾向があります。

Dを学ぶとき、その言語はEdgeを非常に流行っていたので、ドキュメントは当時は素晴らしかったので、コードを標準ライブラリ、具体的には Andrei Alexandrescuの傑作 に読んで学びました。

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

すべての言語で、その言語に関するStackOverflowの質問を閲覧し、人々が基本的なことを達成するために通常行うことを見ることが役立つことがわかりました。

6
dsimcha

PythonはJavaではありません は、いくつかの有用なアドバイスを提供します。どのような問題が発生しているのかがわからなければ、これ以上言うことはできませんが、別の方法python= 。

3
maxpolun

誰かが言い換えると、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
DevPlayer