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. openTSDB(转)

    1.OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is a distributed, scalable Time Series Datab ...

  2. 彻底解决springMVC中文乱码

    一.页面编码 <%@ page contentType="text/html;charset=UTF-8" language="java" %> & ...

  3. H5开发过程中修复的bug记录

    从2016年8月1日开始真正意义上的修复bug,也是自己开发之路的开端,希望在这里记录自己修bug过程中遇到的问题及解决方法,待能够自己开发需求的时候,计划记录开发新需求过程中遇到的问题,并且记录自己 ...

  4. Eclipse编辑JS响应慢,复制粘贴卡顿的解决方案

    我使用的是官网标准版的eclipse4.3 for javaEE, 写JS时卡的简直无法忍受,尝试去掉所有的validate,包括菜单和项目属性中的都没作用. 整个人都急疯了~ 后来在项目根目录.pr ...

  5. Linux内核编程规范与代码风格

    source: https://www.kernel.org/doc/html/latest/process/coding-style.html translated by trav, travmym ...

  6. npm install 后缀

    npm 全局安装与本地安装 npm install express # 本地安装 npm install express -g # 全局安装 本地安装 将安装包放在 ./node_modules 下( ...

  7. 深入了解Java虚拟机(1)java内存区域与内存溢出异常

    java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局 ...

  8. GetHashCode方法学习

    GetHashCode方法我的理解是做两个对象的比较,每个对象,不管是值类型还是应用类型都提供这个基本函数,都可以去重写它.GetHashTable通常用于HashTable.List<> ...

  9. js oop中的三种继承方法

    JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...

  10. 记录一次读取memcache缓存的优化

    我们是用mvc做web,大部分数据都用memcache做了缓存 有2台memcache缓存服务器 数据并不大. 某页面响应较慢,大概在4s左右. 页面本身很简单只是显示一个表单. 但是layout相对 ...