Python Tips概要を読む

3687 ワード

Pythonに関する知識点に精通した良い本「Python Tips」を発見し、Pythonの進級に関するテクニックを発見した.共有として価値のある内容を抜粋します.
*args and **kwargs
関数定義では*argsと*kwargsの2つの定義オブジェクトがよく見られます.*argsは関数定義のすべてのnon-keyworded(この語は本当に翻訳しにくい)の入力パラメータを表し、*kwargsはkeywordedを持つすべての入力パラメータを表し、栗を挙げる.
def test_var_args(*args, **kwargs):
    print("args:{0}, kwargs:{1}".format(args,kwargs))
test_var_args(1,2,3)
>>>args:(1, 2, 3), kwargs:{}
test_var_args(a=1,b=2,c=3)
>>>args:(), kwargs:{'a': 1, 'c': 3, 'b': 2}

この栗によってkeywordedとnon-keywordedの違いをはっきり区別することができます.本質的にargsは配列であり,kwargsは辞書である.args and*kwargsは、元のコードを変更することなく、実行時に既存のコードを動的に変更するために、装飾器に最もよく使用されます.monkey patching(サルパッチ)にも使用できます.
  • monkey patching monkey patchとは、通常startup時に動的に置き換えることを指す.geventを使ったことがあるとわかりますが、最初の場所でgevent.monkey.patch_all();標準ライブラリのthread/socketなどを置き換える.これにより、後でsocketを使用するときは、コードを変更する必要はありませんが、ブロックされていません.適用シーンには、定義された関数が大量に参照され、後でこの関数を置き換える必要がある場合は、関数の入り口で直接置き換えることが含まれます.栗を挙げて、json:
  • の代わりにujsonを
    main.py
    
    import json  
    import ujson  
    def monkey_patch_json():  
        json.__name__ = 'ujson'  
        json.dumps = ujson.dumps  
        json.loads = ujson.loads  
    
    monkey_patch_json()  
    print 'main.py',json.__name__  
    import sub  
    
    ======================
    sub.py
    
    import json  
    print 'sub.py',json.__name__
    

    jsonがこのモジュールに完全に置き換えられていることがわかり,この方法はユニットテストにも使用できる.
    Generatorsジェネレータ
    まず、iter()またはgetitem()メソッドを持つオブジェクトを区別すると、Pythonはiterableとみなされます.組み込まれたiter()関数を使用してiteratorを生成し、iteratorはnext()メソッドで次の要素を取得できます.iteratorが要素を遍歴する過程はiterationと考えられる.ジェネレータは同じ反復可能なオブジェクトですが、すべての値をメモリに保存していないため、動的に値を生成することはできません.Yieldはキーワードで、returnのように使われています.yieldはプログラムに、関数に生成器を返し、栗を挙げるように要求しています.
    def createGenerator():
        my_list=range(3)
        for  i in my_list:
            yield i*i
    gen= createGenerator() 
    print(next(gen))
    print(next(gen))
    print(next(gen))
    print(next(gen)) #StopIteration
    

    Map, Filter and Reduce
  • map Mapの定義は、ある関数をすべての入力パラメータに処理することであり、
  • と定義される.
    map(function_to_apply, list_of_inputs)
    例:
    items=[1,2,3,4,5]squared=list(map(lambda x:x**2,items))当時、この2つはlambda式によって同じ入力を複数の関数で処理することもでき、これは非常に素晴らしい変換であり、栗は以下のようにしている.
    def multiply(x):
        return (x*x)
    def add(x):
        return (x+x)
    
    funcs = [multiply, add]
    for i in range(5):
        value = list(map(lambda x: x(i), funcs))
        print(value)
    
    # Output:
    # [0, 0]
    # [1, 2]
    # [4, 4]
    # [9, 6]
    # [16, 8]
    

    不思議なことに、2つの関数は同じ入力パラメータに対して処理され、結果に返されます.
  • filter

  • filter(function_to_apply, list_of_inputs)
    ほとんどの場合、mapとfilterはlist/dict/tuple Comprehensionsで実現できます.List Comprehensions構文:[expr for iter_var in iterable]または[expr for iter_var in iterable if cond_expr]L=[expr for iter_var in iterable]:for iter_var in iterableの役割は、iterableをiter_に順次割り当てることです.var,expr for iter_var in iterableの役割はiter_に順次値を取ることですvar,exprを演算した後,ループを継続し,expr演算で得られた値を変数Lに与える.
    map
    map(function_to_apply, list_of_inputs)
    関数を使用して結果を処理し、集計結果を返します.例:
    from functools import reduce
    product = reduce((lambda x, y: x * y), [1, 2, 3, 4])
    
    # Output: 24
    

    Collections
    Collectionsには、いくつかの一般的なデータ構造が含まれています.
  • defaultdict:dictのサブクラスであり、dictのすべての方法を実現し、機能使用上はdict.setdefault()と類似しているが、defaultdict構築時にデフォルト値が与えられる.
  • orderdict:dict自己ソート.
  • counter:カウンタは、iteratorをカウントしてもよいし、listをカウントしてもよい.
  • deque:キュー.
  • nametuple:tupleから継承され、本質的には属性のみを含むクラスオブジェクトをすばやく作成する点で実用的だと思います.
  • enum:列挙タイプですが、列挙メンバー自体が列挙タイプであることに注意してください.したがって、列挙メンバーを読み書きおよび比較操作に使用する必要がある場合は、エラーが発生します.このチュートリアルでは、いくつかの協程coroutine、非同期IOの概念も説明されていますが、テクニック的な内容であり、徹底していないと一つ一つ共有されません.