python【5】-生成式、ジェネレータ

13335 ワード

一、条件と循環
1.if文
if <    1>:
    <  1>
elif <    2>:
    <  2>
else:
    <  4>

例:
age=5
if age>=18:
  print 'adult'
elif age>=6:
  print 'teenager'
else:
  print 'kid'

 
条件文の末尾のコロンとコードセグメントのインデントに注意してください.
ifパラメータが非ゼロ値、非空文字列、非空listなどであればTrueと判断し、そうでなければFalseと判断する.
2.サイクル
range(num):0からnum-1までの整数を返します.例:
print range(5)

>>>[0,1,2,3,4]

 
forループ:for x in ...ループとは、変数xに各要素を代入し、インデントブロックを実行する文である.
s=0
for i in range(101):
  s+=i
print s

 
whileサイクル:条件が満たされる限り、ループを続け、条件が満たされない場合にループを終了します.
i=1
s=0

while(i<=100):
  s=s+i
  i=i+1

print s

 
3.反復
dictタイプfor..in ..反復には、次の方法があります.
d={'a':1,'b':2,'c':3}
デフォルト反復key
for k in d:
    print k

 
iterkeys()戻りkey反復器
for key in d.iterkeys():
    print key

 
itervalues()はvalue反復器を返します
for value in d.itervalues():
    print value

 
iteritems()はキー値対反復器を返します
for key,value in d.iteritems():
    print key+"="+str(value)

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

 
下付き反復:Pythonに内蔵されたenumerate関数はリストをインデックス要素ペアにすることができます.
l=range(5)
for i,value in enumerate(l):

print i,value

 
二、生成式
1.リスト生成式
リスト生成式はpythonで人気のある文法の一つであり、簡潔な文法で要素のセットをフィルタリングしたり、得られた要素を変換処理したりすることができます.構文の形式は次のとおりです.
[exp for val in collection if condition]

 
に相当
result=[]
for val in collection:
    if(condition):
        result.append(exp)

 
例を見てみましょう.リストの文字列を小文字に変換して新しいリストを構成します.
L=['Hello',10,'World',None]
print [s.lower() for s in L if isinstance(s,str)]
    :  ['hello', 'world']

 
2.辞書生成式
ディクショナリ生成式の基本フォーマットは次のとおりです.
{key-exp:val-exp for value in collection if condition}

 
例:
print {i:i*10 for i in range(1,10) if(i%2==0)}

     : {8: 80, 2: 20, 4: 40, 6: 60}

 
3.集合生成式
集合生成フォーマットはリスト生成と似ていますが、カッコで囲まれています.
{exp for value in collection if condition}

 
たとえば、リスト内の文字列要素の長さを統計します.
L=['Hello',10,'World',None,'aa']
print {len(x) for x in L if isinstance(x,str)}

    : set([2, 5])

 
4.ネストリスト生成式
ネストリスト生成式はforループの順序に注意します.
たとえば、aの文字列を含む2つのリストからなるネストされたリストを抽出します.
L1=[['Cathy','Li'],['Zhang','Wang','Mike','Tom','Jack']]
print [name for list in L1 for name in list  if name.count('a')>0]

    : ['Cathy', 'Zhang', 'Wang', 'Jack']

 
また、ネストされたリストのデータをフラットに表示することもできます.たとえば、次のようになります.
L2=[(1,3,5),(2,4,6),(100,200)]
print [value for t in L2 for value in t]

    : [1, 3, 5, 2, 4, 6, 100, 200]

 
文法が簡潔すぎることに気づいた!!
三、ジェネレータ
Pythonでは、ジェネレータ(Generator)と呼ばれるカスタム反復器があります.
ジェネレータを定義する2つの方法:
1.generatorを作成し、リスト生成式の[]()に変更するとgeneratorが作成されます.
l=[x for x in range(1,10)]
print l

g=(x for x in range(1,10))
print g.next()
print g.next()

for x in g:
    print x

    :
[1, 2, 3, 4, 5, 6, 7, 8, 9]
1
2
3
4
5
6
7
8
9

 
generatorはアルゴリズムを保存し、next()を呼び出すたびに次の要素の値を計算し、最後の要素まで計算し、より多くの要素がない場合、StopIterationのエラーを投げ出す.
2.generatorを定義する別の方法.関数定義にyieldのキーワードが含まれている場合、この関数は通常の関数ではなくgeneratorです.
def fib(n):
    a=1
    b=1
    i=0;

    yield a
    yield b

    while(i<n):
        a,b=b,a+b
        i+=1
        yield b

for x in fib(10):
    print x

    :
1
1
2
3
5
8
13
21
34
55
89
144

 
ジェネレータと一般的な関数の違い:
通常の関数は順番に実行され、return文または最後の行の関数文に遭遇すると返されます.
generatorとなる関数は、next()が呼び出されるたびに実行され、yield文の戻りに遭遇し、再実行時に前回返されたyield文から実行が継続される.
def test():
    print 1
    yield
    print 2
    yield
    print 3
    yield

t=test()
t.next()#    1
t.next()#    2
t.next()#    3

転載する場合は、原文のリンクを明記してください.http://www.cnblogs.com/janes/