美文网首页程序员今日看点Python 运维
python3新特性(三) 一些小改动合集

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

作者: Stansosleepy | 来源:发表于2016-12-20 06:42 被阅读588次

    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″。

    相关文章

      网友评论

        本文标题:python3新特性(三) 一些小改动合集

        本文链接:https://www.haomeiwen.com/subject/ifjxvttx.html