python【5】-生成式、ジェネレータ
13335 ワード
一、条件と循環
1.if文
例:
条件文の末尾のコロンとコードセグメントのインデントに注意してください.
ifパラメータが非ゼロ値、非空文字列、非空listなどであれば
2.サイクル
range(num):0からnum-1までの整数を返します.例:
forループ:
whileサイクル:条件が満たされる限り、ループを続け、条件が満たされない場合にループを終了します.
3.反復
dictタイプfor..in ..反復には、次の方法があります.
d={'a':1,'b':2,'c':3}
デフォルト反復key
iterkeys()戻りkey反復器
itervalues()はvalue反復器を返します
iteritems()はキー値対反復器を返します
オブジェクトが反復可能かどうかを判断する:collectionsモジュールのIterableタイプで判断する
下付き反復:Pythonに内蔵された
二、生成式
1.リスト生成式
リスト生成式はpythonで人気のある文法の一つであり、簡潔な文法で要素のセットをフィルタリングしたり、得られた要素を変換処理したりすることができます.構文の形式は次のとおりです.
に相当
例を見てみましょう.リストの文字列を小文字に変換して新しいリストを構成します.
2.辞書生成式
ディクショナリ生成式の基本フォーマットは次のとおりです.
例:
3.集合生成式
集合生成フォーマットはリスト生成と似ていますが、カッコで囲まれています.
たとえば、リスト内の文字列要素の長さを統計します.
4.ネストリスト生成式
ネストリスト生成式はforループの順序に注意します.
たとえば、aの文字列を含む2つのリストからなるネストされたリストを抽出します.
また、ネストされたリストのデータをフラットに表示することもできます.たとえば、次のようになります.
文法が簡潔すぎることに気づいた!!
三、ジェネレータ
Pythonでは、ジェネレータ(Generator)と呼ばれるカスタム反復器があります.
ジェネレータを定義する2つの方法:
1.generatorを作成し、リスト生成式の
generatorはアルゴリズムを保存し、
2.generatorを定義する別の方法.関数定義に
ジェネレータと一般的な関数の違い:
通常の関数は順番に実行され、return文または最後の行の関数文に遭遇すると返されます.
generatorとなる関数は、
転載する場合は、原文のリンクを明記してください.http://www.cnblogs.com/janes/
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/