目錄
成都創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都做網(wǎng)站、成都網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),賣友情鏈接,廣告投放平臺為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計(jì)到用戶體驗(yàn)提高,創(chuàng)新互聯(lián)力求做到盡善盡美。匿名函數(shù)...1
生成器generator:...2
生成器函數(shù):...2
生成器應(yīng)用:...5
coroutine協(xié)程:...6
匿名,即沒有名字,沒有名字的函數(shù);
python借助lambda表達(dá)式構(gòu)建匿名函數(shù);
格式:
lambda 參數(shù)列表: 表達(dá)式
參數(shù)列表不需要小括號;
冒號是用來分割參數(shù)列表和表達(dá)式的;
不需要使用return,表達(dá)式的值就是匿名函數(shù)的返回值;
lambda表達(dá)式只能寫在一行上,被稱為單行函數(shù);
用途,高階函數(shù)傳參時(shí),使用lambda表達(dá)式,往往能簡化代碼;
例:
In [2]: lambda x: x**2
Out[2]: <function __main__.<lambda>>
In [3]: (lambda x: x**2)(4)?? #調(diào)用
Out[3]: 16
In [4]: foo=lambda x,y:(x+y)**2?? #不推薦這么用
In [5]: foo(2,1)
Out[5]: 9
In [6]: def foo(x,y):?? #如果復(fù)雜時(shí),建議使用普通函數(shù)
...:???? return (x+y)**2
...: foo(2,1)
...:
Out[6]: 9
In [7]: lst=['a',2,1]
In [8]: lst.sort(key=str)?? #高階函數(shù),str為函數(shù)
In [9]: lst
Out[9]: [1, 2, 'a']
In [10]: lambda :0?? #無參函數(shù),返回常數(shù)0
Out[10]: <function __main__.<lambda>>
In [11]: (lambda x,y=3:x+y)(5)
Out[11]: 8
In [12]: (lambda x,y=3: x+y)(5,6)
Out[12]: 11
In [13]: (lambda x,*,y=30: x+y)(5)
Out[13]: 35
In [14]: (lambda x,*,y=30: x+y)(5,y=10)
Out[14]: 15
In [15]: (lambda *args:(x for x in args))(*range(5))?? #生成器,惰性求值
Out[15]: <generator object <lambda>.<locals>.<genexpr> at 0x7f892ccaca40>
In [16]: (lambda *args: [x for x in args])(*range(5))?? #列表解析,立即求值
Out[16]: [0, 1, 2, 3, 4]
In [18]: (lambda *args: {x+2 for x in args})(*range(5))
Out[18]: {2, 3, 4, 5, 6}
In [20]: [x for x in (lambda *args: map(lambda x: x+1,args))(*range(5))]?? #高階函數(shù)
Out[20]: [1, 2, 3, 4, 5]
In [22]: [x for x in (lambda *args: map(lambda x: (x+1,args),args))(*range(5))]
Out[22]:
[(1, (0, 1, 2, 3, 4)),
(2, (0, 1, 2, 3, 4)),
(3, (0, 1, 2, 3, 4)),
(4, (0, 1, 2, 3, 4)),
(5, (0, 1, 2, 3, 4))]
生成器指的是生成器對象,可以由生成器表達(dá)式得到,也可以使用yield關(guān)鍵字得到一個(gè)生成器函數(shù),調(diào)用這個(gè)函數(shù)得到一個(gè)生成器對象;
庫函數(shù)中有大量使用;
生成器表達(dá)式和生成器函數(shù)能夠生成生成器對象;
函數(shù)中包含yield語句的函數(shù),返回生成器對象;
生成器對象,是一個(gè)可迭代對象,是一個(gè)迭代器;
生成器對象,是延遲計(jì)算,惰性求值的;
普通的函數(shù)在調(diào)用后,會立即執(zhí)行完畢,但生成器函數(shù)可使用next()多次執(zhí)行;
生成器函數(shù)等價(jià)于生成器表達(dá)式,只不過生成器函數(shù)更加復(fù)雜;
生成器函數(shù),核心:讓出;
在生成器函數(shù)中,使用多個(gè)yield語句,執(zhí)行一次后會暫停執(zhí)行,把yield表達(dá)式的值返回;
再次執(zhí)行會執(zhí)行到下個(gè)yield語句;
return語句依然可以終止函數(shù)運(yùn)行,但return語句的返回值不能被獲取到,生成器函數(shù)中一般不加return語句;
return會導(dǎo)致無法繼續(xù)獲取下一個(gè)值,拋StopIteration異常;
如果函數(shù)沒有顯式的return語句,如果生成器函數(shù)執(zhí)行到結(jié)尾一樣會拋StopIteration異常;
包含yield語句的生成器函數(shù),生成生成器對象時(shí),生成器函數(shù)的函數(shù)體不會立即執(zhí)行;
next(generator)會從函數(shù)的當(dāng)前位置向后執(zhí)行到之后碰到的第一個(gè)yield語句,會彈出值,并暫停函數(shù)執(zhí)行,next()可理解為撥一下轉(zhuǎn)一次;
再次調(diào)用next(),和上一條一樣的處理過程,當(dāng)沒有元素時(shí)可給缺省值next(g,'End'),防止拋異常;
沒有多余的yield語句能被執(zhí)行,繼續(xù)調(diào)用next(),會拋StopIteration異常;
例:
In [23]: def inc():
...:???? for i in range(5):
...:???????? yield i?? #出現(xiàn)yield就是生成器函數(shù)
...:????????
In [24]: type(inc)
Out[24]: function
In [25]: type(inc())
Out[25]: generator
In [26]: x=inc()
In [27]: type(x)
Out[27]: generator
In [28]: next(x)
Out[28]: 0
In [29]: for n in x:
...:???? print(n)
...:????
1
2
3
4
In [30]: for n in x:
...:???? print(n)?? #x在上個(gè)for中已迭代完
...:????
...:????
In [39]: y=(i for i in range(2))
In [40]: type(y)
Out[40]: generator
In [41]: next(y)
Out[41]: 0
In [42]: next(y)
Out[42]: 1
In [43]: next(y)
---------------------------------------------------------------------------
StopIteration???????????????????????????? Traceback (most recent call last)
<ipython-input-43-81b9d2f0f16a> in <module>()
----> 1 next(y)
StopIteration:
例:
In [44]: def gen():
...:???? print('line1')
...:???? yield 1
...:???? print('line2')
...:???? yield 2
...:???? print('line3')
...:???? return 3
...:
In [45]: next(gen())
line1
Out[45]: 1
In [46]: next(gen())
line1
Out[46]: 1
In [47]: g=gen()
In [48]: next(g)
line1
Out[48]: 1
In [49]: next(g)
line2
Out[49]: 2
In [50]: next(g)
line3
---------------------------------------------------------------------------
StopIteration???????????????????????????? Traceback (most recent call last)
<ipython-input-50-e734f8aca5ac> in <module>()
----> 1 next(g)
StopIteration: 3
In [51]: g=gen()
In [52]: next(g)
line1
Out[52]: 1
In [53]: next(g)
line2
Out[53]: 2
In [54]: next(g,'End')??#沒有元素,給缺省值
line3
Out[54]: 'End'
In [55]: next(g,'End')
Out[55]: 'End'
無限循環(huán):
例:
defcounter():
??? i =0
???while True:
??????? i +=1
???????yieldi
definc(c):
???????returnnext(c)
c = counter()
print(inc(c))
print(inc(c))
print(inc(c))
##############
defcounter2():
??? i =0
???while True:
??????? i +=1
???????yieldi
definc2():
??? c = counter()
???returnnext(c)
print(inc2())?? #1
print(inc2())?? #1
print(inc2())?? #1,每次都創(chuàng)建生成器對象
計(jì)數(shù)器:
definc():
???defcounter():
??????? i =0
???????while True:
??????????? i +=1
???????????yieldi
??? c = counter()
???return lambda:next(c)??#相當(dāng)于如下三行,閉包,用到了外層函數(shù)的自由變量c,lambda表達(dá)式是匿名函數(shù),return返回的是一個(gè)匿名函數(shù)
??? #def _inc():
??????? #return next(c)
??? #return _inc
foo = inc()
print(foo())
print(foo())
處理遞歸問題:
deffib():
??? x =0
???y =1
???while True:
???????yieldy
??????? x,y = y,x+y
foo=fib()
foriinrange(5):
???print(next(foo))
for_inrange(100):
???print(next(foo))
#print(next(foo))
生成器的高級用法;
比進(jìn)程、線程輕量級;
是在用戶空間調(diào)度函數(shù)的一種實(shí)現(xiàn);
python3 asyncio就是協(xié)程實(shí)現(xiàn),已加入到標(biāo)準(zhǔn)庫;
python3.5使用async、await關(guān)鍵字直接原生支持協(xié)程;
協(xié)程調(diào)度器實(shí)現(xiàn)思路,有2個(gè)生成器A、B,next(A)后,A執(zhí)行到了yield語句暫停,然后去執(zhí)行next(B),B執(zhí)行到y(tǒng)ield語句也暫停,然后再次調(diào)用next(A),再調(diào)用next(B),周而復(fù)始,就實(shí)現(xiàn)了調(diào)度效果;可引入調(diào)度的策略來實(shí)現(xiàn)切換的方式;
協(xié)程是一種非搶占式調(diào)度;
yield from語句:
python3.3出現(xiàn)的新語法;
yield from iterrable是for item in iterable: yield item形式的語法糖,從可迭代對象中一個(gè)個(gè)拿元素;
例:
In [56]: def inc():
...:???? for x in range(1000):
...:???????? yield x
...:????????
In [57]: def inc():
...:??? ?yield from range(1000)
...:????
In [58]: foo=inc()
In [59]: next(foo)
Out[59]: 0
In [60]: next(foo)
Out[60]: 1
例:
In [68]: def counter(n):
...:???? yield from range(n)
...:????
In [69]: def inc(n):
...:???? yield from counter(n)
...:????
In [70]: foo=inc(10)
In [71]: next(foo)
Out[71]: 0
In [72]: next(foo)
Out[72]: 1
習(xí)題:
1、把一個(gè)字典扁平化flat;
源字典:{'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
2、實(shí)現(xiàn)base64編碼,要求自己實(shí)現(xiàn)算法;
3個(gè)8bit字節(jié)3*8-->轉(zhuǎn)化為4個(gè)6bit字節(jié)4*6,之后在6bit的前面補(bǔ)兩0,形成8bit一個(gè)字節(jié)的形式,如果剩下的字符不是3個(gè)字節(jié),則用0填充,輸出字符使用=,因此編碼后輸出的文本末尾可能會出現(xiàn)1個(gè)或2個(gè)=;
編碼大小為2**6=64;
每一段當(dāng)作一個(gè)8bit看它的值,這個(gè)值就是base64編碼表的索引值,找到對應(yīng)字符,再取3個(gè)字節(jié),同樣處理,直到最后;
例:
abc對應(yīng)的ascii為:0x61,0x62,0x63,十進(jìn)制為97,98,99
01100001 01100010 01100011
011000 010110 001001 100011
00011000 00010110 00001001 00100011
24 22 9 35
末尾處理:
正好3個(gè)字節(jié),處理方法同上;
剩1個(gè)字節(jié)或2個(gè)字節(jié),用0補(bǔ)滿3個(gè)字節(jié);
補(bǔ)0的字節(jié)用=表示;
大小端模式:
大端模式(Big-endian),是指數(shù)據(jù)的高字節(jié),保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié),保存在內(nèi)存的高地址中,這樣的存儲模式有點(diǎn)兒類似于把數(shù)據(jù)當(dāng)作字符串順序處理:地址由小向大增加,而數(shù)據(jù)從高位往低位放;
小端模式(Little-endian),是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲模式將地址的高低和數(shù)據(jù)位權(quán)有效地結(jié)合起來,高地址部分權(quán)值高,低地址部分權(quán)值低,和我們的邏輯方法一致;
在C語言中,默認(rèn)是小端(但在一些對于單片機(jī)的實(shí)現(xiàn)中卻是基于大端,比如Keil 51C),Java是平臺無關(guān)的,默認(rèn)是大端;在網(wǎng)絡(luò)上傳輸數(shù)據(jù)普遍采用的都是大端;
In [48]: b=int.from_bytes('abc'.encode(),'big')
In [49]: b
Out[49]: 6382179
In [50]: hex(b)
Out[50]: '0x616263'
In [52]: b=int.from_bytes('abc'.encode(),'little')
In [53]: hex(b)
Out[53]: '0x636261'
In [54]: type(b)
Out[54]: int
In [55]: import base64
In [56]: base64.b64encode('abc'.encode())
Out[56]: b'YWJj'
i18n(其來源是英文單詞internationalization的首末字符i和n,18為中間的字符數(shù))是“國際化”的簡稱。在資訊領(lǐng)域,國際化(i18n)指讓產(chǎn)品(出版物,軟件,硬件等)無需做大的改變就能夠適應(yīng)不同的語言和地區(qū)的需要。對程序來說,在不修改內(nèi)部代碼的情況下,能根據(jù)不同語言及地區(qū)顯示相應(yīng)的界面。在全球化的時(shí)代,國際化尤為重要,因?yàn)楫a(chǎn)品的潛在用戶可能來自世界的各個(gè)角落。通常與i18n相關(guān)的還有L10n(“本地化”的簡稱)。
3、求2個(gè)字符串的最長公共子串;
1、
src = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
target = {}
def flatmap(src,prefix=''):
for k,v in src.items():
if isinstance(v,(dict)):
flatmap(v,prefix=prefix+k+'.')
else:
target[prefix+k] = v
flatmap(src)
print(target)
#####################
src = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
def flatmap(src,dst=None,prefix=''):
if dst == None:??
???dst = {}
for k,v in src.items():
if isinstance(v,(dict)):
flatmap(v,dst,prefix=prefix+k+'.')?? #recursion調(diào)用
else:
dst[prefix+k] = v
return dst
flatmap(src)
注:
用戶輸入的判斷,這些代碼通常比業(yè)務(wù)邏輯代碼長好幾倍,健壯的代碼無論怎么運(yùn)行都不會意外崩潰;
一般不說明的情況下,都不會改源數(shù)據(jù)(源列表、源字典等);
能否不暴露給外界內(nèi)部的dst;
能否函數(shù)就提供一個(gè)參數(shù)源字典,返回一個(gè)新的扁平化字典;
遞歸時(shí)要把目標(biāo)字典的引用傳遞多層,如何處理;
########################
src = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
def flatmap(src):
def _flatmap(src,dst,prefix=''):
for k,v in src.items():
if isinstance(v,(dict)):
_flatmap(v,dst,prefix=prefix+k+'.')
else:
dst[prefix+k] = v
dst = {}
_flatmap(src,dst)
return dst
flatmap(src)
注:
不關(guān)心_flatmap函數(shù)內(nèi)部如何實(shí)現(xiàn),如內(nèi)部用的數(shù)據(jù)結(jié)構(gòu)、臨時(shí)對象、算法等,只關(guān)心調(diào)用后返回的結(jié)果;
#######################
src = {'a':{'b':1,'c':2},'d':{'e':3,'f':{'g':4}}}
def flatmap(src):
def _flatmap(src,dst,prefix=''):
for k,v in src.items():
key = prefix + k
if isinstance(v,(dict)):
_flatmap(v,dst,key+'.')
else:
dst[key] = v
dst = {}
_flatmap(src,dst)
return dst
?
flatmap(src)
?
2、
import string
import base64
alphabet = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
#teststr = 'abcd'
# teststr = 'abc'
teststr = 'ManMa'
def base(src):
ret = bytearray()
length = len(src)
r = 0
for offset in range(0,length,3):
if offset + 3 <= length:
triple = src[offset:offset+3]
else:
triple = src[offset:]
r = 3 - len(triple)
triple = triple + '\x00' * r
#print(triple,r)
b = int.from_bytes(triple.encode(),'big')
#print(hex(b))
for i in range(18,-1,-6):
if i == 18:
index = b >> i
else:
index = b >> i & 0x3F
ret.append(alphabet[index])
for i in range(1,r+1):
??????????ret[-i] = 0x3D
return bytes(ret)
print(base(teststr))
print('*' * 50)
print(base64.b64encode(teststr.encode()))
注:
alphabet = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/'
3、
def findit(str1,str2):
length = len(str1)
for sublen in range(length,0,-1):
for start in range(0,length-sublen+1):
substr = str1[start:start+sublen]
if str2.find(substr) != -1:
print('substrlen={}'.format(substr))
???????return substr
s1 = 'abcd'
s2 = 'abcefgd'
s3 = '123a'
print(findit(s1,s2))?? #傳參時(shí)要注意,str1為短字串,str2為長字串
print(findit(s1,s3))
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)頁題目:13lambda_yield_yieldfrom_coroutine-創(chuàng)新互聯(lián)
網(wǎng)址分享:http://muchs.cn/article24/iohce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、軟件開發(fā)、關(guān)鍵詞優(yōu)化、電子商務(wù)、自適應(yīng)網(wǎng)站、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容