不知不覺,python自學(xué)教程已經(jīng)更新到第八篇了,再有幾篇,基本的語法就介紹完了。 今天來總結(jié)一下數(shù)據(jù)類型有哪些需要注意的地方。
創(chuàng)新互聯(lián)是專業(yè)的息烽網(wǎng)站建設(shè)公司,息烽接單;提供網(wǎng)站設(shè)計、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行息烽網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!
元組是另一種經(jīng)常使用到的數(shù)據(jù)類型,看上去和列表差不多。它們之間的區(qū)別在于列表是一個可變的數(shù)據(jù)類型,而元組是不可變的。
#元組
a=(1,2)
#列表
a=[1,2]
使用列表會更靈活,而元組支持的操作更少,有的人會認(rèn)為沒有必要用元組,直接用列表就可以了。
但正因為元組不可變,限制了功能,從效率上來講它會更加快一些,而且,當(dāng)你不想讓用戶去修改這個數(shù)據(jù)的時候,用元組會更合適,數(shù)據(jù)相對來說更加安全,不容易出bug。
使用元組的時候一定要記得在元素的后面加逗號,當(dāng)一個元組只有一個元素的時候,后面不打逗號,是不能表示成元組的,而是元素本身的類型。
a=(1)#等于1
a=(1,)#這才是元組
在編程語言當(dāng)中,浮點數(shù)的精度往往不能達(dá)到完全的精確,這會給我們編程帶來一些問題,甚至呢可能帶來很大的bug。比如說我們現(xiàn)在計算一個很簡單的小數(shù)點的運算,0.1+0.2,大家可以先回答一下這個應(yīng)該等于多少呢?
print(0.1+0.2)
很明顯這是一個小學(xué)的數(shù)學(xué)題,但是呢,當(dāng)我們交給Python去運算的話呢,我們得到結(jié)果并不是等于0.3而是等于
0.
這是計算機(jī)在表示十進(jìn)制小數(shù)的時候會出現(xiàn)誤差。
從直觀的感受上看,這種精度好像造成不了太大的影響。但是,在對數(shù)據(jù)要求非常嚴(yán)格的情況下,這種誤差會引發(fā)打的問題,尤其是在做測試的時候,如果你你的預(yù)期結(jié)果和實際結(jié)果都不相等,那么你測試用例肯定是不會通過的。
在操作銀行、證券這類金融業(yè)務(wù)時,涉及到支付和錢的時候一定要有非常嚴(yán)格的精度控制。 此時,可以使用 decimal 模塊來保持高精度,我們把需要操作的浮點數(shù)先轉(zhuǎn)換成字符串,再作為參數(shù)傳給 Decimal 類。
fromdecimalimportDecimal
print(Decimal("0.1")+Decimal("0.2"))
#0.3
在進(jìn)行除法運算的時候,一定要牢記:被除數(shù)是不能等于0的。
當(dāng)你把0作為一個被除數(shù)的時候,程序是會報錯的。
print(3/0)
面試題當(dāng)中列表問題出現(xiàn)的概率應(yīng)該有80%以上,因為列表的操作非常頻繁,而且比較容易出錯,現(xiàn)在我們就來看一個經(jīng)典問題:刪除列表元素。
有一個列表如下,請刪除列表當(dāng)中的每一個元素,但是不能直接用clear方法。
names=["九柄","八柄","七柄","六柄","五柄"]
按照條件反射,我們一般會寫一個 for 循環(huán),然后依次執(zhí)行remove方法或者 pop 方法來刪除元素。但是這樣得到的結(jié)果是不對的,總有幾個元素刪除不掉。
fornameinnames:
names.remove(name)
print(names)
#["八柄","六柄"]
為什么會刪不干凈呢?最核心的原因是:刪除掉一個元素之后,這個列表發(fā)生了變化。
第1次,我們?nèi)〉降脑厥撬饕秊?的 “九柄”, 它被刪掉了之后, 接下來去取索引為 1 的元素,因為“九柄” 已經(jīng)被刪除,所以索引為0的元素已經(jīng)被替換成 "八柄", 索引為1 的元素則為”七柄“, 七柄被刪,八柄跳過去了,沒有被刪除。
然后,取索引為 2 的數(shù)據(jù),為 ”五柄“, ”六柄“ 又被跳過了,從而造成刪除不干凈的情況。
從這個例子當(dāng)中我們得出一個結(jié)論,不要在for循環(huán)當(dāng)中去修改列表刪除列表或者增加元素,這樣非常容易出 bug。那上面的問題如果我們想解決怎么辦呢?在我們?nèi)ゲ僮饕粋€列表的時候,我們最好是做一個備份,不直接去修改原來的列表。
fornameinnames[:]:
names.remove(name)
print(names)
實際上大多數(shù)的可變類型雖然增加了靈活性,有更多的操作,但是更容易出bug。在我個人的編程過程當(dāng)中,我會盡量使用不可變類型。
為了區(qū)分可變類型和不可變也行,我們舉幾個例子。
a = [1, 2, ("a", "b")]
此時,a 是列表,是可變類型,可以任意添加、修改其中的元素,比如把索引2的元素?fù)Q成 c
a[2]="c"
#[1,2,'c']
但是,不能改 ("a", "b")
當(dāng)中的元素,因為它是個元組。
a[2][0] = "c" # 報錯
總的來說數(shù)據(jù)類型是難度比較低的內(nèi)容,只有很多方法比較難記。在開始學(xué)Python的時候,可以從數(shù)據(jù)類型入手,這樣比較容易增加信心,只要稍微努力一點,多記一些相關(guān)的方法,可以迅速上手寫代碼。