三、pythonの高度な特性(スライス、反復、リストジェネレータ、ジェネレータ)

4779 ワード

1.pythonの詳細プロパティ
1.1スライス
ListリストL=['Mli','add','sal','saoo','Lkkl']
L[0:3]#は['Mli','add','sal']インデックス0からインデックス3までですが、3は含まれません
L[:3]はL[0:3]に等しい
L[-2:]#は['saoo','Lkkl']最後の要素のインデックスは-1です.
L[-2:-1]#は['Lkml']
L=range(100)#の場合L[1:6:2]は2つの要素ごとに1つの数をとるので出力は[2,4]
tupleはスライスで操作することもできるが、スライスは可変ではなく、操作後もスライス例えばL=(1,2,3,4)ではL[0:3]出力結果は(1,2,3)である
文字列はスライスでも使用できます.たとえば、m='sajlkdjsalkjd'の場合、m[0:3]出力'saj'
1.2反復
listまたはtupleを定義する場合は、反復と呼ばれるforループでループできます.
dictタイプでは反復を用いてもよいがkey値を出力するだけである
例:
dict={'lk':'36','klk':'37','kkd':'98'}

    for n in dict:

      print n

結果出力
kkdlkklk
value値を出力するには
dict={'lk':'36','klk':'37','kkd':'98'}

    for n in dict.itervalues():

      print n

同様にkey-valueの値(両方出力)を出力するには、for n in dict.iteritems()#にコードを変更する必要があります.このときnはtupleタイプです.
for key,v in dict.ie=ieritems()
1.3リスト生成式
名前の通りlist生成式
[x*x for x in range(3)]#出力結果は[0,1,4]
[x*x for x in range(3)fi x%2==0]#出力結果は[0,4]
[m+n for m in'ABC'for n in'abc']#出力結果は['Aa','Ab','Ac','Ba','Bb','Bc','Ca','Cb','Cc'](全配列)
L=['ABC','DEF','GHI'][s.lower()for s in L]#Lの大文字を小文字に変更
1.4ジェネレータ(generator)
リストジェネレータが動作する場合は、リストリストを作成する必要がありますが、リストのメモリには制限があり、無限大になることはできません.この不足を補うために、ジェネレータは自然に誕生します.ジェネレータはループの過程で後の結果を推定し、完全なリストを作成する必要はありません.そのため、そんなに多くのメモリを消費しません.
ジェネレータには、リスト生成式の[]をシフト()する方法がたくさんあります.
すなわち、g=(x*x for x in range(5))出力時はg.next()のみ出力
すなわちg.next()#出力0
g.next()#出力1
g.next()#出力2
g.next()#出力3
g.next()#出力4
g.next()#出力StopIteration
循環出力も使用できます.
for n in g
  print n
法二用yield
例1,1,2,3,5,8,13.....
一般的な関数は
def fib(max):

  a,b,n=0,1,0

  if n<max:

    a,b,n=b,a+b,n+1

    print a

ジェネレータで関数を変更する場合はprintをyieldに変更するだけです
def fib(max):

  a,b,n=0,1,0

  if n<max:

    a,b,n=b,a+b,n+1

     yield a

     for n in fib(6):

      print n

またはo=fib(5)
o.next()出力
fibは普通の関数ではなくgeneratorで、実行中にyieldに遭遇すると中断し、次回実行を続けると、ループ中にyieldを呼び出し続け、中断します.もちろん、ループに条件を設定してループを終了します.そうしないと、無限数の列が生成されます.