python学習ノート-高度な特性20200309


文書ディレクトリ
  • 高級特性
  • スライス
  • exercise
  • 反復
  • 定義
  • 反復dict対象:
  • 反復文字列オブジェクト
  • 反復可能対象か否か判断
  • リストクラスに対して下付きループを実現
  • exercise
  • 小結
  • リスト生成式
  • リスト生成
  • 現在のディレクトリの下にあるすべてのファイルとディレクトリ名をリストする
  • 2変数でリストを生成
  • リスト生成式中if…else
  • 練習
  • 小結
  • ジェネレータ
  • 定義
  • generatorの作成
  • フィボラッチ数列(Fibonacci)
  • 楊輝三角形
  • 反復器
  • 小結
  • 高度な機能
    スライス
    1 . リストまたはtupleの要素の一部を取ります.たとえば、次のようにします.
  • 正数をとる
  • L=['M','S','T','B','J']
    [L[0],L[1],L[2]]               #a.   
    r=[]
    n=3
    for i in range(n):
        r.append(L[i])           #b.    
    L[0:3]                         #c.   
    
  • 逆数を取る
  • L[-1]         #        
    L[-2:]        #              
    
  • list例
  • 数字L=list(range(100)#0:99の数列Lを作成する[:10]L[-10:]L[10:20]L[:10:2]#上位10個、2個ごとに1個L[::5]#全数、5個ごとに1個L[:]#をそのままコピーするlist
  • 文字列’xxx’‘ABCDEFG’[:3]
  • tuple例(0,1,2,3,4,5)[:3]#上位3桁取り
  • exercise
    スライス操作により、trim()関数を実装し、文字列の先頭と末尾のスペースを除去します.
    def trim(s)
    if s[0] != ' ' and s[-1] !=' '
        return s
    elif s[0] == ' '
        return s[1:]
    elif s[-1] == ' '
        return s[:-1]
    

    反復
    定義#テイギ#
    listまたはtupleが与えられた場合、forループによってこのlistまたはtupleを遍歴することができ、この遍歴を反復(Iteration)と呼ぶ.Pythonでは、反復はfor...inによって行われます.
    反復dictオブジェクト:
  • 反復key:デフォルトdict反復はkey
  • d={'a',:1'b':2,'c':3}
    for key in d:
        print(key)
    
  • 反復value:
  • for value in d.values():
    	print(value)
    
  • keyとvalueを同時に反復:for k,v in d.items()
  • for k,v in d.items():
    	print(value)
    

    反復文字列オブジェクト
    for ch in 'ABC'
    print(ch)
    

    反復可能オブジェクトかどうかを判断する
    collectionsモジュールのIterableタイプで判断
    from collections import Iterable
    isinstance('abc',Iterable)
    

    リストクラスに対する下付きループの実現
    enumerate関数を使用すると、リストをインデックス-要素ペアに変更できます.これにより、forループでインデックスと要素自体を同時に反復できます.
    for i,value in enumerate(['A','B','C']):
        print(i,value)
    
    >>> for x,y in[(4,5),(2,3),(1,1)]:
    	print(x,y)
    
    	
    4 5
    2 3
    1 1
    

    exercise
    反復を使用してlistの最小値と最大値を検索し、tupleを返します.
    def findMinAndMax(L):
    	if len(L)!=0:
    		min=99999999
    		max=-99999999
    		for i in L:
    			if imax:
    				max=i
    		return min,max
    	else:
    		return(None,None)
    

    小結
  • 反復可能なオブジェクトは、我々がカスタマイズしたデータ型を含め、反復条件を満たす限り、forループを使用することができるforループに作用することができる.

  • リスト生成
    リストの生成
  • list(range(1,11))listの生成[1,2,3,4,5,6,7,8,9,10]
  • 生成[1 x 1,2 x 2,3 x 3,…,10 x 10],
  • L=[]
    for x in range(1,11):
        L.append(x*x)
    

    または[x*x for x in range(1,11)]リスト生成式生成する要素x*xを前面に置き、後にforループ
  • プラス判定[x*x for x in range(1,11)if x%2==0]
  • 2層ループ、全配列生成
  • [m+n for m in 'ABC' for n in 'XYZ']
    現在のディレクトリの下にあるすべてのファイルとディレクトリ名をリストします.
    1行のコードで実現できます
    import os   #  os  
    [d for d in os.listdir('.')]            #os.listdir         
    

    2つの変数を使用してlistを生成
    d = {'x':'A','y':'B','z':'C' }
    [k + '=' + v for k , v in d.items()]
    
  • 文字列が小文字になる:s.lower()
  • リスト生成式中if...else
    用法:[x if x % 2 == 0 else -x for x range(1,11)]=>[x if...else for x in...]
    練習するL=['Hello','World',18,'Apple',None] [x.lower() if isinstance(x,str) else x for x in L]
    小結
    リスト生成式を用いると,リストを迅速に生成でき,1つのリストから別のリストを導出できるが,コードは非常に簡潔である.
    ビルダー
    定義#テイギ#
    ジェネレータ:ループしながら計算、generator
    Generatorの作成
    方法1:
  • リスト生成式の[]を()に変更
  • g = (x * x for x in range(10))             #  generator
    
  • 印刷:1.**next()**関数でgeneratorの次の戻り値を得る
  • 2.循環実現
    g = (x * x for x in range(10))             #  generator
    for n in g:
        print(n)
    

    フィボラチ数列(Fibonacci)
    普通の書き方
    def fib(max):
        n,a,b,0,0,1
        while n
  • 注意:代入文a,b=b,a+bはaとbiにそれぞれbとa+b generator表記
  • print(b)をyield bに変更
  • def fib(max):
        n,a,b=0,0,1
        while  n

    関数をgeneratorに変更すると、next()で次の戻り値を取得するのではなく、forループを直接使用して反復します.
    for n in fib(6):
        print(n)
    

    しかしforループでgeneratorを呼び出すと、generatorのreturn文の戻り値が得られないことがわかります.戻り値を取得するには、StopIterationエラーを取得する必要があります.戻り値はStopIterationのvalueに含まれます.
    g = fib(6)
    >>> while True:
    ...     try:
    ...         x = next(g)
    ...         print('g:', x)
    ...     except StopIteration as e:
    ...         print('Generator return value:', e.value)
    ...         break
    

    ヤングさんかくけい
    method1
    def triangles()
    f=[]
    while True:
        f=[f[i-1]+f[i] if i!=0 and i!=len(f) else 1 for i in range(len(f)+1)]
    yield f
    

    method2
    def triangles()
    a=[1]
    while True:
        yield a
        a.append(0)
        a=[a[i-1]+a[i] for i in range(len(a))]
    
    ##  
    
    n=0
    for t in triangles():
        print(t)
        n=n=+1
        if n==10:
        break
    

    result: [1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1] [1, 6, 15, 20, 15, 6, 1] [1, 7, 21, 35, 35, 21, 7, 1] [1, 8, 28, 56, 70, 56, 28, 8, 1] [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
    反復器
    forサイクルに直接作用するデータ型は、list、tuple、dict、set、strなどの集合データ型2 generator、ジェネレータおよびyield付きgenerator functionなど、いくつかあります.
  • forループに直接作用するオブジェクトを総称して反復可能オブジェクト:Iterableと呼ぶ.isinstance()を使用して、1つのオブジェクトがIterableオブジェクトかどうかを判断できます
  • ジェネレータはforループだけでなくnext()関数によって呼び出されて次の値を返すことも可能であり、最後にStopIterationエラーが投げ出されて次の値が戻らないことを示すまで
  • next()関数によって呼び出され、次の値を繰り返すオブジェクトを反復器:Iteratorと呼びます.
  • isinstance()を使用して、1つのオブジェクトがIteratorオブジェクトかどうかを判断できる
  • from collections import Iterator isinstance((x for x in range(10)), Iterator)
  • ジェネレータはすべてIteratorオブジェクトですが、list、dict、strはIterable(反復可能)ですがIteratorではありません
  • ist、dict、strなどのIterableがIteratorになったらiter()関数を使用可能:
  • 反復器か判断
  • >>> isinstance(iter([]), Iterator)
    True
    >>> isinstance(iter('abc'), Iterator)
    True
    

    ここでiter(‘abc’)はstrをIteratorに変換する
  • 反復可能対象か否か判断:collectionsモジュールによるIterableタイプ判断
  • from collections import Iterable
    isinstance('abc',Iterable)
    

    注意:list、dict、strなどのデータ型はIteratorではありません:理由:
  • PythonのIteratorオブジェクトは、next()関数によって呼び出され、データがないときにStopIterationエラーが投げ出されるまで次のデータを返すことができるデータストリームを表す.このデータストリームは秩序あるシーケンスと見なすことができるが,シーケンスの長さを事前に知ることはできず,next()関数を介して次のデータをオンデマンドで計算するしかないため,Iteratorの計算は不活性であり,次のデータを返す必要がある場合にのみ計算される.
  • Iteratorは、全体の自然数など、無限大のデータストリームを表すこともできる.リストを使用すると、自然数全体を格納することは永遠に不可能です.

  • 小結
  • forループに作用する対象はすべてIterableタイプである.
  • next()関数に作用するオブジェクトはすべてIteratorタイプであり、それらは不活性計算のシーケンスを表す.
  • リスト、dict、strなどの集合データ型はIterableでありIteratorではないが、iter()関数でIteratorオブジェクトを1つ得ることができる.
  • 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