python2与python3的区别

左心房为你撑大大i 提交于 2020-01-19 02:22:22

1.print

在Python 2里,print是一个语句。无论你想输出什么,只要将它们放在print关键字后边就可以。在Python 3里,print()是一个函数。就像其他的函数一样,print()需要你将想要输出的东西作为参数传给它。
样例:

# python2
print 1, 2 + 3
# python3
print(1, 2 + 3)

2.range 与 xrange
Python 2中有 range 和 xrange 两个方法。其区别在于,range返回一个list,在被调用的时候即返回整个序列;
xrange返回一个迭代器iterator,在每次循环中生成序列的下一个数字。Python 3中不再支持 xrange 方法,Python 3中的 range 方法就相当于 Python 2中的 xrange 方法。
样例:

# python2
print range(6)
# [0, 1, 2, 3, 4, 5]

# python3
print(range(6))
#range(0, 6)

#  python2的range(6)返回的是列表,python3返回的是迭代器类型(可以用list进行强转列表)

3.运算符
①python2的<>相当于!=,python3去除了<>,全部改用!=
②python2的/是整除,python3的/返回的是float,python3的整除用//

# python2
print 9 / 2 * 2
# python3
print(9 / 2 * 2)

4.try except 语句的变化
Python 2中捕获异常一般用下面的语法

# 第一种写法
try:
    1/0
except ZeroDivisionError, e:
    print str(e)
# 第二种写法
try:
    1/0
except ZeroDivisionError as e:
    print(str(e))

Python 3中不再支持第一种语法,必须使用as关键字。
5.推导式的变量作用域
在Python2中,列表推导式中的索引变量的是可以泄露到其封闭作用域中的。而Python3中则不可以。

i = 0
x = [i for i in range(6)]
print(i)
# python2返回结果
5
# python3返回结果
0

6.dict的has_key()
Python 3中的字典不再支持has_key方法,统一使用in

dict_test = {'a': 1, 'b': 2}
print(dict_test.has_key('a'))
print('a' in dict_test)

7.dict的iterkeys()
Python 3里不再支持iterkeys()了。如果必要,使用iter()将keys()的返回值转换成为一个迭代器。

# python2
dict_test = {'a': 1, 'b': 2}
print dict_test.iterkeys()

# python3
dict_test = {'a': 1, 'b': 2}
print(iter(dict_test.keys()))

8.字典的keys / values / items方法
python2:返回列表,通过索引可以取值
python3:返回迭代器,只能通过循环取值,不能通过索引取值
9.数据类型/字符编码
①Python2中有long(长整形),Python3.x去除了long类型,现在只有一种整型——int
②py2的默认编码是ASCII码,py3的默认编码是utf-8。
③python2中的str对应python3中的bytes,unicode对应str。
④py2中字符可以直接写到文件中,unicode需要编码才可以写入文件,读文件需要解码;py3 打开文件,指定编码格式自动编码,写入文件不需要编码和解码。
⑤python2x :unicode 默认2个字节表示一个字符;python3x:unicode 默认是4个字节表示一个字符。
⑥新增了bytes类型,定义一个bytes字面量的方法如下:

b = b'china'
print(type(b))
# <type 'bytes'>
# 注意:str 对象和 bytes 对象可以使用 .encode() (str -> bytes) 或 .decode() (bytes -> str)方法相互转化。 

⑦字符串的改变支持,最核心的介绍:

py2 py3 表现 转换 作用
str byte 字节 encode 存储、传输
Unicode str 字符 decode 展示

10.操作符比较
python2.x支持字符串和int的比较语法,并不会报错;python3.x不支持类型不匹配的比较。
python2.x的比较理念:当你定义两个不兼容的类型时,它们都是按照其类型名称的字母顺序排序的。

# python2
print(1<'1')
# True

# python3
print(1<'1')
#     print(1<'1')
# TypeError: '<' not supported between instances of 'int' and 'str'

11.文件读写
①python2的str有encode和decode的两种方法;但是python3中str只有encode,只有str进行encode编码之后,才能进行decode解码。
②python2的open函数不能指定打开编码方式,python3可以指定打开编码方式。

# python2
f = open(filepath , 'r')
print f.read()

# python3
f = open(filepath , 'r' , encoding='utf-8')
print(f.read())

③python2可以使用file方法打开文件;python3废弃了file方法

f = file("get_system_config.sh", 'r')
print f.read()
f = file("get_system_config.sh", 'r')
f.read()

#     f = file("get_system_config.sh", 'r')
# NameError: name 'file' is not defined

12.继承object类
在python3中这俩的写法是一样,因为所有的类默认都会继承object类,全部都是新式类。

class Foo:
    pass
class Foo(object):
    pass
# 如果在python2中这样定义,则称其为:经典类
class Foo:
    pass
# 如果在python2中这样定义,则称其为:新式类
class Foo(object):
    pass

# 新式类
# 继承object
# 支持super
# 多继承 广度优先C3算法
# mro方法

# 经典类
# py2中不继承object
# 没有super语法
# 多继承 深度优先
# 没有mro方法

12.元组参数解包变化
样例:
python2:

def test(a, (b, c)):
    print a, b, c

test(1,(2,3))

python3去除元组参数解包

def test(a, (b, c)):
    print(a, b, c)

test(1,(2,3))
#     def test(a, (b, c)):
#                 ^
# SyntaxError: invalid syntax

13.异常
①所有异常都从 BaseException继承,并删除了StardardError
②去除了异常类的序列行为和.message属性
③用 raise Exception(args)代替 raise Exception, args语法
14.super()
Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx
Python2.x 实例:

# -*- coding: UTF-8 -*-
 
class A(object):   # Python2.x 记得继承 object
    def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super(B, self).add(x)
b = B()
b.add(2)  # 3

Python3.x 实例:

class A:
     def add(self, x):
         y = x+1
         print(y)
class B(A):
    def add(self, x):
        super().add(x)
b = B()
b.add(2)  # 3

15.nonlocal用法(新增)
官方解释:
①非局部声明变量指代的已有标识符是最近外面函数的已声明变量,但是不包括全局变量。这个是很重要的,因为绑定的默认行为是首先搜索本地命名空间。
②nonlocal只能在封装函数中使用,nonlocal声明的变量只对局部起作用,离开封装函数,那么该变量就无效。
③非局部声明不像全局声明,我们必须在封装函数前面事先声明该变量;
④非局部声明不能与局部范围的声明冲突。

count = 1

def a():
    count = 'a函数里面'    #如果不事先声明,那么函数b中的nonlocal就会报错
    def b():
        nonlocal count
        print(count)
        count = 2
    b()
    print(count)

if __name__ == '__main__':
    a()
    print(count)

运行结果:

a函数里面
2
1

16.raw_input()和input()
在python2.x中raw_input()和input( ),两个函数都存在,其中区别为:
raw_input()—将所有输入作为字符串看待,返回字符串类型
input()—只能接收"数字"的输入,在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型(int, float )
在python3.x中raw_input()和input( )进行了整合,去除了raw_input(),仅保留了input()函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。
17.格式化运算符
不推荐使用百分比(%)字符串格式化运算符,使用 .format() 函数或连接。
18.格式缩进(IDLE)
Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个 tab 和 8 个 space 是等价的,所以在缩进中可以同时允许 tab 和 space 在代码中共存。这种等价机制会导致部分 IDE 使用存在问题。
Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错:TabError:inconsistent use of tabs and spaces in indentation.
19.import导入
Python3 采用的是绝对路径的方式进行 import。Python2 中相对路径的 import 会导致标准库导入变得困难(想象一下,同一目录下有 file.py,如何同时导入这个文件和标准库 file)。Python3 中这一点将被修改,如果还需要导入同一目录的文件必须使用绝对路径。
20.init文件
python2x新建的包如果没有init文件 则包不能够被调用 直接报错。
python3x新建的包里面的init文件如果你删除该文件 包照样可以被调用
21.模块更改
①httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内;
②Queue改成queue;SocketServer改成socketserver;ConfigParser改成configparser;copy_reg改成copyreg。
③ new, md5, gopherlib等模块被删除。
22.其它的差异

  1. exec 语句被 python3 废弃,统一使用 exec 函数
  2. execfile 语句被 Python3 废弃,推荐使用 exec(open("./filename").read())
  3. Python3 中这些方法再不再返回 list 对象:dictionary 关联的 keys()、values()、items(),zip(),map(),filter(),但是可以通过 list 强行转换。
  4. 迭代器 iterator 的 next()函数被 Python3 废弃,统一使用 next(iterator)
  5. apply 函数被 Python3 废弃
  6. python2中的True 和 False 不是关键字,值可以被更改,但Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。
  7. 增加了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便,具体用法自己查找,这里就不讲解了。
  8. lambda表达式
    在python2中,对lambda语句支持以下两种多参数的形式:
lambda x, y : x + y
lambda (x, y) : x + y 
f = lambda x, y: x + y
print f(1, 2)
f2 = lambda (x,y):x*y
print f2((1,2))

在python3中,对lambda语句只支持一种多参数的形式:

lambda x, y : x + y
  1. quote、HTMLParser导入发生改变
# python2 
from urllib import quote
from HTMLParser import HTMLParser 
# python3 
from urllib.parse import quote
from html.parser import HTMLParser
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!