zoukankan      html  css  js  c++  java
  • Python3中的新特性(2)——常见陷阱

    1.文本与字节
    Python3对文本字符串(字符)和二进制数据(字节)进行了严格区分,'hello'表示一个以Unicode编码保存的文本字符串,而b'hello'表示一个字节字符串。
    在Python3中,无论什么情况都不能混用str和bytes类型,而在Python2中,会根据需要将字节字符串自动转换为Unicode。
    要将文本字符串转换为字节,必须使用s.encode(encoding)方法。例如,s.encode('uff-8')
    可将s转换为一个UTF-8编码的字节字符串。要将字节字符串t转换为文本,必须使用t.decode(encoding)方法。
    2.新的I/O系统
    新的I/O系统反映了文本和字符串形式的二进制数据之间的巨大差异。
    如果要对文本执行任何I/O操作,Python3会强制用户使用“文本模式”打开文件,如果不想使用默认编码(通常为UTF-8),还需提供可选的编码方式。如果对二进制数据执行I/O操作,必须使用“二进制模式”打开文件,并且使用字节字符串。常见的错误源头是将输出数据传递给以错误模式打开的文件或I/O流。
    >>>f = open("foo.txt","wb")
    >>>f.write("Hello world ")
    Traceback (most recent call last):
      File "<pyshell#17>", line 1, in <module>
        raise TypeError("can't write str to binary stream")
    TypeError: can't write str to binary stream
    3.print()和exec()函数
    Python3中的print和exec语句已经变成了函数。print()函数的用法如下:
    print(x,y,z)#print x,y,z
    print(x,y,z,end=' ')#print x,y,z,
    print(a,file=f)#print >>f,a
    exec()现在也是一个函数,考虑以下代码:
    def foo():
        exec('a = 42')
        print(a)
    在Python2中,调用foo函数将打印结果42。而在Python3中将会引发一个NameError异常,因为变量a没有定义。原因在于exec()作为函数,只操作globals()和locals()函数返回的字典。但locals()函数返回的字典实际上是局部变量的一个副本。exec()函数中进行的赋值只修改了局部变量的这份副本,而非局部变量本身。下面给出了一种解决办法:
    def foo():
        _locals = locals()
        exec("a = 42",globals(),_locals)
        a = _locals['a']
        print(a)
    4.使用迭代器和视图 
    Python3更好地利用了迭代器和生成器。像zip()、map()、range()这样过去返回列表的内置函数现在返回的是可迭代对象。如果需要将结果转换为列表,请使用list()函数。
    Python3在从字典提取键和值信息方面的做法略有不同。在Python2中,可以分别使用诸如d.keys()、d.values()、d.items()之类的方法获得键、值或键值对的列表。而在Python3中,这些方法返回的是所谓的视图对象,例如:
    >>>s = {'GOOG':490.10,'AAPL':123.45,'IBM':91.10}
    >>>k = s.keys()
    >>>k
    <dict_keys object at 0x33d950>
    >>>v = s.values()
    >>>v
    <dict_values object at 0x33d960>
    这些对象支持迭代,因此如果要查看它们的内容,可以使用for循环,例如:
    >>>for x in k:
    print(x)
     
    GOOG
    AAPL
    IBM
    视图对象始终关联到用于创建它们的字典。如果底层字典出现变化,视图生成的项也会随之变化,例如:
    >>>s['ACME'] = 5612.25
    >>>for x in k:
    print(x)
     
    GOOG
    AAPL
    IBM
    ACME
    如果需要构建字典键或值的列表,只要使用list()函数即可,例如list(s.keys())
    5.整数与整数除法
    Python3不再分别使用int和long类型表示32位整数和长整数。现在,int类型表示任意精度的整数。
    整数除法现在生成的结果始终是浮点数。即使结果正好是整数,也会被转换为浮点数。
    6.比较
    Python3对于值的比较要严格得多。
    在Python2中,任意两个对象均可进行比较,例如:
    >>>3 < 'Hello'
    True
    在Python3中,这种比较将导致TypeError异常。
    7.迭代器和生成器
    Python3对迭代器协议略作了修改。原来迭代时要调用__iter__()方法和next()方法,现在
    next方法已经更名为__next__()方法。
    8.文件名、参数与环境变量
    在Python3中,根据地区设置,可以将文件名、sys.argv中的命令行参数和os.environ中的环境变量当作Unicode处理。
    9.库的重新组织
    Python3重新组织并修改了标准库中某些部分的名称,其中大多数是与网络和Internet数据格式相关的常用模块。另外,各种遗留模块已经从库中删除。
    10.绝对导入
    由于库重新组织的关系,一个包的子模块出现的所有import语句都要使用绝对名称,但包的组织要像下面这样:
    foo/
    __init__.py
    spam.py
    bar.py
    如果文件spam.py使用语句import bar,就会引发ImportError异常,即便bar.py文件位于同一目录中也是如此。要加载此模块,spam.py需要使用import foo.bar语句或者使用像from . import bar这样的包相对导入。
    这与Python2有所区别,在继续检查sys.path中的其他目录之前,Python2中的import始终会在当前目录中寻求匹配。
  • 相关阅读:
    (转)simhash进行文本查重
    项目团队管理随记
    最常见到的runtime exception 异常
    javascript判断嵌套对象属性是否存在
    vim高清大图赏析(附常用快捷键)
    如何避免系统发送垃圾邮件
    使用javascript将数字转化为金额
    分享一个音乐电台(好看的 ui + html5)
    测试代码高亮显示
    Cadence 操作技巧总结1:测试点的生成2
  • 原文地址:https://www.cnblogs.com/Camilo/p/3332256.html
Copyright © 2011-2022 走看看