我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python2 和 Python3 的

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python2 和 Python3 的

前言

最近 Python 之父 Guido van Rossum(龟爷)终于在 Python 官方邮件组落实了 Python 2.7 的终焉之日(EOL)。
说的是 Python 2.7 的 EOL 日期最终确定为 2020 年 1 月 1 日,之后不会有任何更新,包括源码的安全补丁。
所以兼容Python3已经可以说非常必要了,但有些常用的库还没有升级到Python3,所以我们看下如何写出兼容2和3的代码。
Python 2 or 3 ?

Python 3 被钦定为 Python 的未来,于 2008 年末发布,是目前正在开发的版本。旨在解决和修正 Python 2 遗留的设计缺陷、清理代码库冗余、追求有且仅有一种最佳实践方式来执行任务等问题。

起初,由于 Python 3 不能向后兼容的事实,导致了用户采用缓慢,对初学者不友好等问题。但在 Python 社区的努力和决绝态度下,截至龟爷发出邮件之前,已经有了 21903 个 Packages 可以支持 Python 3.5,其中包括了绝大多数最受欢迎的封装库,与此同时也有越来越多的封装库(e.g. Django、Numpy)表示其新版本将不再支持 Python 2。

Python 2.7 于 3.0 之后的 2010 年 7 月 3 日发布,计划作为 2.x 的最后一个版本。Python 2.7 的历史任务在于通过提供 2 和 3 之间的兼容性措施,使 Python 2.x 的用户更容易将代码移植到 Python 3.x 上。那么如果你希望自己的代码能够兼容两个不同的版本,首先你起码要让代码能够正常的运行在 Python 2.7 上。

注:下文使用 P2 表示 Python 2.7;使用 P3 表示 Python 3.x。
不同与兼容

future 模块是我们首先需要了解的,该模块最主要的作用是支持在 P2 中导入那些在 P3 才生效的模块和函数。是一个非常优秀的兼容性工具库,在下文中给出的许多 兼容技巧 实例都依赖于它。

特性 在此版本可选 在此版本内置 效果
nested_scopes 2.1.0b1 2.2 PEP 227:静态嵌套作用域
generators 2.2.0a1 2.3 PEP 255:简单生成器
division 2.2.0a2 3.0 PEP 238:除法操作符改动
absolute_import 2.5.0a1 3.0 PEP 328:Imports 多行导入与绝对相对路径
with_statement 2.5.0a1 2.6 PEP 343:with 语句
print_function 2.6.0a2 3.0 PEP 3105:print 语句升级为函数
unicode_literals 2.6.0a2 3.0 PEP 3112:Bytes 类型
(__future__ 功能列表)

统一不等于语法

P2 支持使用 <> 和 != 表示不等于。
P3 仅支持使用 != 表示不等于。
兼容技巧:

统一使用 != 语法

统一整数类型

P2 中整数类型可以细分为短整型 int 和长整型 long。
P3 废除了短整型,并统一使用 int 表示长整型(不再有 L 跟在 repr 后面)。
兼容技巧:

1
2
3
4

k = 9223372036854775808L

k = 9223372036854775808
1
2
3
4
5

bigint = 1L

from future.builtins import int
bigint = int(1)
统一整数除法

P2 的除法 / 符号实际上具有两个功能:
当两个操作数均为整型对象时,进行的是地板除(截除小数部分),返回整型对象;
当两个操作数存在至少一个浮点型对象时,进行的是真除(保留小数部分),返回浮点型对象。
P3 的除法 / 符号仅仅具有真除的功能,而地板除的功能则交由 // 来完成。
兼容技巧:

1
2
3
4
5

assert 2 / 3 == 0

assert 2 // 3 == 0
“True division” (float division):
1
2
3
4

assert 3 / 2 == 1.5

from future import division # (at top of module)
统一缩进语法

P2 可以混合使用 tab 和 space 两种方式来进行缩进(1 个 tab == 8 个 space),但实际上这一特性并非所有 IDE 都能够支持,会因此出现同样的代码无法跨 IDE 运行的情况。
P3 统一使用 tab 作为缩进,如果 tab 和 space 同时存在,就会触发异常:
1
TabError: inconsistent use of tabs and spaces in indentation.
兼容技巧:

统一使用 tab 作为缩进。
统一类定义

P2 同时支持新式类(object)和老式类。
P3 则统一使用新式类,并且只有使用新式类才能应用多重继承。
兼容技巧:

统一使用新式类。

统一字符编码类型

P2 默认使用 ASCII 字符编码,但因为 ASCII 只支持数百个字符,并不能灵活的满足非英文字符,所以 P2 同时也支持 Unicode 这种更强大的字符编码。不过,由于 P2 同时支持两套字符编码,就难免多出了一些标识和转换的麻烦。
而 P3 统一使用 Unicode 字符编码,这节省了开发者的时间,同时也可以轻松地在程序中输入和显示更多种类的字符。
兼容技巧:

在所有的字符串赋值中均使用前缀 u,或引入 unicode_literals 字符模块。
1
2
3
4
5
6
7
8
9
10

s1 = 'PythonTab'
s2 = u'PythonTab中文网'

s1 = u'PythonTab'
s2 = u'PythonTab中文网'

from future import unicode_literals # at top of module
s1 = 'PythonTab'
s2 = 'PythonTab中文网'
统一导入模块的路径搜索方式

P2 导入一个模块时首先会搜索当前目录(cwd),若非,则搜索环境变量路径(sys.path)。这一特性时常给开发者带来困扰,相信大家都曾经碰到过,尤其当自定义模块与系统模块重名的时候;
为了解决这个问题,默认的 P3 仅会搜索环境变量路径,当你需要搜索自定义模块时,你可以在包管理模式下将项目路径加入到环境变量中,然后再使用绝对路径和相对路径(以 . 开头)的方式来导入。
兼容技巧:

统一使用绝对路径进行自定义模块导入。

修正列表推导式的变量作用域泄露

P2 的列表推倒式中的变量会泄露到全局作用域,例如:
1
2
3
4
5
6
7
8
9
10
11
import platform
print('Python', platform.python_version())
i = 1
print('before: I = %s' % i)
print('comprehension: %s' % [i for i in range(5)])
print('after: I = %s' % i)

Python 2.7.6
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 4
P3 则解决了这个问题,列表推倒式中的变量不再泄露到全局作用域。
1
2
3
4
5
6
7
8
9
10
11
import platform
print('Python', platform.python_version())
i = 1
print('before: i =', i)
print('comprehension:', [i for i in range(5)])
print('after: i =', i)

Python 3.4.1
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 1
修正非法比较操作异常

P2 能够对两个数据类型并不相同的对象进行比较。
1
2
3
4
5
import platform
print('Python', platform.python_version())
print("[1, 2] > 'foo' = ", [1, 2] > 'foo')
print("(1, 2) > 'foo' = ", (1, 2) > 'foo')
print("[1, 2] > (1, 2) = ", [1, 2] > (1, 2))

1
2
3
4
Python 2.7.6
[1, 2] > 'foo' = False
(1, 2) > 'foo' = True
[1, 2] > (1, 2) = False
不过,这种看似方便的特性,实际上却是一个定时炸弹,因为你无法唯一的确定到底是什么原因导致的返回值为 False(可能是数据比较、也可能是数据类型不一致)。

P3 则对其进行了修正,如果比较操作数类型不一致时,会触发 TypeError 异常。
兼容技巧:

永远不要比较数据类型不一致的对象。

统一抛出异常语法

P2 同时支持新旧两种异常触发语法:
1
2
raise IOError, "file error" # Old
raise IOError("file error") # New
P3 则统一使用新异常触发语法,否则会触发 SyntaxError 异常:
1
raise IOError("file error")
兼容技巧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

抛出异常

raise ValueError, "dodgy value"

raise ValueError("dodgy value")

使用 traceback 抛出异常

traceback = sys.exc_info()[2]
raise ValueError, "dodgy value", traceback

raise ValueError("dodgy value").with_traceback()

from six import reraise as raise_

traceback = sys.exc_info()[2]
raise_(ValueError, "dodgy value", traceback)

from future.utils import raise_with_traceback
raise_with_traceback(ValueError("dodgy value"))

异常链处理

class DatabaseError(Exception):

pass

class FileDatabase:

def __init__(self, filename):
    try:
        self.file = open(filename)
    except IOError as exc:
        raise DatabaseError('failed to open') from exc

from future.utils import raise_from
class FileDatabase:

def __init__(self, filename):
    try:
        self.file = open(filename)
    except IOError as exc:
        raise_from(DatabaseError('failed to open'), exc)

统一异常处理语法

P2 实现异常处理也能够支持两种语法。
1
2
3
4
5
try:

let_us_cause_a_NameError

except NameError, err:

print err, '--> our error message'

P3 的异常处理则强制要求使用 as 关键字的方式。
1
2
3
4
try:

let_us_cause_a_NameError

except NameError as err:

print(err, '--> our error message')

兼容技巧:

统一使用 as 关键字的异常处理方式。
统一输入函数

P2 支持 raw_input 和 input 两个输入函数,区别在于前者仅能返回 String 类型对象,后者则支持返回数字和字符串两种数据类型对象,并且当输入为表达式时,会隐式调用 eval 函数返回其执行结果。显然的,使用 input 是更加灵活的写法。
所以 P3 统一的使用了 input 函数进行输入处理。

兼容技巧:

统一使用 input 内置函数。
1
2
3
4
5

input("Type something safe please: ")

from future.builtins import input
eval(input("Type something safe please: "))
统一输出函数

P2 中的 print 即是关键字又是内置函数。print 'Hello world!' 为一条语句,print('Hello world!') 则为一次函数调用。
P3 统一使用 print 函数进行输出操作,其原型如下,这一改变让 P3 的输出处理变得更加简洁、强大而优雅,通过实参的传递就能替代 P2 中繁复的代码实现。
1
print(*objects, sep=' ', end='n', file=sys.stdout, flush=False)
兼容技巧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

单行打印单个 String

print 'Hello'

print 'Hello'

单行打印多个 String

print 'Hello', 'Guido'

from future import print_function # (at top of module)
print('Hello', 'Guido')

输出重定向

print >> sys.stderr, 'Hello'

from future import print_function
print('Hello', file=sys.stderr)

换行打印

print 'Hello',

from future import print_function
print('Hello', end='')
统一文件操作函数

P2 支持使用 file 和 open 两个函数来进行文件操作。
P3 则统一使用 open 来进行文件操作。
兼容技巧:

统一使用 open 函数。
1
2
3
4

f = file(pathname)

f = open(pathname)
统一列表迭代器生成函数

P2 支持使用 range 和 xrange 两个函数来生成可迭代对象,区别在于前者返回的是一个列表类型对象,后者返回的是一个类似生成器(惰性求值)的迭代对象,支持无限迭代。所以当你需要生成一个很大的序列时,推荐使用 xrange,因为它不会一上来就索取序列所需的所有内存空间。如果只对序列进行读操作的话,xrange 方法效率显然会更高,但是如果要修改序列的元素,或者往序列增删元素的话,那只能通过 range 方法生成一个 list 对象了。

P3 则统一使用 range 函数来生成可迭代对象,但其实 P3 的 range 更像是 P2 的 xrange。所以在 P3 中如果你想得到一个可以被修改的列表对象,你需要这么做:
1
2
list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
兼容技巧:

统一使用 range 函数
1
2
3
4
5
6
7
8
9
10
11

for i in xrange(10**8):

...

from future.builtins import range
for i in range(10**8):

...

from past.builtins import xrange
for i in xrange(10**8):

...

统一迭代器迭代函数

P2 中支持使用内置函数 next 和迭代器对象的 .next() 实例方法这两种方式来获取迭代器对象的下一个元素。所以,在实现自定义迭代器对象类时,必须实现 .next() 实例方法:
1
2
3
4
5
6
7
8
9
10
11

class Upper(object):

def __init__(self, iterable):
    self._iter = iter(iterable)
def next(self):          # Py2-styface iterator interface
    return self._iter.next().upper()
def __iter__(self):
    return self

itr = Upper('hello')
assert itr.next() == 'H' # Py2-style
assert list(itr) == list('ELLO')
但在 P3 中统一了使用 next 内置函数来获取下一个元素,如果试图调用 .next() 方法则会触发 AttributeError 异常。所以,在 P3 中实现自定义迭代器所要实现的是 next 特殊方法。

兼容技巧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

from future.builtins import object
class Upper(object):

def __init__(self, iterable):
    self._iter = iter(iterable)
def __next__(self):      # Py3-style iterator interface
    return next(self._iter).upper()  # builtin next() function calls
def __iter__(self):
    return self

itr = Upper('hello')
assert next(itr) == 'H' # compatible style
assert list(itr) == list('ELLO')

from future.utils import implements_iterator
@implements_iterator
class Upper(object):

def __init__(self, iterable):
    self._iter = iter(iterable)
def __next__(self):                  # Py3-style iterator interface
    return next(self._iter).upper()  # builtin next() function calls
def __iter__(self):
    return self

itr = Upper('hello')
assert next(itr) == 'H'
assert list(itr) == list('ELLO')

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python2 和 Python3 的

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python2 和 Python3 的

前言最近 Python 之父 Guido van Rossum(龟爷)终于在 Python 官方邮件组落实了 Python 2.7 的终焉之日(EOL)。说的是 Python 2.7 的 EOL 日期最终确定为 2020 年 1 月 1 日
2023-01-31

python2和python3的区别

1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和×××操作上可 以取得很好的优化结果。 Py3.1性能比Py2.5慢15%,还有很大的提升空间。 2
2023-01-31

python3 和 python2的区别

python2python31. Python3对Unicode字符的原生支持。Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str 和unicode,Python3只支持unicode的string。Pyt
2023-01-31

由 Python2 和 Python3

这几天在做一个功能实现的时候,需要把别人用 Python2.6 写好的脚步转成 Python3.4 实现,大部分地方转化都没啥问题,但是在 socket.inet_aton() 转化的过程中出了点问题,花费我不少的精力去解决,先做个记录备忘
2023-01-31

python2.x和python3.x的

Python的3​​.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下相容。许多针对早期Python版本设计的程式都无法
2023-01-31

Python3.x和Python2.x的

1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和×××操作上可 以取得很好的优化结果。 Py3.1性能比Py2.5慢15%,还有很大的提升空间。 2
2023-01-31

Python2 和 Python3 中默

最近在使用 Python3.4 做一些脚本实现,发现对于编码的处理上和 Python2.6 有很大的不同,就此机会把相关知识做个梳理,方便需要的时候查阅。先说下概念和差异:脚本字符编码:就是解释器解释脚本文件时使用的编码格式,可以通过 #
2023-01-31

Python2和Python3的区别,以

学习Python 2还是Python 3?罗振宇在今年的跨年演讲,《时间的朋友》中有个观点,大意是说,人们都有一种受虐情节,有时候希望别人对他粗暴一点。为此,他还举了两个例子,分别是“乔布斯对待消费者的态度”和“和菜头不尊重他的饮食需求”,
2023-01-31

转:python3和Python2的区别

print函数:(Python3中print为一个函数,必须用括号括起来;Python2中print为class)Python 2 的 print 声明已经被 print() 函数取代了,这意味着我们必须包装我们想打印在小括号中的对象。Py
2023-01-31

Python2的input(), raw_input()和Python3的input()

前言现在来探讨一下Python2中的input()、raw_input()函数和Pyhont3中的input()函数:Python2中的raw_input()函数,我们知道input()、raw_input()都是让用户输入的函数:inpu
2023-06-02

python2.x和python3.x共

下载python2.x和python3.x安装在同一目录下不同的文件夹配置环境变量(我是安装在F盘下)1.F:\Python272.F:\Python27\Scripts3.F:\Python334.F:\Python33\Scripts理
2023-01-31

python2和python3的一些差别

未来python3是主流,但还是因为一部分原因,很多项目还在用python2。python3是不兼容python2的,做了一些优化和改进1.字符编码  python2:ascii编码  python3:unicode编码(默认utf-8)2
2023-01-30

Python2和Python3的一些语法

pythonPython2和Python3的一些语法区别1.print2.input3. python3版本相对2版本的部分其他区别问题:为何会出现乱码的情况问题:如何获取编码方式的信息?问题:在控制台上看到的到底是什么?1.print在版
2023-01-31

python3 vs python2

一、print,在python3中已经是函数>>> import sys>>> print("fatal error",file=sys.stderr)fatal error>>> fp=open(r"d:\\a.txt",'w')>>>
2023-01-31

Python2和Python3的区别有哪些

本篇内容主要讲解“Python2和Python3的区别有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python2和Python3的区别有哪些”吧!什么是鸭子类型(duck typing)
2023-06-03

Python3 vs. Python2

导读:哪个版本的 Python 最快?Python 3 真的比 Python 2 慢吗?Python 3 最快的版本是哪个?......当然,这些问题由多种因素决定,其中的主要的因素是什么呢?我们又如何为自己的应用寻找最快的 Python
2023-01-31

Python2和Python3选择哪个好

这篇文章主要介绍“Python2和Python3选择哪个好”,在日常操作中,相信很多人在Python2和Python3选择哪个好问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python2和Python3选择
2023-06-02

Python3和Python2有什么不同

今天就跟大家聊聊有关Python3和Python2有什么不同,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、打印时,py2需要可以不需要加括号,py3 需要python 2 :pr
2023-06-15

python2和python3有什么区别

python2和python3有什么区别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python是什么意思Python是一种跨平台的、具有解释性、编译性、互动性和面向对象
2023-06-14

python2与python3的区别

说明:标注?????是暂时没遇到且看不懂的,做个标记。常见的区别有print,range,open,模块改名,input,整除/,异常 except A as B为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容。过渡版
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录