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.其它的差异
- exec 语句被 python3 废弃,统一使用 exec 函数
- execfile 语句被 Python3 废弃,推荐使用 exec(open("./filename").read())
- Python3 中这些方法再不再返回 list 对象:dictionary 关联的 keys()、values()、items(),zip(),map(),filter(),但是可以通过 list 强行转换。
- 迭代器 iterator 的 next()函数被 Python3 废弃,统一使用 next(iterator)
- apply 函数被 Python3 废弃
- python2中的True 和 False 不是关键字,值可以被更改,但Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。
- 增加了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便,具体用法自己查找,这里就不讲解了。
- 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
- quote、HTMLParser导入发生改变
# python2
from urllib import quote
from HTMLParser import HTMLParser
# python3
from urllib.parse import quote
from html.parser import HTMLParser
来源:CSDN
作者:黑暗的落寞
链接:https://blog.csdn.net/qq_42631707/article/details/103694752