国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python新手們容易犯的幾個錯誤總結

2019-11-25 16:16:15
字體:
來源:轉載
供稿:網友

前言

這篇文章主要給大家總結了關于學習Python的新手們容易犯的幾個錯誤,一共四個易犯錯誤,下面來看看詳細的介紹吧。

一、i+=1 不等于++i

初學者對Python語言不是特別了解的話,又正好有c++,java的語言背景,很容易把++i和i+=1弄混

先來看一個小例子:

i=0mylist=[1,2,3,4,5,6]while i <len(mylist): print(mylist[i]) ++i

這段代碼會想當然的認為,沒有啥問題啊,一個循環輸出,i不斷的+1,蠻對的呀.其實不是的,這個代碼會一直輸出1,一個死循環.因為Python的解釋器會將++i操作為+(+i) .其中+表示是正數符號,對于--i也是類似的.

print(+1)>>>1print(++1)>>>1print(+++1)>>>1

這下明白了++i雖然在Python語法是合法的,但是并不是我們理解的自增的操作.

二、分清楚==和is的用法

在判斷字符串是否相等的時候,初學者特別會弄混is和==,這樣的結果是程序在不同的情況下表現不同:

比如先看一個簡單的例子:

a='Hi'b='Hi'print(a is b)>>>Trueprint(a==b)>>>True #看起來is和==好像是一樣的

我們再看第二個例子:

str1='Wo shi yi ge chi huo'str2='Wo shi yi ge chi huo'print(str1 is str2)>>>False#is的結果是Falseprint(str1==str2)>>>True #==的結果為True,看二者不一樣了吧

第三個例子

str3='string'str4=''.join(['s','t','r','i','n','g'])print(str3)>>>stringprint(str3 is str4)>>>False #is的結果是Falseprint(str3==str4)>>>True #==的結果為True,看二者不一樣了吧

這就是很容易混淆初學者的地方,感覺很奇怪,為什么有的時候is和==輸出相同,有的時候不同呢.好我們來一探究竟:

我們用內置的id()這函數,這個函數用來返回對象的內存地址,查一下就清楚了

is是對象的標示符,用來比較兩個對象的內存空間是不是一樣,是不是用的同一塊空間地址,而==是比較兩個對象的內容是否相等.

三、連接字符串特別是大規模的字符串,最好用join 而不是+

字符串處理的時候,最常用的是連接,Python中的字符串與其他的語言有一點不同,它是不可變對象,一旦創建不能改變.而這個特性直接會影響到Python中字符串連接的效率.

用+連接字符串:

str1,str2,str3='test','string','connection'print(str1+str2+str3)>>>test string connection

用join連接字符串

str1,str2,str3='test ','string ','connection'print(''.join([str1,str2,str3]))>>>test string connection

但是若是連接大規模的字符串,比如要連接10萬左右的字符串的時候,join的方法效率就會快很多(甚至相差百倍).比如下面這10萬個字符串連接.

long_str_list=['This is a long string' for n in range(1,100000)]

原因是因為若要連接字符串:S1+S2+S3+....+SN,由于字符串是不可變的對象,執行一次就要申請一塊新的內存,這樣的話在N個字符串連接的過程中,會產生N-1個中間結果,每產生一個中間結果就要申請一次內存,這樣會嚴重影響執行效率.

而join不一樣,它是一次性申請總的內存,然后把字符串里面的每一個元素復制到內存中去,所以join會快很多.

因此,字符串的連接,尤其是大的字符串處理,最好用join

四、不要在for 和while 循環后面寫else 塊

Python 提供了一種很多編程語言都不支持的功能,那就是可以在循環內部的語句塊后面直接編寫else 塊。比如:

for i in range(3): print('Loop %d'%i)else: print('Else block')>>>Loop 0>>>Loop 1>>>Loop 2>>>Else block
  • 這種else 塊會在整個循環執行完之后立刻運行。既然如此,那它為什么叫做else 呢?為什么不叫and ?在if/else 語句中,else 的意思是:如果不執行前面那個if 塊,那就執行else 塊。
  • 同理try/except/else 也是如此,該結構的else 的含義是:如果前面的try 塊沒有失敗,那就執行else 塊。
  • try/finally 同樣非常直觀,這里的finally 的意思是:執行過前面的try 塊之后,不管如何總是執行finally塊。

問題來了對于剛接觸Python 的程序員可能會把for/else 結構中的else 塊理解為:如果循環沒有正常執行完,那就執行else 塊

實際上剛好相反――在循環里用break語句提前跳出,會導致程序不執行else 塊,這一點會有點繞.對于不熟悉for/else 的人來說,會令閱讀代碼的人感到相當費解.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 沙坪坝区| 威远县| 天镇县| 齐齐哈尔市| 伊川县| 休宁县| 吉水县| 南郑县| 太谷县| 滦平县| 双牌县| 本溪| 贵溪市| 德惠市| 郓城县| 威宁| 正蓝旗| 浑源县| 凌海市| 五常市| 阜宁县| 东至县| 丰城市| 昌江| 沙坪坝区| 汽车| 大竹县| 开化县| 赞皇县| 大足县| 铜川市| 常州市| 平乐县| 平乡县| 南开区| 红安县| 建瓯市| 五家渠市| 武山县| 江华| 建阳市|