python3新特性(三) 一些小改动合集

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″。
    原文作者:Stansosleepy
    原文地址: https://www.jianshu.com/p/ed352e7876bb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞