モジュール、オブジェクト向け

11596 ワード

1.内蔵関数(下)
  • filter(関数、シーケンス)
  • def f(x):
        if x % 2 == 0:  #   
            return True
    print filter(f,range(10))
    print filter(None,range(10))  #None          
    

    実行結果:
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/t.py
    [0, 2, 4, 6, 8]
    [1, 2, 3, 4, 5, 6, 7, 8, 9]
    
  • zipマージリスト
  • l1 = [1,2,3]
    l2 = ['a','b','c']
    print zip(l1,l2)    #    
    print dict(zip(l1,l2))    #        
    

    実行結果
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/t.py
    [(1, 'a'), (2, 'b'), (3, 'c')]
    {1: 'a', 2: 'b', 3: 'c'}
    
  • map(関数、シーケンス)
  • def f(x):
       if x % 2 == 0:
            return True
    print map(f,range(10))  #  True  False
    print map(None,range(10))
    

    実行結果:
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/t.py
    [True, None, True, None, True, None, True, None, True, None]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    フィルタと比較してmapが対象とするオブジェクトはシーケンス内の要素であり,要素に対応する処理結果を返す.filterはシーケンス自体に対して,関数条件に合致する値を返す.
    def f(x,y):
        return x * y
    print map(f,[1,2,3],[2,4,3])  #  x*y  
    

    実行結果:
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/t.py
    [2, 8, 9]
    
  • reduce(関数、シーケンス)、左から右へ各要素について
  • を処理する.
    Help on built-in function reduce in module __builtin__:
    
    reduce(...)
        reduce(function, sequence[, initial]) -> value
        
        Apply a function of two arguments cumulatively to the items of a sequence,
        from left to right, so as to reduce the sequence to a single value.
        For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
        ((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
        of the sequence in the calculation, and serves as a default when the
        sequence is empty.
    
  • filter/mapとlambdaを併用
  • print filter(lambda x:x % 2 == 0,range(10))  #
    [0, 2, 4, 6, 8]
    
    print map(lambda x,y:x*y, range(5),range(5))
    [0, 1, 4, 9, 16]
    
    print reduce(lambda x,y:x+y, range(1,101))
         5050
    
  • リスト式--リスト書き換え
  • In [2]: [i*2+10 for i in range(10)]  #i 1-10  ,  i*2+10
    Out[2]: [10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
    
    In [3]: [i for i in range(10) if i%3 == 0]  #i 1-10  ,   3    
    Out[3]: [0, 3, 6, 9]
    

    mapとfilterを比較できます
    2.モジュール
  • モジュールはPython組織コードの基本方式である.
  • 1つのPythonスクリプトは単独で実行することも、別のスクリプトにインポートして実行することもできます.スクリプトがインポートされて実行されると、モジュール(module)と呼ばれます.
  • のすべてです.pyファイルはいずれもモジュールとして
  • にインポートできます.
  • モジュール名スクリプトのファイル名と同じ
  • 例えばhelloという名前を書きましたpyのスクリプトは、別のスクリプトでimport hello文でインポートできます.

  • 3.パッケージ
  • Pythonのモジュールは、ディレクトリ別にパッケージのパッケージを作成するには、次の手順に従います.
  • パッケージ名という名前のディレクトリ
  • を作成
  • このディレクトリの下にinitを作成する.pyファイル、空の
  • 必要に応じて、スクリプトファイルまたはコンパイル済み拡張子およびサブパッケージ
  • がディレクトリの下に格納される.
  • import pack.m1, pack.m2, pack.m3

  • sys.path表示モジュール所在ディレクトリ
  • In [6]: import sys
    
    In [7]: sys.path  #      
    Out[7]: 
    ['',
     '/usr/bin',
     '/usr/lib64/python27.zip',
     '/usr/lib64/python2.7',
     '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk',
     '/usr/lib64/python2.7/lib-old',
     '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages/IPython/extensions']
    

    リストである以上、カスタムパスを挿入したい場合は、使用できます.Insert挿入、またはappendを最後に追加
    In [9]: sys.path.insert(1,'/root/py')  #         ,     '/root/py'
    
    In [10]: sys.path
    Out[10]: 
    ['',
     '/root/py',    #    
     '/usr/bin',
     '/usr/lib64/python27.zip',
     '/usr/lib64/python2.7',
     '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk',
     '/usr/lib64/python2.7/lib-old',
     '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages/IPython/extensions']
    

    カスタムディレクトリを削除するには、次の手順に従います.
    In [23]: sys.path.remove('/root/py')
    
    In [24]: sys.path
    Out[24]: 
    ['',
     '/usr/bin',
     '/usr/lib64/python27.zip',
     '/usr/lib64/python2.7',
     '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk',
     '/usr/lib64/python2.7/lib-old',
     '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages/IPython/extensions']
    
  • まとめ:
  • モジュールはインポート可能なPythonスクリプトファイルです.パッケージはディレクトリ別のモジュールとサブパッケージで、ディレクトリの下にinitがあります.pyファイル.このファイルはパッケージの情報を格納できます.モジュールとパッケージをインポートする構文:import,import as from...import...
    4.モジュールの作成とインポートの練習
  • 作成モジュール
  • #!/usr/bin/python
    # -*- coding:utf8 -*-
    # author: chawn
    # date:
    
    def wordCount(s):
        #      ,    
        chars = len(s)
        #      ,     ,       
        words = len(s.split())
        #     ,         
        lines = s.count('
    ') print lines,words,chars s = open('/etc/passwd').read() wordCount(s)

    実行結果はwcと同じです.
    [root@t1 py]# python 2.py 
    31 56 1484
    [root@t1 py]# wc /etc/passwd
      31   56 1484 /etc/passwd
    
  • インポートモジュール新規スクリプト3.py、中にimport 1と書いてありますが、import 1は書けません.py,実行3.py
  • [root@t1 py]# vi 3.py
    [root@t1 py]# python 3.py 
      File "3.py", line 2
        import 1.py
                ^
    SyntaxError: invalid syntax
    

    モジュール名は数字で始まることができないので、名前を変えて再試行します.
    [root@t1 py]# vi 3.py
    [root@t1 py]# python 3.py 
    31 56 1484
    
    [root@t1 py]# cat 3.py
    #!/usr/bin/python
    import wc
    

    このとき実行に成功し、wcの先頭のファイルを見ると、wcが1つ増えた.pyc、これはコンパイルされたファイルで、次回より早くwcモジュールを呼び出すのに便利です.
    [root@t1 py]# ls wc*
    wc.py  wc.pyc
    
  • 通常、モジュールを呼び出すのは、ここでは3.py行wcを1行追加する.wordCount('asd'):
  • [root@t1 py]# python 3.py 
    31 56 1484
    0 1 3
    

    2行目は所望の結果ですが、1行目はモジュールが持参した結果であり、必要ありません.簡単な方法は直接モジュールに入ってコードを注釈することであり、互いに干渉しない方法もある.まず紹介しますname_,実行結果は_main_
    [root@t1 py]# cat wc.py
    #!/usr/bin/python
    # -*- coding:utf8 -*-
    # author: chawn
    # date:
    
    def wordCount(s):
        #      ,    
        chars = len(s)
        #      ,     ,       
        words = len(s.split())
        #     ,         
        lines = s.count('
    ') print lines,words,chars print __name__ #s = open('/etc/passwd').read() #wordCount(s)
    [root@t1 py]# python wc.py
    __main__
    

    以上、モジュールが実行中にnameがmainであれば、モジュールが持参したコマンドを出力し、そうでなければ実行しないと判断することができる.次を見てください.
    [root@t1 py]# cat wc.py
    #!/usr/bin/python
    # -*- coding:utf8 -*-
    # author: chawn
    # date:
    
    def wordCount(s):
        #      ,    
        chars = len(s)
        #      ,     ,       
        words = len(s.split())
        #     ,         
        lines = s.count('
    ') print lines,words,chars if __name__ == '__main__': s = open('/etc/passwd').read() wordCount(s)

    それぞれwcを実行する.pyと3.py、結果は互いに干渉しないで、まさに必要です
    [root@t1 py]# python wc.py
    31 56 1484
    [root@t1 py]# python 3.py
    0 1 3
    

    5.パッケージのインポート
  • int.pyを作成します.パッケージには
  • が必要です.
  • パッケージ名は、現在存在するディレクトリ名
  • である.
  • ロールバック親ディレクトリ(デフォルトでは現在のディレクトリからパッケージを探しますが、この場合はパッケージをファイルとして理解できます)
  • に入ります.
  • ipythonテスト
  • に入ります
    In [1]: from d08 import wc
    
    In [2]: wc.wordCount('123
    ') 1 1 4

    任意のディレクトリでipythonテストに入りたい場合はsys.pathインポートパッケージが存在するディレクトリのパス:
    In [1]: import sys
    In [3]: sys.path.append('/root/py')  #     
    
    In [4]: sys.path
    Out[4]: 
    ['',
     '/usr/bin',
     '/usr/lib64/python27.zip',
     '/usr/lib64/python2.7',
     '/usr/lib64/python2.7/plat-linux2',
     '/usr/lib64/python2.7/lib-tk',
     '/usr/lib64/python2.7/lib-old',
     '/usr/lib64/python2.7/lib-dynload',
     '/usr/lib64/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages',
     '/usr/lib/python2.7/site-packages/IPython/extensions',
     '/root/py']  #      
    In [5]: from d08 import wc  #       
    
  • パッケージをインポートする他のいくつかの方法は、インポート後に実行されるコマンド:1を比較することができる.import d08.wc
  • In [6]: import d08.wc
    
    In [7]: d08.wc('asd')
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
     in ()
    ----> 1 d08.wc('asd')
    
    TypeError: 'module' object is not callable
    
    In [8]: d08.wc.wordCount('asd')  #            
    0 1 3
    

    2.from d 08 import wcと比較
    In [9]: from d08.wc import wordCount
    
    In [10]: wordCount('asd')
    0 1 3
    

    インポート時にコマンド別名を作成する方法もあります.
    In [11]: from d08.wc import wordCount as wc
    
    In [12]: wc('asd')  #   wc      
    0 1 3
    

    6.対象紹介
    クラスとオブジェクトPythonクラス定義クラス属性クラスメソッド
    プロシージャ向けとオブジェクト向けプログラミング-プロシージャ向けプログラミング:関数式プログラミング,Cプログラムなど-オブジェクト向けプログラミング:C+,Java,Pythonなど
    クラスとオブジェクト:オブジェクト向けの2つの重要な概念-クラス:物事の抽象であり、例えば:人間、球技-オブジェクト:クラスの一例であり、例えば:サッカー、バスケットボールの例説明:-球技はボールの特徴と行為を抽象化することができ、それから本当のボール実体をインスタンス化することができる.
    オブジェクト向けの主な考え方は、-パッケージ-継承-マルチステートという考え方が複雑なプロジェクトを解決しやすく、メンテナンスが容易であることです.
    クラス定義:クラスは必要な変数と関数を組み合わせて、「パッケージ」class A(object):クラスの構造:classクラス名:メンバー変数–属性メンバー関数–メソッド
  • クラスの作成:
  • class MyClass(object):
            def fun(self):
                print “I am function”
                self
    

    例:
    #!/usr/bin/python
    # -*- coding:utf8 -*-
    # author: chawn
    # date:
    class People(object):
        color = 'yellow'
    
    ren = People()
    print ren
    
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/1.py
    <__main__.people object="" at="">
    

    People()はクラスで、renはPeople()のオブジェクトで、print renは直接オブジェクトを印刷し、print ren.colorは、静的プロパティと呼ばれるオブジェクトのプロパティを印刷します.
    class People(object):
        color = 'yellow'
    
    ren = People()
    print ren.color
    
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/1.py
    yellow
    

    ダイナミックメソッドダイナミックメソッド:関数と同じメソッドを定義します.
    class People(object):
        color = 'yellow'  #  
        def think(self):    #  
            print "I am a thinker"
    
    ren = People()
    print ren.color
    ren.think()    #    
    
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/1.py
    yellow
    I am a thinker
    

    メソッドでプロパティを呼び出すには、次の手順に従います.
    #!/usr/bin/python
    # -*- coding:utf8 -*-
    # author: chawn
    # date:
    class People(object):
        color = 'yellow'
        def think(self):
            self.color = 'black'    #    
            print "I am a %s" % self.color
            print "I am a thinker"
    
    ren = People()
    print ren.color
    ren.think()
    
    C:\Users\chawn\PycharmProjects\pyex\venv\Scripts\python.exe C:/Users/chawn/PycharmProjects/pyex/180108/1.py
    yellow
    I am a black
    I am a thinker