python2.x和3.x的区别

文:铁乐与猫
2018.3.16新增博文,为方便以后总结Python2.x与3.x的不同版本之间的区别,随时更新。

python原本的宗旨是崇尚优美、清晰、简单。但python刚推出的时候,自身除了创始者龟叔等谷歌少数人外,全世界的phthon大牛还很少,所以python社区来说,有很多各个语言的大牛去为python提供源码,而这些大牛提供的源码比较倾向于各自善长领域的语言的语法规范。例如有善长C的,有善长java的,写出来的源码都带有C或java的印记。这就导致一个状况:python2.x版本的源码相对混乱,重复代码较多显得繁擁。
有鉴于此,python的创始人龟叔在2008年的时候就“愤怒”了,这有别于python的初衷阿。

【关于龟叔】
python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆(中文名字:龟叔)为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。
(龟叔:2005年加入谷歌至2012年,2013年加入Dropbox直到现在,依然掌握着Python发展的核心方向,被称为仁慈的独裁者)。

一个很有趣的现象,python版本在2008年的时候出现了转折点:2.6版本之后“愤怒”的龟叔“规范”了python后直接跳跃到python3.0,最初他宣布要使用2.6版本的公司两个月后直接停止使用过渡到使用3.0版本。可这时间也太短了,遭到了全世界的抗议,所以后来才有了2.7版本的python做为过渡,提供更新直至到2020年。
原话如下:
Python 2.7 - July 3, 2010 In November 2014, it was announced that Python 2.7 would be supported until 2020, and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible

大至意思就是龟叔在2014年11月,宣布Python 2.7的支持直到2020年为止,重申不会再有2.8版本的发布,希望用户尽快迁移到Python 3.4+版本。

这也就是为何python2.7与python3.x共存发行的独特之处,也是为何python2.7与python3.x的语法规范等有50+以上的不同之处的原因所在。

让我们来随着学习python的脚步来逐一记录下2.x和3.x版本的各个不同之处,以便总结和应对,不过2020年快到了,也许很快就不用再记着2.7的不同了吧。

区别

01不忘初衷

python2.x:源码相对混乱,重复代码较多,显得繁冗;
python3.x:源码规范,优美清晰简单;

02 print

python2.x:print被视为一条语句;
python3.x:print作为函数存在,print()接收字符串作为参数。


如上图,很明显区别了。
在py2中,print语句后面接的是一个元组对象,而在py3中,print函数可以接收多个位置参数。

03 input

python2.x: 使用raw_input();Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入。
python3.x:使用input()函数接受一个标准输入数据,返回为 string 类型。。

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

注意:input() 和 raw_input() 这两个函数均能接收 字符串 ,但 raw_input() 直接读取控制台的输入(任何类型的输入它都可以接收)。而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它括起来,否则它会引发一个 SyntaxError 。
除非对 input() 有特别需要,否则一般情况下我们都是推荐使用 raw_input() 来与用户交互。

04 编码

Python2.x: 默认编码是 asscii;
Python 3.x: 默认UTF-8 , 因此不再需要在文件顶部写 # coding=utf-8 了。

05 字符串

Python2.x: 字符串有两个类型,一个是 unicode,一个是 str,前者表示文本字符串,后者表示字节序列,不过两者并没有明显的界限,开发者也感觉很混乱;
Python3.x: 两者做了严格区分,用 str 表示字符串,byte 表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列,从源头上阻止了编码错误的问题。

补充:bytes 类型提供的操作和 str 一样,支持分片、索引、基本数值运算等操作。但是 str 与 bytes 类型的数据不能执行 + 操作,尽管在py2中是可行的。

python2 与 python3 字节与字符的对应关系:

python2 python3 表现 转换 作用
str bytes 字节 encode 存储
unicode str 字符 decode 显示

06 True和False

Python2.x: True 和 False 在 Python2 中是两个全局变量(名字),在数值上分别对应 1 和 0, 作为变量,可以指向其它对象,产生了混乱,也违背了设计初衷。
Python3.x: Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。

07 比较运算符

Python2.x: 支持<>作为!=的同义词;
Python3.x: 只支持!=,不再支持<>。

08 字典类方法 HAS_KEY()

Python2.x: 字典对象has_key()方法测试字典是否包含指定的键。
Python3.x:python3不再支持这个方法,使用in就可以了。

09 xrange()

Python2.x: 有两种方法获得一定范围内的数字:range()返回一个列表,xrange()返回一个迭代器。
Python3.x:range()也可以返回迭代器,xrange()不再存在。

10 intern(字符串驻留,数据池)机制

Python2.x:支持intern()
Python3.x:不支持intern()

注:
python默认只会对由字符
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"
构成字符串进行intern。

(未完待续)

python2.x和3.x的区别(不定时更新)的更多相关文章

  1. Python2和Python3的一些语法区别

    Python2和Python3的一些语法区别 python 1.print 在版本2的使用方法是: print 'this is version 2 也可以是 print('this is versi ...

  2. Python2与Python3字符编码的区别

    目录 字符编码应用之Python(掌握) 执行Python程序的三个阶段 Python2与Python3字符串类型的区别(了解) Python2 str类型 Unicode类型 Python3 字符编 ...

  3. python3中的 zip()函数 和python2中的 zip()函数 的区别

    python3中的 zip()函数 和python2中的 zip()函数 的区别: 描述: zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象. ...

  4. Python2.x与3.x版本区别

    Python2.x与3.x版本区别 1.print 函数 print语句没有了,取而代之的是print()函数. Python 2.6与Python 2.7部分地支持这种形式的print语法.在Pyt ...

  5. python大法好——Python2.x与3​​.x版本区别

    python大法好——Python2.x与3​​.x版本区别 Python的3​​.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级. 为了不带 ...

  6. 【python系列】python2.x和python3.x的区别

    刚接触python使用的是python2.x的书籍,但是发现python3.x和python2.x有不小的区别,以下做一些记录 性能 Py3.0运行 pystone benchmark的速度比Py2. ...

  7. python2和python3中range的区别

    参考自 python2和python3中的range区别 - CSDN博客 http://blog.csdn.net/xiexingshishu/article/details/48581379 py ...

  8. day008 字符编码之 字符编码 、Python2和Python3字符编码的区别

    计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...

  9. Python2和3字符编码的区别

    Python2和3字符编码的区别 一.字符编码应用之Python 1.1 执行Python程序的三个阶段 Python test.py(我再强调一遍,执行test.py的第一步,一定是先将文件内容从硬 ...

随机推荐

  1. Nodejs学习笔记(二)—事件模块

    一.简介及资料  http://nodejs.org/api/events.html  http://www.infoq.com/cn/articles/tyq-nodejs-event events ...

  2. Servlet多文件上传

    各位大侠可能会对263电子邮箱中的"上传附件"功能有印象,就是:在浏览 器中点击"浏览",弹出一个对话框,选中文件后,单击"确定",文件就被 ...

  3. mysql/mariadb 数据库配置

    1.  启动mariadb systemctl start mariadb 2. 设置开机启动mariadb systemctl enable mariadb 一.修改用户密码,以root为例 1. ...

  4. C#语法之Linq查询基础一

    Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决.对于Linq to object.Linq to xml.Linq to sql.Linq to Entity(EF)都 ...

  5. Node.js处理I/O数据之Buffer模块缓冲数据

    一.前传 在之前做web时也经常用到js对象转json和json转js对象.既然是Node.js处理I/O数据,也把这个记下来. Json转Js对象:JSON.parse(jsonstr); //可以 ...

  6. SQLServer数据库循环表操作每一条数据(游标的使用)

    DECLARE @FunctionCode VARCHAR(20)--声明游标变量DECLARE curfuntioncode CURSOR FOR SELECT FunctionalityCode ...

  7. ssh连接工具中文乱码问题

    在终端运行: export LC_ALL=zh_CN.GB2312;export LANG=zh_CN.GB2312

  8. SQL 修改表字段失败 解决方法

    OK  大功告成 !!!

  9. MVC 之var与dynamic

    如果你用MVC写过程序,那么你应该知道ViewBag这个用于前后台的数据传递工具,那么你是否对ViewBag的用法感到过疑惑呢? ViewBag.Mode1l=new object(); ViewBa ...

  10. Dijkstra Java

    https://leetcode.com/problems/network-delay-time/ /* Java program to find a Pair which has maximum s ...