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\n")
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始终会在当前目录中寻求匹配。

Python3中的新特性(2)——常见陷阱的更多相关文章

  1. Python3中的新特性(3)——代码迁移与2to3

    1.将代码移植到Python2.6 建议任何要将代码移植到Python3的用户首先将代码移植到Python2.6.Python2.6不仅与Python2.5向后兼容,而且支持Python3中的部分新特 ...

  2. Python3中的新特性(1)——新的语言特性

    1.源代码编码和标识符         Python3假定源代码使用UTF-8编码.另外,关于标识符中哪些字符是合法的规则也放宽了.特别是,标识符可以包含代码点为U+0080及以上的任意有效Unico ...

  3. 相比于python2.6,python3.0的新特性。

    这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. ...

  4. WPF中的3D特性和常见的几个类

    原文:WPF中的3D特性和常见的几个类 WPF 3D 常用的几个类及其关系 1.  Visual 类      所有二维可视化元素的基类,为 WPF 中的呈现提供支持,其中包括命中测试.坐标转换和边界 ...

  5. python-3.8.0 新特性之赋值表达式

    [python-3.8.0 新特性之赋值表达式] 赋值表达式的语法是这样的“ name := expression ”,形式上看和赋值语句 “ = ” 差不多,就作用上来看也雷同.也就是说 “:=” ...

  6. 1 PHP 5.3中的新特性

    1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...

  7. ASP.NET 5与MVC 6中的新特性

    差点忘了提一句,MVC 6中默认的渲染引擎Razor也将得到更新,以支持C# 6中的新语法.而Razor中的新特性还不只这一点. 在某些情况下,直接在Web页面中嵌入某些JSON数据的方式可能比向服务 ...

  8. Webpack 3 中的新特性

    本文简短地分享下最新发布的 Webpack 3 中的新特性,供大家参考. 1. Webpack 3 的新特性 6 月 20 日,Webpack 发布了最新的 3.0 版本,并在 Medium 发布了公 ...

  9. 使用示例带你提前了解 Java 9 中的新特性

    使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...

随机推荐

  1. javasisst & JAVA8

    今天在服务器上启动tomcat7的时候,提示如下异常: java.io.IOException: invalid constant type: 15 具体看是javasisst抛出来的. 系统运行环境 ...

  2. MongoDB 存储日志数据

    MongoDB 存储日志数据 https://www.cnblogs.com/nongchaoer/archive/2017/01/11/6274242.html 线上运行的服务会产生大量的运行及访问 ...

  3. P2730 魔板 Magic Squares

    题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜 ...

  4. BZOJ 1023: [SHOI2008]cactus仙人掌图 | 在仙人掌上跑DP

    题目: 求仙人掌直径 http://www.lydsy.com/JudgeOnline/problem.php?id=1023 题解: 首先给出仙人掌的定义:满足所有的边至多在一个环上的无向联通图 我 ...

  5. Visio中设置自定义属性的值

    ShapeSheet中User-Define Cells中Prompt格. 帮助解释为:为用户定义的单元格指定说明性提示或注释.应用程序自动将提示文本用引号 (" ") 引起来,以 ...

  6. 洛谷P3806 【模板】点分治1 【点分治】

    题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接 ...

  7. CENSORING

    CENSORING 题目描述 FJ为它的奶牛订阅了很多杂志,balabala.......,其中有一些奶牛不宜的东西(比如如何煮牛排). FJ将杂志中所有的文章提取出来组成一个长度最多为10^5的字符 ...

  8. BZOJ day8

    好吧,, 补一天题解. 1001  狼抓兔子 妥妥的网络流啊,难度仅次于草地排水,边都给出来了.就是注意反向边也要有流量就行. 1007 水平可见直线 这个题按斜率排序(注意不是绝对值),然后将直线入 ...

  9. MySQL使用笔记(一)安装配置

    By francis_hao    Nov 27,2016   一般软件的安装都是可以通过源码和安装包安装,源码安装可配置性好些,安装包安装比较省事,况且使用yum也可以解决依赖的问题,基本实现了一键 ...

  10. MySQL里执行SHOW INDEX结果中Cardinality的含义

    今天在写一个Perl脚本,想自动化查找出MySQL数据库中可能无效的索引,于是根据朝阳的书上提到的一些规则,我来设计了一些判断方法,其中发现某个我想要的值就是SHOW INDEX FROM table ...