Code Like a Pythonista:Idiomatic Pythonノート


Code Like a Pythonista: Idiomatic Python
C++の基礎があれば、別の言語を学ぶのは比較的簡単です.C++はプロセス向けであり,オブジェクト向けであるからである.Cのように機械にアクセスできますテンプレート、STLなども高級です.「C++オブジェクトモデルに深く入り込む」を真剣に読んだことがあれば、他の言語はこれほど複雑ではないと思います.C++に対する理解が深ければ深いほど、他の言語で書かれたコードはC++のようになり、新しい言語の価値を体現できません.だから、新しい言語を学ぶには、コードスタイルを含め、既存の潜在意識を捨てなければならない.
 
1. The Zen of Python (1)
美しさは醜さよりもはっきりしていて、隠すよりも簡単で複雑で複雑で、難解よりも平らで、ネストよりも松の結合が緊密な結合よりも可読性が高いのは、これらの条項を破るのに価値のある特殊な条件ではありませんが実践が理論を打ち負かした純潔な誤りは永遠に隠さないでください.明確にそれを鎮めない限り......
2.PEP 8:Style Guide for Python Pythonに関する重要なスタイルガイドライン
Whitespace1
  • レベルごとに4つのスペースに整列
  • 硬tab
  • なし
  • tabとスペースを
  • に混用しないでください.
  • 関数間に1行の空白
  • を残す.
  • 類の間に2行の空白
  • を残す.
    Whitespace 2
  • ディクショナリ、リスト、メタグループ、パラメータリストの」、「後にスペースを追加、ディクショナリで」、「後にスペース
  • も追加
  • 賦値または比較子の間にスペース
  • を付ける
  • は括弧の中で重要に空白で、関数名と括弧も空白ではありません
  • docstringsですぐにスペースを空けないでください
  • Naming
  • joined_lowerは関数、メソッド、プロパティ
  • に使用されます.
  • joined_lowerまたはALL_CAPS定数
  • StudlyCapsはクラスに使用され、前にC
  • を追加する必要はありません.
  • #1文字あたり
  • camelCaseは、既存の慣例
  • を互換化するためにのみ使用される.
  • プロパティ:interface,internal, __private.しかし、後者は絶対に使用しないでください.

  • C++/Javaからのクラスへのアクセス権限が気になりすぎます.PythonでMyClass._privateはMyClassに直接解析されます.MyClass__privateは、「視覚的」にアクセスできないためです.Pythonには「we'reall consenting adults here」という原則があります.あなたは私に何かを隠す理由はありません.子クラスは親から属性を継承する権利がありますが、親クラスは拒否ではなく、子クラスに関連ドキュメントを提供して上書きを支援する義務があります.
    Python提唱使用_internalはプライベート属性を表し、コマンド空間の制限はなく、善意で「be careful with this,it's an internalimplementation detail;don't touch it if you don't fully understand it」と注意しただけだ.
    Long Lines&Continuationsかっこ内の改行は隠し改行を使用しますが、位置合わせに注意してください
    def __init__(self, first, second, third,
            fourth, fifth, sixth):
        output = (first + second + third
            + fourth + fifth + sixth)
    
    その他の改行には「」を使用します.後ろにスペースがないように注意してください.
    LongStringsはC言語と同様に、2つの隣接する文字列をコンパイラによって自動的に接続することができます.一つ違いは、C言語では文字列が1つの形式しか使われていないことです.「」ですが、Pythonでは「」、「」、「r」、「」、「」などがあります.しかし、原理は同じです.
     
    コンビネーションステートメント
    Pythonでは複数の文を同じ行に書くことは提唱されていません.例えばif文などです.Pythonはインデントでコードを表示する構造と流れに非常にこだわっている.
    交換値Pythonのメタグループはとても面白くてC言語系の人に気づかれません.
    b, a = a, b
    メタグループは非常に汎用性があり、リストとメタグループを簡単に交換することができます.
    a = [12, 34, 45]
    b, c, d = a
    
    メタグループは、複数のインデックスを一度に処理するためにfor文でもよく使用されます.
    >>> people = [l, ['Guido', 'BDFL', 'unlisted']]
    >>> for (name, title, phone) in people:
    ...     print name, phone

    More About Tuples Tuplesの構造が最も重要なのは",".たとえば、
    >>> 1,
    (1,)
    上に括弧がなくても構いません.
    Interactive “_” インタプリタで_前回の演算の結果を表すために使用します.このメカニズムは往々にして使用に大きな便利さを与えます!
    Building String from Substrings、、これはPythonの世界で普及しているはずだ.join()はforループ接続リストの代わりにのみ使用できます
    colors = ['red', 'blue', 'green', 'yellow']
    result = ''
    for s in colors:
        result += s
    result = ''.join(colors)#これは上のforサイクルよりも効率的です
    Used in where possibleまず、inはキーワードではなくオペレータです.次に、このオペレータはすべての組み込みウィンドウでサポートされます.著者が強調したいのは
    inよく使われる場所は2つあります:1.forに合わせて遍歴を実行する.2.ifとともに使用判断が存在する.
    著者らは,辞書リロードのin操作はオブジェクトがすべてのkeysであるため,d.keys()取得キーのリストを呼び出す必要はなく,inを用いるのではなく,in dをそのまま用いることでよいと繰り返し強調している.
    Dictionary get Methodは辞書にkeyを追加する際、元のkeyが存在するかどうかを判断することが多い.元の値に対していくつかの操作を行うだけであれば、getメソッドは非常に適しています.
    get(key,default):  key  ,  key   ,   default。

    Dictionary setdefault Methodの前節が取得であれば、対応する設定があります.setdefaultの意味は「set if necessary,the get」であり、まずkeyが存在するかどうかを判断し、存在しない場合は値を設定し、そうでない場合は既存の値を返す.cookbookという本では、この関数がチェーンテーブルの辞書に役立つと述べています.
    defaultdictは辞書から派生したもので、その名の通りデフォルトの値があります(実際には関数を介しています).この辞書の生成はsetdefaultの呼び出しを簡略化することに由来し,後でsetdefaultを使用する場合,この特化した辞書の代替を考慮することができる.
    PS:このクラスはcollectionsモジュールに由来し、キュー、OrdereDict、Mutablesetなど、他の有用なモジュールも含まれています.
    Building Dictionaryは、2つのシーケンスを辞書に組み合わせます.1つのシーケンスはキーで、もう1つは値です.この操作にはzip組合せを用いる慣用がある.
    given = ['John', 'Eric', 'Terry', 'Michael']
    family = ['Cleese', 'Idle', 'Gilliam', 'Palin']
    pythons = dict(zip(given, family))

    Test for Truth Value Pythonでは条件判断時にTrueやFalseと比較するのではなく、内蔵変換やnotで直接判断するのが好きではありません.このようにするとコードがより簡潔になります.次はTrueとFalseを判断する完全な表です.
    False
    True
    False (== 0)
    True (== 1)
    "" (empty string)
    any string but "" ("", "anything")
    0, 0.0
    any number but 0 (1, 0.1, -1, 3.14)
    [], (), {}, set()
    any non-empty container ([0], (None,), [''])
    None
    almost any object that's not explicitly False
    Index&Item:enumerate enumerate関数の大きな特徴はgenerator関数なので、場合によっては効率がいいことです.Indexに関する場合、この関数は最も多く使われるはずです.Python言語のforループの生まれつきの欠陥のため、この効果を達成するにはrangeを使ってインデックスを合わせなければなりません.この欠陥だからこそ、この関数が生まれたのです!これはSTLのように多くの人が反復器で遍歴することをお勧めし、声明が冗長すぎると感じている人がいるので、C++0 xでautoキーワードを発売しました.
    Default Parameter Valueには最初は非常に不可解なコードが現れました
    def bad_append(new_item, a_list=[]):
        a_list.append(new_item)
        return a_list
    >>> print bad_append('one')
    ['one']
    >>> print bad_append('two')
    ['one', 'two']
    問題の原因は、a_listは変数で、宣言時に空のlistとして定義されます.リストはmutableオブジェクト~~~~~~~~~~~~~~
    最終的に私はその原因を見つけた.関数宣言時に空のlist('[]'),a_を作成しました.リストはこの空のリストのLabelにすぎない.コンパイラで、a_リストは、あるグローバルリストのアドレス「参照」として指定されます.最初にappend(‘on’)を呼び出すと、その空のlistが[‘one’]になり、関数が終了するとこのlistは回収されないので、次の呼び出し時に発生します!
    Advanced%String Formatting%は、文字列内にオブジェクト名を書くという興味深い使い方があります.
    values = {'name': name, 'messages': messages}
    print ('Hello %(name)s, you have %(messages)i ' % values)
    このような書き方の利点は、印刷フォーマットを変更する場合には、中身を変更するだけでよいことである.通常、valuesはlocals()に取って代わり、このような柔軟なメカニズムは非常にすごいです.たとえば、ある関数に文字列を入力すると、印刷の内容を指定できます.
    Generator Expression(ジェネレータ式)GEはlistcomprehension(リスト解析)と非常に似ています
    リスト解析:構文:[expr for iter_var in iterable]または[expr for iter_var in iterable ifcond_expr]
    ジェネレータ式:構文:(expr for iter_var in iterable)または(expr for iter_var in iterable if cond_expr)
    ジェネレータ式は、リストの解析よりも遅く、リストではなく「ジェネレータ」を返す利点があります.
     
    ジェネレータはPythonで従来のforサイクルの代わりに推奨されているが,本質的には同じサポートレベルであるため,多くの地方生リストで発揮される地方成器も代替できる.リストが一時的にのみ使用される場合、ジェネレータはメモリ上でよりよく動作する可能性があります.
     
    Reading Lines From Text/Data Fileコードをご覧ください
    datafile = open('datafile')
    for line in datafile:
        do_something(line)
    readlinesメソッドを使用する人は少なくないかもしれませんが、小さなファイルについては違いはありませんが、大きなファイルの前者は効率が高くなります.