1. 程式人生 > >深入理解python(一)python語法總結:基礎知識和對python中物件的理解

深入理解python(一)python語法總結:基礎知識和對python中物件的理解

用python也用了兩年了,趁這次疫情想好好整理下。

大概想法是先對python一些知識點進行總結,之後就是根據python核心原始碼來對python的實現方式進行學習,不會閱讀整個原始碼,,,但是應該會把資料結構的實現、函式呼叫過程、以及python虛擬機器的基本原理根據原始碼解釋下。

當然限於筆者只是一個弱雞,,,如內容有疏漏的地方或者是一些錯誤,希望看到的大佬不吝賜教。

第一部分 python語法總結

當然如果對python語法還是一無所知的同學請移步繆雪峰或者菜鳥教程等學習網站看一遍再過來,,,,這裡只是進行一些簡單的總結

當然,在這之中我會著重的標明一些python2和python3中的區別,具體的結構如下:

1.資料結構

2.選擇迴圈

3.字串與編碼

4.函式

5.面向物件程式設計

6.異常處理以及python的模組

基礎知識

當然,在開始之前我們還要簡單的回顧一下基本知識(當然僅僅是列出一些要注意的點):

1.一切皆物件的思想

物件是python中最基本的概念,在python中處理的每個東西都可以稱為物件,而同時python的變數都可以看成是記憶體中某個物件的引用。

關於引用的一個示例如圖:

 

 

 3,9即放在記憶體中的物件,而x則是對之的引用,當改變3的值的時候,只是將x指向的物件指向了9,而並沒有改變3的值。

之後則是關於可變物件和不可變物件:

  • 可變物件和不可變物件是指內容是否可以被改變。
  • 不可變物件包括:number,string,tuple,
  • 可變物件包括:list,set,dict

 

 

 下面給出幾個例子來說明上面的問題:

>>> a=1
>>> id(a)
491508784
>>> b=1
>>> id(b)
491508784
>>> c=[1,2,3]
>>> id(c)
45265984
>>> d=[1,2,3]
>>> id(d)
3252992
>>> a==b
True
>>> c==d
True
>>> a is b
True
>>> c is d
False

我們可以看到,對於不可變物件,在記憶體中地址是唯一的,而對於可變物件,即便值相等,但是在記憶體中的儲存卻是兩個不同的物件。同時python中“is”關鍵字是比較兩個引用引用的是否為一個物件,而對於==則是比較的是對應值

再來一個例子:

>>> a=1
>>> b=a
>>> a+=1
>>> a
2
>>> b
1
>>> a=[1,2,3]
>>> b=a
>>> b
[1, 2, 3]
>>> a[0]=0
>>> a
[0, 2, 3]
>>> b
[0, 2, 3]
>>> a*=2
>>> a
[0, 2, 3, 0, 2, 3]
>>> b
[0, 2, 3, 0, 2, 3]
>>> a=a*2
>>> a
[0, 2, 3, 0, 2, 3, 0, 2, 3, 0, 2, 3]
>>> b
[0, 2, 3, 0, 2, 3]

我們可以看到,由於數字是不可變物件,所以改變a,將a指向的物件改變了,b仍然是之前所指的值。而對於可變物件,由於a,b值得是同一物件,所以通過索引改變a的時候,b也會跟著改變。

但是對於a=a*2這個操作,並沒有對a進行原地(在物件上的)改變,相當於對重新建立了一個a*2的物件使a指向它,所以b並沒有改變,但a*=2這個操作則是原地的,所以b也會跟著改變。

所以為了避免索引改變值,我們引用了copy操作

>>> a = [1, 2, 3]
>>> b = a[:]
>>> id(a)
140200275166560
>>> id(b)
140200275238712             # 由於 b 引用的是 a 引用物件的一個拷貝,兩個變數指向的記憶體空間不同
>>> a[0] = 0
>>> b
[1, 2, 3]                   # 改變 a 中的元素並不會引起 b 的變化

>>> import copy
>>> b = copy.copy(a)

當然,還會有淺層copy和深層copy的區別,淺層只是對父物件進行了拷貝,而深層拷貝則是除了頂層拷貝外將所有的子物件也進行了拷貝,如下例:

>>> a=[[1,2,3],0,3]
>>> b=a.copy()
>>> a[0][0]=0
>>> b
[[0, 2, 3], 0, 3]
>>> a[1]=1
>>> a
[[0, 2, 3], 1, 3]
>>> b
[[0, 2, 3], 0, 3]
>>> import copy
>>> c=copy.deepcopy(a)
>>> a[0][0]=3
>>> a
[[3, 2, 3], 1, 3]
>>> c
[[0, 2, 3], 1, 3]

關於可迭代物件,這個就放在後面說,這裡就不展開了。

之後是關於物件的回收

上每個象包含一個引用的計數器,計數器記錄了當前指向該物件引用的數目,一旦物件的計數器為 0 ,即不存在對該物件的引用,則這個物件的記憶體空間會被回收。這就是 Python 中物件的回收機制,一個最明顯的好處即在編寫程式碼過程中不需要考慮釋放記憶體空間。

2.幾個python2和python3的差別

a.內建函式map()可以將一個單引數函式依次作用到一個序列的每個元素上,並返回:
一個列表作為結果(Python 2)
一個map物件(它是一個可迭代物件)作為結果 (Python 3)

 

 

b.python2和python3除法的區別:

Python中的除法有兩種,整數除法(整除運算)和真除法
Python 2和Python 3對“/”運算子的解釋有區別
Python 2將“/”解釋為整數除法,而Python 3將其解釋為真除法。例如,在Python 3中運算結果如下:

>>> 3/5
0.6
>>> 3//5
0
>>> 3.0/5
0.6
>>> 3.0//5
0.0
>>> 13//10
1

python2:

>>> 3/5
0
>>> 3//5
0
>>> 3.0/5
0.6
>>> 3.0//5
0.0
>>> 13//10
1

c.基本輸入輸出的區別

python2中input函式會根據所輸入的界定符來判斷物件型別,如輸入1為整型,而輸入‘1’為字串型。

python2中raw_input會將所有的輸入看為字串

而python3中則沒有raw_input,其input的作用就相當於python2中raw_input的作用

還有就是print函式的區別,相比大家已經很熟悉,這裡不再闡述。

3.幾個常用的內建函式,個人認為比較重要的幾個

map函式,第一個傳入一個函式,第二個引數傳入一個列表,返回對列表中每個項使用第一個引數函式的結果(pyhon2和3返回的結果型別不同)

如(python3):

>>> a=[1,2,3]
>>> map(str,a)
>>> c=map(str,a)
>>> type(c)
<class 'map'>
>>> list(c)
['1', '2', '3']

dir()函式可以檢視指定模組中包含的所有成員或者指定物件型別所支援的操作

ord()和chr()是一對功能相反的函式,ord()用來返回單個字元的序數或Unicode碼,而chr()則用來返回某序數對應的