Python学習の高度な特性

3857 ワード

ブログへようこそ
Python学習ディレクトリ
  • MacでPython 3
  • を使用
  • Python学習のデータ型
  • Python学習の関数
  • Python学習の高度な特性
  • Python学習の関数式プログラミング
  • Python学習のモジュール
  • Python学習のオブジェクト向けプログラミング
  • Python学習のオブジェクト向け高度プログラミング
  • Python学習のエラーデバッグとテスト
  • Python学習のIOプログラミング
  • Python学習のプロセスとスレッド
  • Python学習の正則
  • Python学習の常用モジュール
  • Python学習のネットワークプログラミング
  • 練習コード
    Pythonのデータ型、文、関数をマスターすれば、基本的に多くの役に立つプログラムを書くことができます.例えば、1, 3, 5, 7, ..., 99のリストを構築し、ループによって実現することができる.
    L = []
    n = 1
    while n <= 99:
        L.append(n)
        n = n + 2
    

    リストの上位半分の要素を取り、ループで実現することもできます.
    しかしPythonでは、コードは多ければ多いほど良いのではなく、少なければ少ないほど良いのです.コードは複雑であればあるほど良いのではなく、簡単であればあるほど良いのです.この考えに基づいて、Pythonで非常に有用な高度な特性を紹介し、1行のコードで実現できる機能は、決して5行のコードを書かない.コードが少ないほど開発効率が高いことを常に覚えておいてください.

    スライス(Slice)

    L = list(range(100))
    L[:10]
    
    >>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    (0, 1, 2, 3, 4, 5)[:3]
    
    >>> (0, 1, 2)
    
    'ABCDEFG'[:3]
    
    >>> 'ABC'
    

    多くのプログラミング言語では、文字列に対して多くの様々な切り取り関数(例えばsubstring)が提供され、その目的は文字列をスライスすることである.Pythonには文字列に対する切り取り関数はなく,スライス1操作で済むので,非常に簡単である.

    反復

  • collectionsモジュールのIterableタイプによりオブジェクトが反復可能オブジェクトであるか否かを判定する
  • from collections import Iterable
    isinstance('abc', Iterable) # str 
    
    >>> True
    
  • Pythonに内蔵されたenumerate関数はリストをインデックス-要素ペアにすることができ、forループでインデックスと要素自体を同時に反復することができます.
    for i, value in enumerate(['A', 'B', 'C']):
        print(i, value)
    
    >>>
        0 A
        1 B
        2 C
    

    リスト生成

  • list(range(1, 11))
  • 生成[1 x 1,2 x 2,3 x 3,...,10 x 10]
  • L = []
    for x in range(1, 11):
        L.append(x * x)
    
  • リスト生成式(list comprehensions)は、上記のlist
  • をループの代わりに1行の文で生成することができる.
    [x * x for x in range(1, 11)]
    

    ジェネレータ


    generatorはアルゴリズムを保存し、next(g)を呼び出すたびにgの次の要素の値を計算し、最後の要素まで計算し、より多くの要素がない場合、StopIterationのエラーを投げ出す.同様にforループループも使用できます
  • リスト生成式の[]を()
  • に変更
    g = (x * x for x in range(10))
    for n in g:
       print(n)
    
    >>>
        0
        1
        4
        9
        16
        25
        36
        49
        64
        81
    
  • 関数定義にyieldキーワードが含まれている場合、この関数は通常の関数ではなくgenerator
  • です.
    generatorと関数の実行プロセスは違います.関数は順番に実行され、return文または最後の行の関数文に遭遇すると返されます.generatorの関数となり、next()を呼び出すたびに実行され、yield文が返され、再実行されると前回返されたyield文から実行が続行されます.関数をgeneratorに変更すると、next()で次の戻り値を取得するのではなく、forループを直接使用して反復します.
    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    f = fib(6)
    

    反復器


    forサイクルに直接作用できるデータ型は、リスト、tuple、dict、set、strなどの集合データ型である.1つはgeneratorであり、ジェネレータとyield付きgenerator functionを含む.
    これらのforループに直接作用するオブジェクトは、反復可能なオブジェクト:Iterableと総称されます.isinstance()を使用して、オブジェクトがIterableオブジェクトであるかどうかを判断できます.ジェネレータはforループだけでなくnext()関数によって呼び出され、次の値を返し、最後にStopIterationエラーが投げ出されて次の値を返すことができなくなるまで返すことができます.next()関数によって呼び出され、次の値を繰り返し返すオブジェクトを反復器:Iteratorと呼びます.isinstance()を使用して、オブジェクトがIteratorオブジェクトであるかどうかを判断できます.リスト、dict、strなどの集合データ型はIterableですが、Iteratorではありませんが、iter()関数でIteratorオブジェクトを取得できます.pythonのforループは本質的にnext()関数を絶えず呼び出すことによって実現される.
    for x in [1, 2, 3, 4, 5]:
        pass
    

    完全に同等:
    #  Iterator :
    it = iter([1, 2, 3, 4, 5])
    #  :
    while True:
        try:
            #  :
            x = next(it)
        except StopIteration:
            #  StopIteration 
            break
    

    小結:PythonのIteratorオブジェクトはデータストリームを表しています.このデータストリームは秩序あるシーケンスと見なしていますが、シーケンスの長さを事前に知ることはできません.next()関数で次のデータをオンデマンドで計算するしかありません.そのため、Iteratorの計算は不活性で、次のデータを返す必要がある場合にのみ計算されます.Iteratorは、全体の自然数など、無限大のデータストリームを表すこともできる.リストを使用すると、自然数全体を格納することは永遠に不可能です.
    上一篇:Python学习の関数式プログラミング