Tips of Python

7538 ワード

Pythonのコード
  • は、英字を扱うためにASCIIコードを生成する.
  • は、中国語文字を扱うためにGB 2312を生成する.
  • 各国の文字を扱うためにUnicodeが生まれた.
  • Unicodeのストレージと伝送性能を向上させるために、Unicodeの実装形態であるUTF−8が生成される.
  • Python 2のデフォルトの文字符号化はASCII符号であり、符号化フォーマットが指定されていない場合はASCII符号化処理に従う.
  • Python 2の文字列にはstrとunicodeの2種類があります.
  • decode()メソッドは、他の符号化文字をUnicode符号化文字
  • に変換する.
  • encode()メソッドは、Unicode符号化文字を他の符号化文字に変換する.
  • Python 3のソースコード.pyファイルのデフォルトの符号化方式はUTF-8なので、Python 3ではpyスクリプトにcoding宣言を書く必要がなく、pythonに渡される文字はシステムのデフォルト符号化の影響を受けず、unicode符号化に統一することができます.

  • with使用
    ソース:https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/
  • with文は、リソースにアクセスする場合に適用され、使用中に異常が発生するかどうかにかかわらず、必要な「クリーンアップ」操作が実行されることを確保し、ファイルの使用後に自動的に閉じる、スレッド内のロックの自動取得と解放などのリソースを解放する.
  • コンテキストマネージャ(context)があれば、with文は動作します.以上のコードopen(r'somefileName')はいわゆるcontextである.
  • with open(r'somefileName') as somefile:
        for line in somefile:
            print line
            # ...more code
    

    ここではwith文を使用し、ファイルの処理中に異常が発生したかどうかにかかわらず、with文の実行が完了した後に開いているファイルハンドルが閉じられていることを保証します.従来のtry/finallyパターンを使用する場合は、次のようなコードを使用します.
    somefile = open(r'somefileName')
    try:
        for line in somefile:
            print line
            # ...more code
    finally:
        somefile.close()
    

    context
    参照先:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001478651770626de401ff1c0d94f379774cabd842222ff000
    global
    参照先:http://www.cnblogs.com/summer-cool/p/3884595.html変数名解析:LEGB原則:関数に認証されていない変数名を使用する場合、Pythonは4つの役割ドメイン[ローカル役割ドメイン(L)(関数内部宣言はglobalを使用していない変数)を検索し、その後は前の階層のdefまたはlambdaのローカル役割ドメイン(E)であり、その後はグローバル役割ドメイン(G)(関数でglobalを使用して宣言された変数またはモジュール層で宣言された変数)であり、最後に内蔵役割ドメイン(B)(すなわちpythonの内蔵クラスや関数など)である]そして、最初にこの変数名を見つけることができる場所で止まります.変数名が検索中に見つからない場合、Pythonはエラーを報告します.
    もし私が関数に変数を使用した後に修正(すなわち再付与)することができるならば、どのように関数の中で使用する変数がモジュール層で定義されたグローバル変数であり、関数内部のローカル変数ではないようにしますか?このときglobal修飾子が役に立ちます.
    hehe=6
    def f():
        global hehe
        print(hehe)
        hehe=3
    f()
    print(hehe) 
    

    グローバル変数であるheheheをglobal修飾子で宣言した後(global文ではglobal hehehehe=3のような同時付与は許されないことに注意)、上記出力は6と3であり、我々が望む効果を得た.
    theading
    参照先:http://www.jianshu.com/p/f61f39345f27 http://www.jianshu.com/p/a82bcb776cfa
    #coding=utf-8
    import time
    import threading
    import random
    MONEY = 0#    MONEY
    gLock = threading.Lock()# 
    #   
    def procuder():
        global MONEY#        
        rand_money = random.randint(10,100)#        
        gLock.acquire()# acquire()   
        MONEY += rand_money
        gLock.release()#   
        print '   %s-   :%d' % (threading.current_thread, MONEY)
        time.sleep(2)#  
    
    #   
    def customer():
        global MONEY #        
        rand_money = random.randint(10,100)#        
        if MONEY > rand_money:
            print '   %s-   :%d' %(threading.current_thread,rand_money)
            gLock.acquire()#  
            MONEY -= rand_money
            gLock.release()#  
        else:
            print '       :%d,   :%d' %(rand_money,MONEY)
    if __name__ == "__main__":
        while True:
            procuder()
            customer()
    

    Pythonでstatic、classメソッドを使用する方法
  • 静的方法@staticmethod装飾器:クラス内の方法はインスタンス化を必要とせずに使用でき、selfパラメータを持たない.
  • クラスメソッド,@classmethodデコレーション:クラス内のメソッドはインスタンス化する必要がなく使用でき、最初のパラメータはデフォルトで現在のクラス(非インスタンス)です.

  • コードの説明:
    class Kls(object):
        def __init__(self, data):
            self.data = data
    
        def printd(self):
            print(self.data)
    
        @staticmethod
        def smethod(*arg):
            print('Static:', arg)
    
        @classmethod
        def cmethod(*arg):
            print('Class:', arg)
    
    
    ik = Kls(23)
    ik.printd()
    # 23
    ik.smethod()
    # ('Static:', ())
    ik.cmethod()
    # ('Class:', (,))
    Kls.printd()
    # TypeError: unbound method printd() must be called with Kls instance as
    # first argument (got nothing instead)
    Kls.smethod()
    # ('Static:', ())
    Kls.cmethod()
    # ('Class:', (,))
    

    fomatフォーマット文字列
    参照先:https://www.2cto.com/kf/201312/262068.html
    文字列のパラメータは{NUM}で表され、0は1番目のパラメータ、1は2番目のパラメータを表し、以降順次加算される.「:」を使用して、要素を表すために必要な操作を指定します.たとえば、「:.3」小数点3桁、「:8」が8文字空間などを占めます.また、「b」-バイナリなどの特定のアルファベットを追加することもできる.数字を2を基数として出力.c'-文字.印刷前に整数を対応するUnicode文字列に変換する.d′-十進法整数.数字を10を基数として出力.o'-8進法数字を8を基数として出力.x'-16進法数字を16を基数として出力し、9以上の桁数を小文字とする.e′-べき乗記号.科学カウント法で数字を印刷し、「e」でべき乗を表す.g'-一般フォーマット.数値をfixed-point形式で出力.数値が特に大きい場合はべき乗で印刷する.n′-数字.値が整数の場合は「d」と同じ、値が浮動小数点数の場合は「g」と同じである.異なるのは、領域設定に基づいて数値区切り記号が挿入されます.'%'-百分率数値に100を乗じてfixed-point('f')形式で印刷すると、値の後ろにパーセンテージが表示されます.
    age = 25  
    name = 'Caroline'  
      
    print('{0} is {1} years old. '.format(name, age)) #      
    print('{0} is a girl. '.format(name))  
    print('{0:.3} is a decimal. '.format(1/3)) #        
    print('{0:_^11} is a 11 length. '.format(name)) #  _      
    print('{first} is as {second}. '.format(first=name, second='Wendy')) #      
    print('My name is {0.name}'.format(open('out.txt', 'w'))) #      
    print('My name is {0:8}.'.format('Fred')) #     
    

    出力:
    Caroline is 25 years old.   
    Caroline is a girl.   
    0.333 is a decimal.   
    _Caroline__ is a 11 length.   
    Caroline is as Wendy.   
    My name is out.txt  
    My name is Fred
    

    evalの使用
    リスト、tuple、dict、stringを互いに変換することができます.
    #################################################
            
    >>>a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
    >>>type(a)
    
    >>> b = eval(a)
    >>> print b
    [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
    >>> type(b)
    
    #################################################
            
    >>> a = "{1: 'a', 2: 'b'}"
    >>> type(a)
    
    >>> b = eval(a)
    >>> print b
    {1: 'a', 2: 'b'}
    >>> type(b)
    
    #################################################
            
    >>> a = "([1,2], [3,4], [5,6], [7,8], (9,0))"
    >>> type(a)
    
    >>> b = eval(a)
    >>> print b
    ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))
    >>> type(b)
    
    

    generator
    generateの作成方法:
  • 反復器生成:
  • >>> g = (x * x for x in range(10))
    >>> g
     at 0x104feab40>
    

    2.yield生成:
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
    

    このとき生成されるオブジェクトの1つは、関数インスタンスではなく、generatorオブジェクトです.
  • は、generatorオブジェクトに対してnextメソッドを実行すると、現在のyield戻り値まで実行され、次にnextオペレーションが実行されると、yieldが再び戻り値に遭遇するまで、前回実行された場所で実行を継続する.nextメソッドの後にyield文がない場合は、エラーが表示されます.
  • sendメソッドには、前回保留されたyield文の戻り値を指定するパラメータがあります.したがって、yieldのパラメータがsend(この場合、Nonesned(None)に等しい)でない限り、前回のnext()の実行が存在しない場合は、エラーが発生します.例:
  • 
    def MyGenerator():
        value = (yield 1)
        value = (yield value)
     
    gen = MyGenerator()
    print gen.next()
    print gen.send(2)
    print gen.send(3)
    

    出力:
    
    1
    2
    Traceback (most recent call last):
      File "test.py", line 18, in 
        print gen.send(3)
    StopIteration