Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python2和Python3的区别简单总结

Python2和Python3的区别简单总结

作者头像
earthchen
发布于 2020-09-21 10:11:31
发布于 2020-09-21 10:11:31
54100
代码可运行
举报
文章被收录于专栏:earthchen的专栏earthchen的专栏
运行总次数:0
代码可运行

Python是一种新的计算机语言,也是最近两年才开始大火的一种语言,它够优雅,写起来可以随心所欲,不用担心没有定义,没有声明这些其他计算机语言都需要考虑的问题,单自从更新Python3.x版本之后,很多人开始头疼,因为Python3很多地方并不兼容Python2,有人夸张的说Python3是一门新的语言,我觉得没有那么夸张,本文就剧一下我遇到的和一些知道的区别吧

开始

print函数

print 语法的变化可能是最广为人知的了,但是仍值得一提的是: Python 2 的 print 声明已经被 print() 函数取代了,这意味着我们必须包装我们想打印在小括号中的对象。 Python 2 不具有额外的小括号问题。但对比一下,如果我们按照 Python 2 的方式不使用小括号调用 print 函数,Python 3 将抛出一个语法异常(SyntaxError)。

Python2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print 'Python', python_version()
print 'Hello, World!'
print('Hello, World!')
print "text", ; print 'print more text on the same line'

结果:

  • Python 2.7.6
  • Hello, World!
  • Hello, World!
  • text print more text on the same line
Python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('Python', python_version())
print('Hello, World!')
print("some text,", end="") 
print(' print more text on the same line')

结果:

  • Python 3.5.1
  • Hello, World!
  • some text, print more text on the same line
  • print more text on the same line

整除

python3的版本变化中,整数计算可以说是很大的并且可能在移植过程中造成很大危险,比如:

  • 你在 Python 2 上执行 Python 3 的代码。因为这个整除的变化表现在它会被忽视(即它不会抛出语法异常)。
python2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print '3 / 2 =', 3 / 2
print '3 // 2 =', 3 // 2
print '3 / 2.0 =', 3 / 2.0
print '3 // 2.0 =', 3 // 2.0

结果:

  • 3 / 2 = 1
  • 3 // 2 = 1
  • 3 / 2.0 = 1.5
  • 3 // 2.0 = 1.0
python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('3 / 2 =', 3 / 2)
print('3 // 2 =', 3 // 2)
print('3 / 2.0 =', 3 / 2.0)
print('3 // 2.0 =', 3 // 2.0)

结果:

  • 3 / 2 = 1.5
  • 3 // 2 = 1
  • 3 / 2.0 = 1.5
  • 3 // 2.0 = 1.0

Unicode

Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。 现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。 由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的:

python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
中国 = 'china' 
print(中国)

结果:

  • china
python2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str = "我爱北京天安门"
print 'str'

结果:

  • ‘\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8’

xrange模块

在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。 这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。 由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。 在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import timeit
n = 10000
def test_range(n):
    return for i in range(n):
        pass
def test_xrange(n):
    for i in xrange(n):
        pass
python2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print 'Python', python_version()
print '\ntiming range()'
%timeit test_range(n)
print '\n\ntiming xrange()'
%timeit test_xrange(n)

结果:

  • Python 2.7.6
  • timing range()
  • 1000 loops, best of 3: 433 µs per loop
  • timing xrange()
  • 1000 loops, best of 3: 350 µs per loop
python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('Python', python_version())
print('\ntiming range()')
%timeit test_range(n)

结果:

  • Python 3.5.1
  • timing range()
  • 1000 loops, best of 3: 520 µs per loop

不等运算符

  • Python 2.x中不等于有两种写法 != 和 <>
  • Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯

数据类型

  • Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long
  • 新增了bytes类型,对应于2.X版本的八位串
  • dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。 注:
    • 上述代码在django1.7Python2.7中编译成功运行,其他环境请自行测试
    • 上述文字皆为个人看法,如有错误或建议请及时联系我

异常

在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。 捕获异常的语法由 except exc, var 改为 except exc as var。 使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。

  • 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
  • 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。 在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。python2 print 'Python', python_version() try: let_us_cause_a_NameError except NameError, err: print err, '--> our error message'

结果:

  • Python 2.7.6
  • name ‘let_us_cause_a_NameError’ is not defined —> our error message
python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('Python', python_version())
try:
    let_us_cause_a_NameError
except NameError as err:
    print(err, '--> our error message')

结果:

  • Python 3.5.1
  • name ‘let_us_cause_a_NameError’ is not defined —> our error message

通过input()解析用户的输入

幸运的是,在 Python 3 中已经解决了把用户的输入存储为一个 str 对象的问题。为了避免在 Python 2 中的读取非字符串类型的危险行为,我们不得不使用 raw_input() 代替。

返回可迭代对象,而不是列表

如果在 xrange 章节看到的,现在在 Python 3 中一些方法和函数返回迭代对象 — 代替 Python 2 中的列表 因为我们通常那些遍历只有一次,我认为这个改变对节约内存很有意义。尽管如此,它也是可能的,相对于生成器 —- 如需要遍历多次。它是不那么高效的。 而对于那些情况下,我们真正需要的是列表对象,我们可以通过 list() 函数简单的把迭代对象转换成一个列表。

python2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print 'Python', python_version() 
print range(3) 
print type(range(3))

结果:

  • Python 2.7.6
  • [0, 1, 2]
  • < type ‘list’>
python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('Python', python_version())
print(range(3))
print(type(range(3)))
print(list(range(3)))

结果:

  • Python 3.5.1
  • range(0, 3)
  • < class ‘range’>
  • [0, 1, 2]
  • 在 Python 3 中一些经常使用到的不再返回列表的函数和方法:
  • zip()
  • map()
  • filter()
  • dictionary’s .keys() method
  • dictionary’s .values() method
  • dictionary’s .items() method

For循环变量和全局命名空间泄漏

好消息:在 Python 3.x 中 for 循环变量不会再导致命名空间泄漏。 在 Python 3.x 中做了一个改变,在 What’s New In Python 3.0 中有如下描述: “列表推导不再支持 [… for var in item1, item2, …] 这样的语法。使用 [… for var in (item1, item2, …)] 代替。也需要提醒的是列表推导有不同的语义: 他们关闭了在 list() 构造器中的生成器表达式的语法糖, 并且特别是循环控制变量不再泄漏进周围的作用范围域.”  

python2
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print 'Python', python_version()
i = 1
print 'before: i =', i
print 'comprehension: ', [i for i in range(5)]
print 'after: i =', i

结果:

  • Python 2.7.6
  • before: i = 1
  • comprehension: [0, 1, 2, 3, 4]
  • after: i = 4
python3
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('Python', python_version())
i = 1
print('before: i =', i)
print('comprehension:', [i for i in range(5)])
print('after: i =', i)

结果:

  • Python 3.5.1
  • before: i = 1
  • comprehension: [0, 1, 2, 3, 4]
  • after: i = 1

注:

  • 上述代码在python3.5Python2.7中编译成功运行,其他环境请自行测试
  • 上述文字皆为个人看法,如有错误或建议请及时联系我
  • 更多却别请读者自行查看官方文档
  • 个人推荐还是用python3,新版本的出现总有他的意义,但是我遇到一些项目要求Python2也就只能Python2了,目前来说,Python2的教程和第三方库函数还是比Python3多,再过几年,我相信一定会是Python3是主流
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-08-15,,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python2.x与3​​.x版本区别
文 | 豌豆 来源 | 菜鸟教程 Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。 为了不带入过多的累赘,Python
小小科
2018/05/04
9470
Python2.x与3​​.x版本区别
Python2和Python3的区别,以及为什么选Python3的原因
任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~
全栈程序员站长
2022/06/27
1.1K0
Python2和Python3的区别,以及为什么选Python3的原因
Python 2.7.x 与 Python 3.x 的不同点1 __future__模块2 print函数3 整除4 Unicode5 xrange模块6 Python3中的range对象的__con
本文翻译自:《Key differences between Python 2.7.x and Python 3.x》 许多 Python 初学者想知道他们应该从 Python 的哪个版本开始学习。对于这个问题我的答案是 “你学习你喜欢的教程的版本,然后检查他们之间的不同。” 但如果你并未了解过两个版本之间的差异,个人推荐使用 Python 2.7.x 版本,毕竟大部分教材等资料还是用Python 2.7.x来写的。 但是如果你开始一个新项目,并且有选择权?我想说的是目前没有对错,只要你计划使用的库 Pyt
SeanCheney
2018/04/24
2.7K0
Python 2.7.x 与 Python 3.x 的不同点1 __future__模块2 print函数3 整除4 Unicode5 xrange模块6 Python3中的range对象的__con
详解Python 2.x 与 Python 3.x 的区别
如果你是刚接触 Python 的初学者,那你可能是直接学习 Python 3.x 版本。对于 Python 2.x 的版本是不会有所接触。官方也宣布在 2020 停止对 Python 2.x 的维护。我也建议初学者直接去学 Python 3.x 版本。但我们还是要去了解下 Python 3.x 与 Python 2.x 之间都有哪些改变,通过对比能让你对 Python 有更加深刻的理解。并且在很多面试过程中,面试官都会问:Python 2.x 与 Python 3.x 的区别。今天就给大家列举 Python 3.0 主要改变的几个方面。
用户2966292
2018/08/30
1.3K0
Python3与Python2的具体区别
有赞的数据库管控平台是基于Python 2(py2)开发的,目前已经升级到python3(py3) 版本,主程序基于python 3.6.x。写本文是梳理一下 两个版本之间的语法,函数等差异。
用户1278550
2020/08/04
9090
python3.x的改进
Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3
py3study
2020/01/03
7320
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 ?
py3study
2020/01/02
8430
python2.x和python3.x的
Python的3​​.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。
py3study
2020/01/03
1.1K0
python第七十课——python2与python3的一些区别
1.性能: py3.x起始比py2.x效率低,但是py3.x有极大的优化空间,效率正在追赶 2.编码: py3.x原码文件默认使用utf-8编码,使得变量名更为广阔
hankleo
2020/09/16
3720
Python2和Python的区别那个版
想学习Python的人都会有一个困惑,那就是Python目前有两个版本Python2和Python3,Python2与Python3有何区别,两个版本该学习哪个呢?
py3study
2020/01/09
8600
【Python面试】谈谈对 Python3 和 Python2 的区别?​
小猿会从最基础的面试题开始,每天一题。如果参考答案不够好,或者有错误的话,麻烦大家可以在留言区给出自己的意见和讨论,大家是要一起学习的 。
程序员小猿
2021/01/19
4490
13条Python2.x和3.x的区别?
从今天开始,小明将和你一起过一下,那些在面试「Python开发」岗位时面试官喜欢问的问题。内容基础,但是你不一定会噢。
py3study
2020/01/10
6040
Python2升级Python3改造手法
Python 3.x做了部分修改,但大体语法与Python 2.x相似,Python 3.x的使用者可以轻松阅读Python 2.x编写的代码。
公众号guangcity
2022/12/02
4670
简述Python2与Python3的区别
超出上述范围,python自动转化为long(长整型) 注:long(长整型)数字末尾有一个L
py3study
2020/01/16
6140
python3 和 python2的区别
Python2中使用 ASCII 码作为默认编码方式导致string有两种类型str 和unicode,Python3只
py3study
2020/01/08
1.7K0
python3 和 python2的区别
python2与python3的区别
说明:标注?????是暂时没遇到且看不懂的,做个标记。常见的区别有print,range,open,模块改名,input,整除/,异常 except A as B
py3study
2020/01/09
1.2K0
Python3入门学习一.md
在Linux中安装Python3命令,在官网下载 https://www.python.org/downloads/source/
全栈工程师修炼指南
2020/10/23
1.4K0
Python3入门学习一.md
写py2、py3兼容的代码
写py2、py3兼容的代码 用到一段时间python,之前也重点复习了一次python3。但工作中运行环境是python2.7,于是要求写出py2、py3都兼容的代码。下面将涉及到的几点技巧列举出来以备忘。 print函数 py3中print语句没有了,取而代之的是print()函数。 Python 2.6与Python 2.7部分地支持这种形式的print语法。因此保险起见,新写的代码都使用print函数。 from __future__ import print_function print("fish
jeremyxu
2018/05/10
2.5K0
python3菜鸟教程笔记
* xrange函数合并到了range中,2到5的序列可以直接用range(2, 5)表示
全栈程序员站长
2022/09/08
6800
Python3.x和Python2.x的区别
http://www.cnblogs.com/codingmylife/archive/2010/06/06/1752807.html
bear_fish
2018/09/20
9450
相关推荐
Python2.x与3​​.x版本区别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档