print 在Python2中作為語(yǔ)句,在Python3中作為函數(shù)
實(shí)例1:
print(''hello''):在Python2中(''hello'')是語(yǔ)句的一部分妻味,是一個(gè)整體正压;在Python3中''hello''是作為一個(gè)參數(shù)出入到函數(shù)中。
實(shí)例2:
print(''hello'', ''world''):在Python2中輸出一個(gè)元組弧可,在Python3中輸出兩個(gè)字符串默認(rèn)中間用空格隔開(kāi)蔑匣。
注:在Python2.6+中導(dǎo)入future模塊中的print_fuction才能將print當(dāng)做函數(shù)使用。
編碼
Python2默認(rèn)編碼ascii棕诵,Python3默認(rèn)編碼UTF-8,因此使用Python3不需要文件頂部寫(xiě)‘# coding=utf-8’凿将。
字符串
Python2中字符串有兩個(gè)類(lèi)型:unicode和str校套,前者表示文本字符串,后者表示字節(jié)序列牧抵,兩者沒(méi)有明顯的界限笛匙,開(kāi)發(fā)者也感覺(jué)很混亂。
Python3中做了嚴(yán)格的區(qū)分犀变,str表示字符串妹孙,byte表示字節(jié)序列,任何需要寫(xiě)入文本或者網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)都只接收字節(jié)序列获枝。
補(bǔ)充:encode()和decode()
decode 解碼蠢正,encode 編碼:字符串在Python內(nèi)部的表示是unicode編碼,在做編碼轉(zhuǎn)換時(shí)省店,通常需要以u(píng)nicode作為中間編碼嚣崭, 即先將其他編碼的字符串解碼(decode)成unicode,再?gòu)膗nicode編碼(encode)成另一種編碼懦傍。
實(shí)例:s='中文' 如果是在utf8的文件中雹舀,該字符串就是utf8編碼,如果是在gb2312的文件中粗俱,則其編碼為gb2312说榆。這種情況下,要進(jìn)行編碼轉(zhuǎn)換,都需要先用 decode方法將其轉(zhuǎn)換成unicode編碼签财,再使用encode方法將其轉(zhuǎn)換成其他編碼串慰。
True和False
True和False在Python2中是兩個(gè)全局變量,數(shù)值上對(duì)應(yīng)1和0荠卷,既然是變量就可以被賦值模庐,但這樣容易造成混亂;故在Python3中 True和False變?yōu)閮蓚€(gè)關(guān)鍵字油宜,永遠(yuǎn)指向兩個(gè)固定對(duì)象掂碱,不允許被重新賦值。
迭代器
Python2中很多返回列表對(duì)象的內(nèi)置函數(shù)和方法在Python3中都改成了返回類(lèi)似于迭代器的對(duì)象慎冤,迭代器的惰性求值特性使得操作大數(shù)據(jù)更加有效率疼燥。
補(bǔ)充:惰性求值不要求加載好整個(gè)迭代過(guò)程中所有的元素。迭代器僅僅在迭代至某個(gè)元素時(shí)才計(jì)算該元素蚁堤,而在這之前或之后醉者,元素可以不存在或者被銷(xiāo)毀,大大節(jié)約內(nèi)存披诗。
字典對(duì)象dict.keys()撬即、dict.values()方法都不再返回列表,而是生成一個(gè)類(lèi)似迭代器的“view”對(duì)象返回呈队。高階函數(shù)map剥槐、filter、zip返回也都從列表變成了對(duì)象宪摧。Python2的迭代器必須實(shí)現(xiàn)next方法粒竖,二Python3改成了next。
nonlocal
在Python2中可以在函數(shù)中使用global聲明變量為全局變量几于,但是給一個(gè)變量聲明為非局部變量是無(wú)法實(shí)現(xiàn)的蕊苗。在Python3,新增了關(guān)鍵字nonlocal沿彭,使得定義非jubu變量成為了可能朽砰。
1/2在Python2中結(jié)果是0,Python3中是0.5
其實(shí)也就是Python2中 / 的作用就是地板除膝蜈,而在Python3中用 // 作為地板除锅移。
模塊改名
一些相關(guān)的模塊放進(jìn)同一個(gè)包里面(如httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib放進(jìn)了http里面,urllib , urllib2, urlparse, robotparse放進(jìn)了urllib里面)饱搏,SocketServer改成了socketserver非剃,Queue改成queue等。
一些新語(yǔ)法
print/exec等成為了函數(shù)推沸,格式化字符串變量备绽,類(lèi)型標(biāo)注券坞,添加了nonlocal、yield from肺素、async/await恨锚、yield for關(guān)鍵詞和annotations、context倍靡、traceback猴伶、qualname等dunder方法。