Copyright ? 1999-2020, CSDN.NET, All Rights Reserved
恭城網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),恭城網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為恭城千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營銷網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的恭城做網(wǎng)站的公司定做!
惰性計算的序列
打開APP
Python 的惰性求值與惰性序列 翻譯
2018-07-23 14:57:48
2點(diǎn)贊
東師小鎮(zhèn)
碼齡5年
關(guān)注
惰性求值
在編程語言理論中,惰性求值(英語:Lazy Evaluation),又譯為惰性計算、懶惰求值,也稱為傳需求調(diào)用(call-by-need),是一個計算機(jī)編程中的一個概念,它的目的是要最小化計算機(jī)要做的工作。它有兩個相關(guān)而又有區(qū)別的含意,可以表示為“延遲求值”和“最小化求值”。
避免不必要的計算,帶來性能的提升(最小化求值)。
對于Python中的條件表達(dá)式 if x and y,在x為false的情況下y表達(dá)式的值將不再計算。而對于if x or y,當(dāng)x的值為true的時候?qū)⒅苯臃祷?,不再計算y的值。因此編程中可以利用該特性,在 and邏輯中,將小概率發(fā)生的條件放在前面或者在or邏輯中,將大概率發(fā)生的時間放在前面,有助于性能的提升。
2. 節(jié)省空間,使得無線循環(huán)的數(shù)據(jù)結(jié)構(gòu)成為可能(延遲求值)。
延遲求值特別用于函數(shù)式編程語言中。在使用延遲求值的時候,表達(dá)式不在它被綁定到變量之后就立即求值,而是在該值被取用的時候求值。延遲求值的一個好處是能夠建立可計算的無限列表而沒有妨礙計算的無限循環(huán)或大小問題。例如,可以建立生成無限斐波那契數(shù)列表的函數(shù)(經(jīng)常叫做“流”)。第n個斐波那契數(shù)的計算僅是從這個無限列表上提取出這個元素,它只要求計算這個列表的前n個成員。
惰性序列
Python的惰性序列多數(shù)指 iterator,其特點(diǎn)正如同上文所述,具有惰性計算特點(diǎn)的序列稱為惰性序列。
Python的iterator是一個惰性序列,意思是表達(dá)式和變量綁定后不會立即進(jìn)行求值,而是當(dāng)你用到其中某些元素的時候才去求某元素對的值。 惰性是指,你不主動去遍歷它,就不會計算其中元素的值。
一句話理解:
迭代器的一個優(yōu)點(diǎn)就是它不要求你事先準(zhǔn)備好整個迭代過程中所有的元素。
迭代器僅僅在迭代至某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀。
這個特點(diǎn)使得它特別適合用于遍歷一些巨大的或是無限的集合,比如幾個G的文件,或是斐波那契數(shù)列等等。
用定時器做,1秒鐘喚醒一次響應(yīng)函數(shù),不要用延時函數(shù) sleep
# 定義時間顯示
self.timer = QtCore.QTimer(self)
self.timer.timeout.connect(self.act_displayTM) #綁定響應(yīng)函數(shù)
self.timer.setInterval(1000) #設(shè)置時間間隔
self.timer.start()
# 定時響應(yīng)事件對應(yīng)邏輯
def act_displayTM(self):
s_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self.ui.label_Date.setText(s_time)
return
8個超好用內(nèi)置函數(shù)set(),eval(),sorted(),reversed(),map(),reduce(),filter(),enumerate()
python中有許多內(nèi)置函數(shù),不像print那么廣為人知,但它們卻異常的強(qiáng)大,用好了可以大大提高代碼效率。
這次來梳理下8個好用的python內(nèi)置函數(shù)
1、set()
當(dāng)需要對一個列表進(jìn)行去重操作的時候,set()函數(shù)就派上用場了。
用于創(chuàng)建一個集合,集合里的元素是無序且不重復(fù)的。集合對象創(chuàng)建后,還能使用并集、交集、差集功能。
2、eval()之前有人問如何用python寫一個四則運(yùn)算器,輸入字符串公式,直接產(chǎn)生結(jié)果。用eval()來做就很簡單:eval(str_expression)作用是將字符串轉(zhuǎn)換成表達(dá)式,并且執(zhí)行。
3、sorted()在處理數(shù)據(jù)過程中,我們經(jīng)常會用到排序操作,比如將列表、字典、元組里面的元素正/倒排序。這時候就需要用到sorted() ,它可以對任何可迭代對象進(jìn)行排序,并返回列表。對列表升序操作:
對元組倒序操作:
使用參數(shù):key,根據(jù)自定義規(guī)則,按字符串長度來排序:
根據(jù)自定義規(guī)則,對元組構(gòu)成的列表進(jìn)行排序:
4、reversed()如果需要對序列的元素進(jìn)行反轉(zhuǎn)操作,reversed()函數(shù)能幫到你。reversed()接受一個序列,將序列里的元素反轉(zhuǎn),并最終返回迭代器。
5、map()做文本處理的時候,假如要對序列里的每個單詞進(jìn)行大寫轉(zhuǎn)化操作。這個時候就可以使用map()函數(shù)。
map()會根據(jù)提供的函數(shù),對指定的序列做映射,最終返回迭代器。也就是說map()函數(shù)會把序列里的每一個元素用指定的方法加工一遍,最終返回給你加工好的序列。舉個例子,對列表里的每個數(shù)字作平方處理:
6、reduce()前面說到對列表里的每個數(shù)字作平方處理,用map()函數(shù)。那我想將列表里的每個元素相乘,該怎么做呢?這時候用到reduce()函數(shù)。
reduce()會對參數(shù)序列中元素進(jìn)行累積。第一、第二個元素先進(jìn)行函數(shù)操作,生成的結(jié)果再和第三個元素進(jìn)行函數(shù)操作,以此類推,最終生成所有元素累積運(yùn)算的結(jié)果。再舉個例子,將字母連接成字符串。
你可能已經(jīng)注意到,reduce()函數(shù)在python3里已經(jīng)不再是內(nèi)置函數(shù),而是遷移到了functools模塊中。這里把reduce()函數(shù)拎出來講,是因?yàn)樗匾恕?/p>
7、filter()一些數(shù)字組成的列表,要把其中偶數(shù)去掉,該怎么做呢?
filter()函數(shù)輕松完成了任務(wù),它用于過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象。filter()函數(shù)和map()、reduce()函數(shù)類似,都是將序列里的每個元素映射到函數(shù),最終返回結(jié)果。我們再試試,如何從許多單詞里挑出包含字母w的單詞。
8、enumerate()這樣一個場景,同時打印出序列里每一個元素和它對應(yīng)的順序號,我們用enumerate()函數(shù)做做看。
enumerate翻譯過來是枚舉、列舉的意思,所以說enumerate()函數(shù)用于對序列里的元素進(jìn)行順序標(biāo)注,返回(元素、索引)組成的迭代器。再舉個例子說明,對字符串進(jìn)行標(biāo)注,返回每個字母和其索引。
你這n變量的類型不符合time.sleep()的要求,需要把n轉(zhuǎn)換成time.sleep()支持的類型:
例如:
n = input("延時時間:")
print(time.ctime())
time.sleep(int(n))
print(time.ctime())
效果:
Python中的sleep函數(shù)可以傳小數(shù)進(jìn)去,就可以進(jìn)行毫秒級的延時了,代碼如下:
#?例1:循環(huán)輸出休眠1秒
import?time
i?=?1
while?i?lt;=?3:
print?i?#?輸出i
i?+=?1
time.sleep(1)?#?休眠1秒
#?例2:循環(huán)輸出休眠100毫秒
import?time
i?=?1
while?i?lt;=?3:
print?i?#?輸出i
i?+=?1
time.sleep(0.1)?#?休眠0.1秒