2009-02-19 14 views
15

私はビルドスクリプトなどを実装しながらPythonを学んでいます。そして、スクリプトが彼らがする必要があることを行うという点で、すべてのことがうまくいきます。しかし、私は "The Python Way"のような何かが欠けていると感じています。ビルドスクリプトとグルースクリプトは実際には最もエキサイティングな開発作業ではなく、Pythonの真のパワーを明らかにする候補にはならないかもしれませんが、私の心が吹き飛ぶ機会がまだあります。私は主にC#で開発しています。私のPythonコードは、多くのC#コードと構造やスタイルが非常に似ています。言い換えれば、私はC#で考えるのと同じように思えるが、Pythonで書いている。Python:何か不足していますか?

本当に何か不足していますか?

(注:私はこれはあまりプログラミングの問題ではない、それは非常に広範だとあなたがしなければならない場合、決定的な答えはそう忘却の彼方にダウン私を国防省がないことがわかります。)

+0

メモ当たり学び、これは...「Python的」リンクの –

答えて

35

Generators, Iteratorsitertools以上、すべてList Comprehensionsをお読みください。

これらはPythonicの何かの柱です。それ以外は、PEP-8です。

これらの概念を読み、適切な場所で使用してみてください。ではごきげんよう!

PS:import thisに忘れないでください。)

補遺:私もここにこのスレッドで他の人によって与えられたいくつかの優れた提案を集約します:David Grantから

+0

ジェネレータとリスト内包の組み合わせは素晴らしいようです。私はそれらの多くを使用すると思う。ありがとう。 :) –

+1

itertoolsは本当に上品なことをするための素晴らしいモジュールです。そのことはしばしば忘れられています。 –

+3

pythonは、ジェネレータ、イテレータ、itertools、リスト内包、またはPEPSの存在の前にすでに非常に有用な言語であったことを忘れないでください! –

16

はありません - これは他のC言語のようなものからPythonに移行する人には一般的です。私はあなたが探しているものがあなたのコードをもっと作る方法だと信じています"Pythonic"。良い知らせは、あなたが書いたPythonのほうがPythonのほうが多いほどです。 「これをもっと簡単にするにはどうすればよいのか」の態度は自然に溢れています。

もう1つの良い場所はThe Zen of Pythonです。 Python開発に対するこのような態度も、同じ点であなたを助けます。

+0

おかげでコミュニティのwikiの議論に適している可能性があります。それは私に今何のために撮影するかの良いアイデアを与えました。 –

+0

"Pythonic"リンクが壊れています! – alexpinho98

3

アンドリュー・うさぎとBaishampayan Ghoseの答えに追加することを学ぶ...

どの言語のイディオムでも、そのイディオムで書かれたコードを読む必要があります。私はまだPythonのイディオムを学んでいますが、私はこれを他の言語で使っています。リスト内包表記について読むことができますが、電球は実際にそのようなものが使用されているときにのみ表示され、「うわー、それは最高です!2行のコードとはっきりしています!興味深いコードを見つけて、それを読んで理解してください。あなたが働いているプログラムの文脈の中ですべてを見れば、知識はあなたの頭の中でより良くなります。

5

最近、私はPythonでthe Project Eulerの問題を解決して自分のPythonを学習しています。これは私のために本当によく働いている理由:

  1. それは楽しさと競争力があるので、私はそれがパフォーマンスを得るために、本当に自然な方法でPythonのデータ構造を使用するために私を強制的に
  2. を続けるためにやる気です私は必要なので、リスト、セット、文字列、繰り返しなどについて多くのことを教えてくれました。
  3. 問題の大部分は解決するコードページよりも少なくて済むので、もっと多くの時間に研磨や書き換えエレガントな方法
  4. Pythonは大きな整数に簡単に対処するので、正しい言語のように感じるだけです

私はこれを徹底的にお勧めします。

+0

私はまた、PythonでProject Euler問題のいくつかをやっていることを学びました。特に組み込み関数とitertoolsモジュールを使用したPythonの関数型プログラミングの側面。 –

1

ビルドスクリプトと手がかりスクリプト[sic]は、実際には最もエキサイティングな開発作業ではありませんが、完全にPythonの真のパワーを明らかにする候補です。

まず、既にPythonで書かれたさまざまなmake-likeツールを見てください。

この池の大きな魚はScons:http://www.scons.org/です。これについて学ぶ。

代替http://farmdev.com/thoughts/46/the-python-make-tool/

についてこのブログ記事の協議は「私はまだ私の心が吹きする機会たい」グーグルで起動します。すでにあなたがしようとしているものの一部または全部を行うPythonツールを見つけます行う。コードを減らし、ダウンロードしてもっと読む。

+0

[Fabric](http:// fabfile)はPythonの非常に優れた設計で、ビルドではなくリモート実行に重点を置くもうひとつのインスピレーションツールです。 –

5

あなたが書いていないPythonを読んでいますか?

ここには、.pycファイルと.pyoファイルを削除するPython 2.6.1ディストリビューションのスクリプトがあります。

#!/usr/local/bin/python 
"""Recursively zap all .pyc and .pyo files""" 
import os 
import sys 

# set doit true to actually delete files 
# set doit false to just print what would be deleted 
doit = 1 

def main(): 
    if not sys.argv[1:]: 
     if os.name == 'mac': 
      import EasyDialogs 
      dir = EasyDialogs.AskFolder(message='Directory to zap pyc files in') 
      if not dir: 
       sys.exit(0) 
      zappyc(dir) 
     else: 
      print 'Usage: zappyc dir ...' 
      sys.exit(1) 
    for dir in sys.argv[1:]: 
     zappyc(dir) 

def zappyc(dir): 
    os.path.walk(dir, walker, None) 

def walker(dummy, top, names): 
    for name in names: 
     if name[-4:] in ('.pyc', '.pyo'): 
      path = os.path.join(top, name) 
      print 'Zapping', path 
      if doit: 
       os.unlink(path) 

if __name__ == '__main__': 
    main() 

これでいくつのPythonの慣用表現を見つけることができますか?

+1

4。もちろん、私は2つの反イディオムも見つけました。 ;-) –

6

あなたは間違いなくあなたのpythonでのシステムプログラミングやって起動時に、この話を見てみる必要があります。http://www.dabeaz.com/generators/

+0

ああ、それはいくつかのクールなものそれらの発電機です! –

0

を私は個人的なPythonの教祖を見つけることを示唆しています。それらのコードのいくつかを表示して、それを熟読Pythonにレビュー/書き直してもらう。あなたは啓発されるでしょう。

0

TLHOLADAYをエコーするには、標準ライブラリを読んでください。それは "pythonic"のものです。そこに良い感じが得られない場合は、sqlachemyまたはdjangoのソース、または選択したプロジェクトを読んでください。

2

Pythonコードを書き、レビューとフィードバック用に投稿してください。

4

はこのように考える:

  • あなたは少しの仕事のためのあまりを作成している場合は、何かが間違っている、これはニシキヘビではありません。

あなたが書くほとんどのPythonコードは、非常に簡単で直接的なものです。通常、単純な作業ではあまり多くの作業を必要としません。あなたがあまりにも多くを書いているならば、より良い方法があれば、やめてください。 (これは私がPythonで多くのことを学んだ方法です)

1

Generators、Iterators、List Comprehensionsなどは別として、他の人にも言及していますが、誰かが「ピジョンソニック」のやり方でやり遂げようとしています。デコレータとメタクラスです。

デコレータの場合は、this stackoverflowの回答をお勧めします。メタクラスの場合は、thisまで行ってください。

+0

多くの人がメタクラスを工夫しすぎていると考えており、現在では(2.6+)クラスのデコレータは、ほとんどのメタクラスのユースケースでより多くのpythonicソリューションを提供しています。しかし、 'class'文が新しい名前空間でその本体を単に実行し、その結果を' type(name、bases、content_dict) 'に渡すことは素晴らしいことです。 –

2

よく設計されたPythonic API /フレームワークを研究します。最高のもののいくつかは標準ライブラリの外にあります。彼らがあなたに許可するものはではなく、です。私のお気に入り:

  • py.testは(JUnitのに基づいていた)unittestのよりニシキヘビです。 unittest.TestCaseから継承するクラスの代わりに、test_foo()関数を書くだけです。 self.assertEqual(x, y)の代わりにassert x == yを実行してください。もっと多くのグッズ...

    • Doctestはunittestよりもpythonicです。多くの人は実際の煩わしさのためにそれをあきらめますが、そのアイデアは素晴らしいです。

    • あなたが深くテストしているのであれば、モジュールの動作 - >アサーションアプローチは、競合するライブラリのレコード - >再生パラダイムよりもPythonです。

  • requests httplib + urllibは+ urllib2のよりずっといい、私が今まで見た中で最もクリーンなAPI年代の一つです。

  • JSONとYAMLは、さらにPythonic than XMLです。

    • JSON-RPCは、XMLRPC又はシャダー SOAPよりニシキヘビです。

    • ElementTreeはDOMよりはるかにpythonic APIです。 .textまたは子供のいずれかを持つタグを最適化すると、XML < - >データ構造のインピーダンスの不一致が軽減されます(しかし、.tailのハックを介して混在したコンテンツを引き続き往復することができます)。

  • Scapyネットワークパケットを送信し、解剖のために驚くほど簡潔なフレームワークです。

  • 私はStormがそこで最もpythonのオブジェクトリレーショナルマッピングであると信じています。免責事項:ORMに関する経験はほとんどありません。

  • heapqは美しく実装されたモジュールです。ちょうどコードを読んでください。

  • itertoolsは非常に強力です。ドキュメントのすべての例を読んでください。
    意見は広範囲にそれを使用して、少なくともあなたが使用している最後のバージョンのために、「Pythonで何が新しくなったのか」を読ん

:-)ニシキヘビや奇妙な方言であるかどうかで異なります。いくつかのPEPを読んでください。 を理解してくださいなぜ変更が改善です。

最後に、インタラクティブなPythonを最大限活用してください。 APIを学ぶ最も良い方法は、それらを試してみることです。マルチライン編集、完了、簡単なヘルプ()アクセスには必須の機能があります - ipython(ノートブックを含む)、dreampie、bpythonをチェックしてください。あなたは、Pythonの禅の隣にあなたのコードを入れて、あなたがそこに半分の方法です、それについての良い感じることができる場合

0

import this

。またthis.pyモジュールをチェックしてください。ちょっと皮肉です。

残りの半分のようなものについて学んでいる

正規表現リスト内包発電メタクラス、と」、デコレータ、ステッピングリスト、を開梱引数'ステートメント条件付き割り当て、強力な組み込み関数などenumerate()マップ()ジップ()は)(任意の()POW()を削減し、他の多くは、あなたが他の読むことができる道に沿って

(多くのためHidden features of Pythonをご確認ください)人々のコードを修正して変更します。

Finnaly約finallyimport antigravity