print 在Python2中作为语句,在Python3中作为函数
实例1:
print(''hello''):在Python2中(''hello'')是语句的一部分,是一个整体;在Python3中''hello''是作为一个参数出入到函数中。
实例2:
print(''hello'', ''world''):在Python2中输出一个元组,在Python3中输出两个字符串默认中间用空格隔开。
注:在Python2.6+中导入future模块中的print_fuction才能将print当做函数使用。
编码
Python2默认编码ascii,Python3默认编码UTF-8,因此使用Python3不需要文件顶部写‘# coding=utf-8’。
字符串
Python2中字符串有两个类型:unicode和str,前者表示文本字符串,后者表示字节序列,两者没有明显的界限,开发者也感觉很混乱。
Python3中做了严格的区分,str表示字符串,byte表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列。
python编码解码问题.png
补充:encode()和decode()
decode 解码,encode 编码:字符串在Python内部的表示是unicode编码,在做编码转换时,通常需要以unicode作为中间编码, 即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
实例:s='中文' 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用 decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。
True和False
True和False在Python2中是两个全局变量,数值上对应1和0,既然是变量就可以被赋值,但这样容易造成混乱;故在Python3中 True和False变为两个关键字,永远指向两个固定对象,不允许被重新赋值。
迭代器
Python2中很多返回列表对象的内置函数和方法在Python3中都改成了返回类似于迭代器的对象,迭代器的惰性求值特性使得操作大数据更加有效率。
补充:惰性求值不要求加载好整个迭代过程中所有的元素。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁,大大节约内存。
字典对象dict.keys()、dict.values()方法都不再返回列表,而是生成一个类似迭代器的“view”对象返回。高阶函数map、filter、zip返回也都从列表变成了对象。Python2的迭代器必须实现next方法,二Python3改成了next。
nonlocal
在Python2中可以在函数中使用global声明变量为全局变量,但是给一个变量声明为非局部变量是无法实现的。在Python3,新增了关键字nonlocal,使得定义非jubu变量成为了可能。
1/2在Python2中结果是0,Python3中是0.5
其实也就是Python2中 / 的作用就是地板除,而在Python3中用 // 作为地板除。
模块改名
一些相关的模块放进同一个包里面(如httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib放进了http里面,urllib , urllib2, urlparse, robotparse放进了urllib里面),SocketServer改成了socketserver,Queue改成queue等。
一些新语法
print/exec等成为了函数,格式化字符串变量,类型标注,添加了nonlocal、yield from、async/await、yield for关键词和annotations、context、traceback、qualname等dunder方法。
网友评论