python2.和Python3.x的区别(超详细的细节)
- 1.print语句为Python2独有,在Python3中更改为print()函数,当然,作为Python的过渡版本,2.6,和2.7也支持print()这样的函数写法。
2.编码问题的大改变:
Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。
编码就是将字符串转换成字节码,而解码就是将字节码转换成字符串,在Python2中,认为str是编码后的字节序列,Unicode是编码前的文本字符,Python3中,str是编码过的Unicode文本字符,也就是已经有自动解码,只有bytes,是编码前的字节序列,并且,在Python3里,str只有encode()方法,bytes只有decode()方法。Python2中是可以混用两种方法的,因此,十分混乱。(我想,我这么说应该是没问题的)。
中国='china'
print(中国)
#这样的写法在python3中是允许的,但python2中会报错。
#因为,Python3源码默认使用utf-8编码
- s3.除法问题的大改变:
首先来说/除法:
在python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。
在python 3.x中/除法不再这么做了,对于整数之间的相除,结果也会是浮点数。
对于//除法,这种除法叫做floor除法,会对除法的结果自动进行一个floor操作,在python 2.x和python 3.x中是一致的。
s=1/20.00
print(type(s))
x=1/20
print(type(x))
#结果都为float浮点数类型,但在Python2中,x的类型应该是整数int类型
#整除//在2.x和3.x是一致的,并无改变,只是3.x中的math内置函数内提供了trunc函数来对
#取余操作做了加强
- 4.异常的细微改变:
在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。
捕获异常的语法由 except exc, var 改为 except exc as var。
使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。
1. 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
2. 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。
- 5.range()函数的改变 python2中是两个函数,一个是xrange(),此函数创建一个可迭代的对象,range()函数创建一个list数组,在Python3中两者合并,保留range()
- 6.八进制的字面的表示改变:
- 7.不定式运算的改变,python2中不定式运算符!+和<>两个都可以,Python3中规范为只允许!=
- 8.一部分的内置模块的更名
_winreg winreg ConfigParser configparser copy_reg copyreg Queue queue SocketServer socketserver repr reprlib - 9.数据类型定义和使用的细微改动 (1):Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long (2)新增了bytes类型,对应于2.X版本的八位串 (3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代了 。
- 10.input()函数的细微改变:Python2中input()函数,输入内容解析为整数类型,如果想要输入内容为str字符串,需要raw_input()函数,Python3中去除raw_input函数,只保留input()函数,并且输入内容一律解析为字符串str。