1. 程式人生 > >Python2 和 Python3 的主要區別

Python2 和 Python3 的主要區別

Python2和Python3中的主要區別

Python2 和 Python3的區別體現在如下幾個方面:
1. print的改變
2. 編碼的改變
3. True和False的改變
4. nonlocal關鍵字
5. 迭代器的改變

1. print的改變

在Python2中,print是一個語句,將print後面的視為元組物件,在Python3中是作為函式存在的,print函式可以接收多個位置的引數,即print(arg1,arg2,arg3,…agrn)的形式使用,輸出的引數之間用空格隔開。例如下列程式碼:

#python2
>print ("hello world"
)#語句 hello world#命令列結果 >print ("hello world","hello guy")#語句 ('hello world', 'hello guy')#命令列結果 #python3 >print ("hello world")#語句 hello world#命令列結果 >print ("hello world","hello guy")#語句 Hello World hello guy#命令列結果

2. 編碼的改變

Python2預設ASCII編碼方式,但是ASCII編碼無法對中文等字元進行有效編碼,因此在涉及到中文等其他字元的編碼問題時,ASCII不僅無能為力,而且經常帶來一些亂七八糟的錯誤,這也是Python2中經常出現編碼錯誤的原因之一。之所以使用ASCII,是因為當初在Python2被設計的時候Unicode還沒有被設計出來,因此使用了ASCII編碼格式。而近些年來隨著全球科技蓬勃發展,機器學習的潮流更是呈現出一片欣欣向榮之勢,Python作為機器學習語言的不二之選,在全球範圍內也變得炙手可熱起來,隨著使用人數與日俱增,字元編碼的問題被越來越多的人所詬病,同時Python2中也存在一些與未來發展趨勢南轅北轍的設計缺陷,考慮到目前的問題和未來的發展方向,Python社群的大佬們決定對python進行大刀闊斧的改革創新。終於,經過了反覆商討、撕逼、修改、罵娘等過程後,大佬們也逐漸平靜下來,對於改革的方法達成了一致,2008年Python3.0橫空出世!
自此以後,編寫Python3.0以後的程式碼時,新手們的第一行程式碼再也不用因為糾結到底使用#coding = utf-8還是用# -- coding:utf-8 -

- 而輾轉反側,徹夜難眠了,因為Python3預設採用了UTF-8編碼。

3. True和False的改變

    Python2中True和False是兩個全域性變數,根據上述理解,變數可以進行賦值,於是可以有如下程式碼:
>>>True = False
>>>True
False

>>>True is False
True
>>>False = 'asdf'
>>>False
'asdf'

Python2中把True和False視作全域性變數,因為是變數,因此可以隨意進行賦值,對True和False賦值的操作,對於c/c++ java等程式設計師的來說,簡直就是不敢想象的事情,我們已經習慣於將True和False視作關鍵字,毋庸置疑,這個屬性給給Python2又貢獻了一個槽點。於是在Python3中,True和False變成了兩個關鍵字,指向了兩個固定的物件,不能再被重新賦值。

4. nonlocal關鍵字

Python2中要想在巢狀函式中將一個變數宣告為非區域性變數簡直就是異想天開的事情,然而在Python3中這是稀鬆平常的事情。Python3中加入了nonlocal關鍵字,可以在巢狀函式中給變數前面新增關鍵字nonlocal,就可以在巢狀函式之外使用巢狀函式中的變數。Python2中,如下程式碼所示:

def func():
    c = 1
    def foo():
        c = 12
    foo()
    print(c)
func()#結果是1

#Python3環境中執行
def func():
    c = 1
    def foo():
        nonlocal c
        c = 12
    foo()
    print(c)
func()#結果是12

上述區別資訊來源於劉志軍老師的部落格,是本人的轉述和一些個人見解,如有不當,還請批評指正!