嗨客网搜索

Python2与Python3区别

Python2与Python3区别教程

Python2 与 Python3 区别主要体现在:

  • print函数
  • input函数
  • 缩进
  • 字符编码
  • 字符串
  • True和False
  • 数据类型
  • 不等运算符
  • 除法运算
  • xrange
  • 迭代器
  • 异常
  • nonlocal
  • 模块改名

print函数

print 在 Python2 中作为语句,在 Python3 中作为函数。

Python2

print 'Hello HaiCoder(www.haicoder.net)'

Python3

print('Hello HaiCoder(www.haicoder.net)')

input函数

从键盘输入一个字符串,Python2 语法:

raw_input( "提示信息" )

从键盘输入一个字符串,Python3 语法:

input( "提示信息" )

在 Python2 中 raw_input() 和 input() 两个函数都存在,其区别为:

  • raw_input() 是将所有输入作为字符串看待,返回字符串类型。
  • input() 只能接收"数字"的输入,在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型(int, float )。

在 Python3 中 raw_input() 和 input() 进行了整合,去除了 raw_input(),仅保留了 input() 函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。

缩进

Python2 的缩进机制中,1 个 tab 键和 8 个 space 是等价的,所以在缩进中可以同时允许tab 和 space 在代码中共存。

Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错。

字符编码

Python2 默认编码为 ascii。

Python3 默认编码 UTF-8,因此使用 Python3 不需要文件顶部写 # coding=utf-8

字符串

Python2 中字符串有两个类型:unicode 和 str,前者表示文本字符串,后者表示字节序列,两者没有明显的界限,开发者也感觉很混乱。

Python3 中做了严格的区分,str 表示字符串,byte 表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列。

True和False

True 和 False 在 Python2 中是两个全局变量,数值上对应 1 和 0,既然是变量就可以被赋值,但这样容易造成混乱.

在 Python3 中 True 和 False 变为两个关键字,永远指向两个固定对象,不允许被重新赋值。

数据类型

Python2 中有 long整型 和 int整型。

Python3 中 long整型 被彻底废弃,统一改写成 int类型 代替。

不等运算符

Python2 中不等于有两种写法 != 和 <>。

Python3 中去掉了 <>, 只有 != 一种写法。

除法运算

在 Python2 中 /除法 如果是两个整数相除,会把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。

在 Python3 中 /除法 不再这么做了,对于整数之间的相除,结果也会是浮点数。

Python2

>>> 1 / 2 0 >>> 1.0 / 2.0 0.5

Python3

>>> 1/2 0.5

xrange

xrange 函数被 Python3 废弃,统一使用 range 函数。

Python3 中 range 的机制也进行修改并提高了大数据集生成效率,说白了就是涵盖了xrange 的功能。

迭代器

很多函数在 Python2 中返回对象都是返回的列表。

在 Python3 版本中都返回了一个“容器”,可以使用迭代器取出,有的也可以直接 list() 强制转换。

比如这些函数:keys()、values()、items(),zip(),map(),filter()。

异常

在 Python3 中处理异常也轻微的改变了,在 Python3 中我们现在使用 as 作为关键词。

捕获异常的语法由 except exc, var 改为 except exc as var

在 Python2 中,所有类型的对象都是可以被直接抛出的,在 Python3 中,只有继承自 BaseException 的对象才可以被抛出。

在 Python2 中,raise 语句使用逗号将抛出对象类型和参数分开,在 Python3 中,取消了这种奇葩的写法,直接调用构造函数抛出对象即可。

在 Python2 中,,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在 Python3 中,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。

nonlocal

在 Python2 中可以在函数中使用 global 声明变量为全局变量,但是给一个变量声明为非局部变量是无法实现的。

在 Python3,新增了关键字 nonlocal,使得定义非局部变量成为了可能。

模块改名

旧的名字 新的名字
_winreg winreg
ConfigParser configparser
copy_reg copyreg
Queue queue
SocketServer socketserver
repr reprlib

StringIO 模块现在被合并到新的 io 模组内。 new, md5, gopherlib 等模块被删除。

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib 被合并到 http 包内。

取消了 exec 语句,只剩下 exec() 函数。

嗨客网顶部