python3新特性(三) 一些小改动合集
2016-12-20 本文已影响588人
Stansosleepy
Python新特性合集续
承接上一篇,本片文章将继续介绍一批python3的新特性,由于每个特性的改动比较小,所以放到一个合集里面
1、Python3的文件open
由于Python3里面彻底把字符串和字节流分开(这是好事),在Python3中打开文件的模式就有了区别,‘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
#中文显示出来了
'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’模式打开的文件读到的是字符串的结果,‘rb’模式读到的是字节流的结果,下面再看看Python2中混用字符串和字节流的结果:
>>> 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中,两种方式读到的内容实际上是一样的(这也是当年让我困惑的地方)。
2、Python3源文件编码改为UTF-8
为此欢呼吧,你再也不用写那些恶心的#!encoding=utf-8的什么鬼了,大大方方的用中文写注释吧!
当然你要用中文编程,也不是不可以啊。
3、Python3的yield from语法
PEP-380(Syntax for Delegating to a Subgenerator)带来了一种新的语法:yield from
关于yield和yield from比较复杂,涉及到协程什么的,我将在另一篇文章里面总结一下,这里就偷懒了。
4、其他的小改动
比较杂
- 移除了backticks(使用repr()代替)
- 移除了<>(不等号,使用!=代替)
- as和with 变成了关键字
- True,False和None变成了关键字
- 移除了getslice,语法a[i:j]被解释成a.getitem(slice(i,j))
- nonlocal声明。使用nonlocal可以声明一个外部变量(不是global变量)
- xrange()改名为range(),range()现在不是产生一个列表(list),而是一个迭代器。
- next()重命名为next(),新的内建函数next()可以调用一个对象的next()方法。
- 八进制字,二进制和bin()函数。应该写0o666而不是0666,oct()函数也做了响应的改动。同样,0b1010等价于10,bin(10)返回”0b1010″。