華文網

直擊:初學者都會犯的幾個錯誤和學習路線

對於Python初學者,大家在初期都會遇見很多問題和疑問,

今天給大家分享幾個Python初學者容易犯的幾個錯誤。在初期,Python語言裡面的一些小坑是大家容易犯的,特別容易弄混弄錯,初學者要是不注意的話,很容易坑進去,今天,我給大家深入解析一些這幾個坑,希望對初學者有所幫助.

1.i+=1 不等於++i

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

先來看一個小例子:

i=0

mylist=[1,2,3,4,5,6]

while i

print(mylist[i])

++i

這段代碼會想當然的認為,沒有啥問題啊,一個迴圈輸出,

i不斷的+1,蠻對的呀.其實不是的,這個代碼會一直輸出1,一個閉環.因為Python的解譯器會將++i操作為+(+i).其中+表示是正數符號,對於--i也是類似的.

print(+1)

>>>1

print(++1)

>>>1

print(+++1)

>>>1

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

2.分清楚==和is的用法

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

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

a='Hi'

b='Hi'

print(a is b)

>>>True

print(a==b)

>>>True #看起來is和==好像是一樣的

我們再看第二個例子:

str1='Wo shi yi ge chi huo'

str2='Wo shi yi ge chi huo'

print(str1 is str2)

>>>False#is的結果是False

print(str1==str2)

>>>True #==的結果為True,看二者不一樣了吧

第三個例子

str3='string'

str4=''.join(['s','t','r','i','n','g'])

print(str3)

>>>string

print(str3 is str4)

>>>False #is的結果是False

print(str3==str4)

>>>True #==的結果為True,看二者不一樣了吧

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

我們用內置的id()這函數,這個函數用來返回物件的記憶體位址,查一下就清楚了

is是物件的標示符,用來比較兩個物件的記憶體空間是不是一樣,

是不是用的同一塊空間位址,而==是比較兩個物件的內容是否相等.

3.連接字串特別是大規模的字串,最好用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

4.不要在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 的人來說,會令閱讀代碼的人感到相當費解.

嗯,今天也給大家講下,大家在初期學習Python的時候,應該知道的學習規劃,學習路線,以及學習方向。

學習路線

第一部分:

1,開發環境搭建:環境搭建 編輯器 基本調試雙版本相容

2,python基礎:基本知識 物件導向編輯 面相物件設計思想

3,python高級專題

第二部分

:1,linux基礎:獲取與安裝 基本操作 電源,進程,任務管理,vim編輯器 用戶與許可權 包管理

2,python web工具:序列化 網路資源獲取

3,python部署工具:pip virtualenv fabric

4,關係型數據庫:基本理論 DB_API與sqlite3 Mysql

5,Python web框架基礎原理

第三部分:python web開發:

1,web.py 基礎

2,Django基礎

3,Flask基礎

4,Tornado基礎

第四部分:

專案框架開發,專案框架這部分涉及到的東西就太多了,就不給大家一一的列舉出來,就算列舉出來,空間也不夠。

最後說一下,若我寫的對大家有幫助,麻煩大家支持一下,也是對我的一點鼓勵和動力.。

那就執行else 塊。

try/finally 同樣非常直觀,這裡的finally 的意思是:執行過前面的try 塊之後,不管如何總是執行finally塊。

問題來了對於剛接觸Python 的程式師可能會把for/else 結構中的else 塊理解為:如果迴圈沒有正常執行完,那就執行else 塊。

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

嗯,今天也給大家講下,大家在初期學習Python的時候,應該知道的學習規劃,學習路線,以及學習方向。

學習路線

第一部分:

1,開發環境搭建:環境搭建 編輯器 基本調試雙版本相容

2,python基礎:基本知識 物件導向編輯 面相物件設計思想

3,python高級專題

第二部分

:1,linux基礎:獲取與安裝 基本操作 電源,進程,任務管理,vim編輯器 用戶與許可權 包管理

2,python web工具:序列化 網路資源獲取

3,python部署工具:pip virtualenv fabric

4,關係型數據庫:基本理論 DB_API與sqlite3 Mysql

5,Python web框架基礎原理

第三部分:python web開發:

1,web.py 基礎

2,Django基礎

3,Flask基礎

4,Tornado基礎

第四部分:

專案框架開發,專案框架這部分涉及到的東西就太多了,就不給大家一一的列舉出來,就算列舉出來,空間也不夠。

最後說一下,若我寫的對大家有幫助,麻煩大家支持一下,也是對我的一點鼓勵和動力.。