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é)尾的冒號(hào),以及代碼段的縮進(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)就是把每個(gè)元素代入變量x,然后執(zhí)行縮進(jìn)塊的語句。
s=0 for i in range(101):s+=i print s?
while循環(huán):只要條件滿足,就不斷循環(huán),條件不滿足時(shí)退出循環(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()返回鍵值對(duì)迭代器
for key,value in d.iteritems():print key+"="+str(value)?
判斷對(duì)象是否可迭代:通過collections模塊的Iterable類型判斷
from collections import Iterable print isinstance(d,Iterable)?
帶下標(biāo)迭代:Python內(nèi)置的enumerate函數(shù)可以把一個(gè)list變成索引-元素對(duì)
l=range(5) for i,value in enumerate(l):print i,value?
二、生成式
1.列表生成式
列表生成式是python受歡迎的語法之一,通過一句簡(jiǎn)潔的語法就可以對(duì)一組元素進(jìn)行過濾,還可以對(duì)得到的元素進(jìn)行轉(zhuǎn)換處理。語法格式為:
[exp for val in collection if condition]?
相當(dāng)于
result=[] for val in collection:if(condition):result.append(exp)?
我們看個(gè)例子:將列表中的字符串轉(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.集合生成式
集合生成式格式和列表生成式類似,只不過用的是大括號(hào):
{exp for value in collection if condition}?
例如:統(tǒng)計(jì)列表中字符串元素的各種長(zhǎ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)的順序。
例如:我們想提取由兩個(gè)列表組成的嵌套列表中,含有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)語法太簡(jiǎn)潔啦!!
三、生成器
在Python中,有一種自定義迭代器的方式,稱為生成器(Generator)。
定義生成器的兩種方式:
1.創(chuàng)建一個(gè)generator,只要把一個(gè)列表生成式的[]改成(),就創(chuàng)建了一個(gè)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(),就計(jì)算出下一個(gè)元素的值,直到計(jì)算到最后一個(gè)元素,沒有更多的元素時(shí),拋出StopIteration的錯(cuò)誤。
2.定義generator的另一種方法。如果一個(gè)函數(shù)定義中包含yield關(guān)鍵字,那么這個(gè)函數(shù)就不再是一個(gè)普通函數(shù),而是一個(gè)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()的時(shí)候執(zhí)行,遇到y(tǒng)ield語句返回,再次執(zhí)行時(shí)從上次返回的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)載,請(qǐng)標(biāo)明原文鏈接:http://www.cnblogs.com/janes/
總結(jié)
以上是生活随笔為你收集整理的python【5】-生成式,生成器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TDEngine数据包的详细说明
- 下一篇: Python科学计算(一)环境简介——A