溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python編程的兩處陷阱是什么

發(fā)布時(shí)間:2022-01-13 15:09:36 來(lái)源:億速云 閱讀:118 作者:iii 欄目:大數(shù)據(jù)

這篇“Python編程的兩處陷阱是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Python編程的兩處陷阱是什么”文章吧。

不可變對(duì)象陷阱

思路:生成1百萬(wàn)個(gè)隨機(jī)字符串,分別使用不可對(duì)象或可變對(duì)象合并字符串,比較花費(fèi)時(shí)間。

生成隨機(jī)字符串的代碼:

import random import time
big = [chr(i) for i in range(65,91)]small = [chr(i) for i in range(97,123)]
def randNStr(n):    ...:     result = []    ...:     for i in range(n):    ...:         strlen = random.randint(3,9)    ...:         result.append(''.join(random.sample(small+big,strlen)))    ...:     return result

使用不可變對(duì)象方法:combine+s 再賦值給combine,這條語(yǔ)句:因?yàn)閏ombine, s都為不可變對(duì)象,返回的結(jié)果就是新生成一個(gè)對(duì)象,對(duì)象不斷堆積。

def immfn(n):     ...:     combine=''     ...:     res = randNStr(n)     ...:     beg = time.time()     ...:     print('beg time %s'%str(beg))     ...:     for s in res:     ...:         combine = combine + s     ...:     #print(combine)     ...:     end = time.time()         ...:     print('end time %s'%str(end))     ...:     print('elispe time: %s'%str(end-beg))

為了避免重復(fù)生成新的對(duì)象,使用可變對(duì)象,文中 Python解惑之對(duì)象可變與不可變 提到過(guò),一般可迭代對(duì)象,都是可變的。

def mutfn(n):     ...:     combine=''     ...:     res = randNStr(n)     ...:     beg = time.time()     ...:     print('beg time %s'%str(beg))     ...:     combine = ''.join(res)     ...:     #print('print result:%s'%combine)     ...:     end = time.time()         ...:     print('end time %s'%str(end))     ...:     print('elispe time: %s'%str(end-beg)) 

此處使用 str.join(iter),接受可迭代對(duì)象,并只返回一個(gè)新對(duì)象。比較以上兩種方法的計(jì)算時(shí)間,分別從10萬(wàn),步長(zhǎng)10萬(wàn),終止到100萬(wàn),比較分析合并字符串的時(shí)間。

Python編程的兩處陷阱是什么

可以看到可變對(duì)象只生成一個(gè)新對(duì)象的方法,比不可變對(duì)象在數(shù)據(jù)量越大情況下,優(yōu)勢(shì)更明顯,呈現(xiàn)擴(kuò)張的喇叭口,當(dāng)數(shù)據(jù)為90萬(wàn)時(shí),節(jié)省時(shí)間成本高達(dá):(0.19-0.025)/0.025 = 6.6 倍。當(dāng)數(shù)據(jù)量增長(zhǎng)到1千萬(wàn)或更大時(shí),優(yōu)勢(shì)更明顯。

可變對(duì)象陷阱

BAT面試題26:一道Python填空題

題目是這樣的:

def f(x,l=[]):    ...:     for i in range(x):    ...:        l.append(i*i)    ...:     print(l) 
f(2)f(3)
結(jié)果為:
In [2]: f(2)                                                                                         [0, 1]
In [3]: f(3)                                                                                         [0, 1, 0, 1, 4]

原因,可變對(duì)象作為函數(shù)參數(shù),并被設(shè)為默認(rèn)值后,當(dāng)被再次調(diào)用函數(shù)后,函數(shù)參數(shù)原來(lái)取值將被再次索引。

為了避免這個(gè)問(wèn)題,可變對(duì)象的默認(rèn)值一般取值為常數(shù):None

def f(x,l=None):    ...:     if l is None:    ...:         l = []    ...:     for i in range(x):    ...:        l.append(i*i)    ...:     print(l)    ...:      

這樣連續(xù)被調(diào)用時(shí),將會(huì)按照預(yù)期輸出。

以上就是關(guān)于“Python編程的兩處陷阱是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI