python【5】-生成式,生成器
一、條件和循環(huán)
1. if語句
if <條件判斷1>:<執(zhí)行1> elif <條件判斷2>:<執(zhí)行2> else:<執(zhí)行4>例如:
age=5 if age>=18:print 'adult' elif age>=6:print 'teenager' else:print 'kid'?
一定要注意條件語句結(jié)尾的冒號,以及代碼段的縮進(jìn)。
只要if參數(shù)是非零數(shù)值、非空字符串、非空list等,就判斷為True,否則為False。
2.循環(huán)
range(num):返回0到num-1之間的整數(shù)。例如:
print range(5)>>>[0,1,2,3,4]?
for循環(huán):for x in ...循環(huán)就是把每個元素代入變量x,然后執(zhí)行縮進(jìn)塊的語句。
s=0 for i in range(101):s+=i print s?
while循環(huán):只要條件滿足,就不斷循環(huán),條件不滿足時退出循環(huán)。
i=1 s=0while(i<=100):s=s+ii=i+1print s?
3.迭代
dict類型for ..in ..迭代有以下幾種方式:
d={'a':1,'b':2,'c':3}
默認(rèn)迭代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)?
帶下標(biāo)迭代:Python內(nèi)置的enumerate函數(shù)可以把一個list變成索引-元素對
l=range(5) for i,value in enumerate(l):print i,value?
二、生成式
1.列表生成式
列表生成式是python受歡迎的語法之一,通過一句簡潔的語法就可以對一組元素進(jìn)行過濾,還可以對得到的元素進(jìn)行轉(zhuǎn)換處理。語法格式為:
[exp for val in collection if condition]?
相當(dāng)于
result=[] for val in collection:if(condition):result.append(exp)?
我們看個例子:將列表中的字符串轉(zhuǎn)換為小寫組成新的列表。
L=['Hello',10,'World',None] print [s.lower() for s in L if isinstance(s,str)] 運(yùn)行結(jié)果: ['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)}運(yùn)行結(jié)果為: {8: 80, 2: 20, 4: 40, 6: 60}?
3.集合生成式
集合生成式格式和列表生成式類似,只不過用的是大括號:
{exp for value in collection if condition}?
例如:統(tǒng)計列表中字符串元素的各種長度。
L=['Hello',10,'World',None,'aa'] print {len(x) for x in L if isinstance(x,str)}運(yùn)行結(jié)果: set([2, 5])?
4.嵌套列表生成式
嵌套列表生成式要注意for循環(huán)的順序。
例如:我們想提取由兩個列表組成的嵌套列表中,含有a的字符串:
L1=[['Cathy','Li'],['Zhang','Wang','Mike','Tom','Jack']] print [name for list in L1 for name in list if name.count('a')>0]運(yùn)行結(jié)果: ['Cathy', 'Zhang', 'Wang', 'Jack']?
我們還可以將嵌套列表中的數(shù)據(jù)進(jìn)行扁平化展現(xiàn),例如:
L2=[(1,3,5),(2,4,6),(100,200)] print [value for t in L2 for value in t]運(yùn)行結(jié)果: [1, 3, 5, 2, 4, 6, 100, 200]?
發(fā)現(xiàn)語法太簡潔啦!!
三、生成器
在Python中,有一種自定義迭代器的方式,稱為生成器(Generator)。
定義生成器的兩種方式:
1.創(chuàng)建一個generator,只要把一個列表生成式的[]改成(),就創(chuàng)建了一個generator:
l=[x for x in range(1,10)] print lg=(x for x in range(1,10)) print g.next() print g.next()for x in g:print x運(yùn)行結(jié)果: [1, 2, 3, 4, 5, 6, 7, 8, 9] 1 2 3 4 5 6 7 8 9?
generator保存的是算法,每次調(diào)用next(),就計算出下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出StopIteration的錯誤。
2.定義generator的另一種方法。如果一個函數(shù)定義中包含yield關(guān)鍵字,那么這個函數(shù)就不再是一個普通函數(shù),而是一個generator:
def fib(n):a=1b=1i=0;yield ayield bwhile(i<n):a,b=b,a+bi+=1yield bfor x in fib(10):print x運(yùn)行結(jié)果: 1 1 2 3 5 8 13 21 34 55 89 144?
生成器和普通函數(shù)區(qū)別:
普通函數(shù)是順序執(zhí)行,遇到return語句或者最后一行函數(shù)語句就返回;
而變成generator的函數(shù),在每次調(diào)用next()的時候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時從上次返回的yield語句處繼續(xù)執(zhí)行。
def test():print 1yieldprint 2yieldprint 3yieldt=test() t.next()#運(yùn)行結(jié)果1 t.next()#運(yùn)行結(jié)果2 t.next()#運(yùn)行結(jié)果3?如需轉(zhuǎn)載,請標(biāo)明原文鏈接:http://www.cnblogs.com/janes/
總結(jié)
以上是生活随笔為你收集整理的python【5】-生成式,生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TDEngine数据包的详细说明
- 下一篇: 先贤祠2