Python新特性合集續(xù)
承接上一篇,本片文章將繼續(xù)介紹一批python3的新特性,由于每個(gè)特性的改動(dòng)比較小,所以放到一個(gè)合集里面
1汹买、Python3的文件open
由于Python3里面徹底把字符串和字節(jié)流分開(kāi)(這是好事),在Python3中打開(kāi)文件的模式就有了區(qū)別聊倔,‘r’和‘rb’兩種模式將得到不同的東西,看下面的例子:
>>> f=open('sample.txt','r')
>>> g=open('sample.txt','rb')
>>> f
<_io.TextIOWrapper name='sample.txt' mode='r' encoding='UTF-8'>
>>> g
<_io.BufferedReader name='sample.txt'>
>>> fline=f.read()
>>> fline
#中文顯示出來(lái)了
'fisrt line\n中文\n\ngqwegdf\n\n\ngq\n\nasdf\nasf\n\ngwq\n\n\n\n\n\n\nlastline\n'
>>> type(fline)
<class 'str'>
>>> gline=g.read()
>>> gline
#中文顯示為編碼的值
b'fisrt line\n\xe4\xb8\xad\xe6\x96\x87\n\ngqwegdf\n\n\ngq\n\nasdf\nasf\n\ngwq\n\n\n\n\n\n\nlastline\n'
>>> type(gline)
<class 'bytes'>
從上面的例子可以看出晦毙,Python3中用‘r’模式打開(kāi)的文件讀到的是字符串的結(jié)果,‘rb’模式讀到的是字節(jié)流的結(jié)果耙蔑,下面再看看Python2中混用字符串和字節(jié)流的結(jié)果:
>>> f=open('sample.txt','r')
>>> g=open('sample.txt','rb')
>>> f
<open file 'sample.txt', mode 'r' at 0x7f4a3d0884b0>
>>> g
<open file 'sample.txt', mode 'rb' at 0x7f4a3d088540>
>>> fline=f.read()
>>> gline=g.read()
>>> fline
#中文都顯示為編碼原值
'fisrt line\n\xe4\xb8\xad\xe6\x96\x87\n\ngqwegdf\n\n\ngq\n\nasdf\nasf\n\ngwq\n\n\n\n\n\n\nlastline\n'
>>> gline
'fisrt line\n\xe4\xb8\xad\xe6\x96\x87\n\ngqwegdf\n\n\ngq\n\nasdf\nasf\n\ngwq\n\n\n\n\n\n\nlastline\n'
>>> fline==gline
True
可以看出在Python2中结序,兩種方式讀到的內(nèi)容實(shí)際上是一樣的(這也是當(dāng)年讓我困惑的地方)。
2纵潦、Python3源文件編碼改為UTF-8
為此歡呼吧徐鹤,你再也不用寫那些惡心的#!encoding=utf-8的什么鬼了,大大方方的用中文寫注釋吧邀层!
當(dāng)然你要用中文編程返敬,也不是不可以啊。
3寥院、Python3的yield from語(yǔ)法
PEP-380(Syntax for Delegating to a Subgenerator)帶來(lái)了一種新的語(yǔ)法:yield from
關(guān)于yield和yield from比較復(fù)雜劲赠,涉及到協(xié)程什么的,我將在另一篇文章里面總結(jié)一下秸谢,這里就偷懶了凛澎。
4、其他的小改動(dòng)
比較雜
- 移除了backticks(使用repr()代替)
- 移除了<>(不等號(hào)估蹄,使用!=代替)
- as和with 變成了關(guān)鍵字
- True,False和None變成了關(guān)鍵字
- 移除了getslice塑煎,語(yǔ)法a[i:j]被解釋成a.getitem(slice(i,j))
- nonlocal聲明。使用nonlocal可以聲明一個(gè)外部變量(不是global變量)
- xrange()改名為range()臭蚁,range()現(xiàn)在不是產(chǎn)生一個(gè)列表(list)最铁,而是一個(gè)迭代器。
- next()重命名為next(),新的內(nèi)建函數(shù)next()可以調(diào)用一個(gè)對(duì)象的next()方法垮兑。
- 八進(jìn)制字冷尉,二進(jìn)制和bin()函數(shù)。應(yīng)該寫0o666而不是0666系枪,oct()函數(shù)也做了響應(yīng)的改動(dòng)雀哨。同樣,0b1010等價(jià)于10私爷,bin(10)返回”0b1010″雾棺。