Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》

你可能从来没有听说过学 Java 的纠结是学 JDK6 还是 JDK7,也没听说学 PHP 的纠结是学 PHP5 还是 PHP7,但在 Python 社区,有这么个怪问题:“学 Python 到底是学2还是学3?”这个问题就像月经一样每隔断时间就出现在你面前,也成了很多初学者的选择困惑,这个问题的“始作俑者”当然是 Python 它爹,大家众说纷纭,有说 Python2 是主流,大公司都在用,你应该学 2 。也有说 Python3 才是未来主流,大多数第三方框架已基本支持 Python3。个人看法是 Python2 还会存在很长一段时间(只要那些用 Python2 的公司还没倒闭,就一直会存在),你去找工作很有可能就需要用到 2,而 Python3 也是你必须要掌握的,因为越来越多的人会迁移到 3 上去,本质上,它俩是同一门语言,仅仅只是极少部分(1%?并没有严格统计)不兼容的地方,所以就没所谓学哪一个好,学了一个,另一个花很少时间就能掌握。今天给大家介绍 Python2 和 Python3 的一些主要区别。

print
在进行程序调试时用得最多的语句可能就是 print,在 Python 2 中,print 是一条语句,而 Python3 中作为函数存在。有人可能就有疑问了,我在 Python2 中明明也看到当函数使用:

py2

print("hello") # 等价 print ("hello")

#py3
print("hello")
然而,你看到的只是表象,那么上面两个表达式有什么区别?从输出结果来看是一样的,但本质上,前者是把 ("hello")当作一个整体,而后者 print()是个函数,接收字符串作为参数。

py2

print("hello", "world")
('hello', 'world')

py3

print("hello", "world")
hello world
这个例子更明显了,在 py2 中,print语句后面接的是一个元组对象,而在 py3 中,print 函数可以接收多个位置参数。如果希望在 Python2 中 把 print 当函数使用,那么可以导入 future 模块 中的 print_function

py2

print("hello", "world")
('hello', 'world')

from future import print_function
print("hello", "world")
hello world
编码
Python2 的默认编码是 asscii,这也是导致 Python2 中经常遇到编码问题的原因之一,至于是为什么会使用 asscii 作为默认编码,原因在于 Python这门语言出来的时候还没出现 Unicode。Python 3 默认采用了 UTF-8 作为默认编码,因此你不再需要在文件顶部写 # coding=utf-8 了。

py2

sys.getdefaultencoding()
'ascii'

py3

sys.getdefaultencoding()
'utf-8'
网上不少文章说通过修改默认编码格式来解决 Python2 的编码问题,其实这是个大坑,不要这么干。

字符串
字符串是最大的变化之一,这个变化使得编码问题降到了最低可能。在 Python2 中,字符串有两个类型,一个是 unicode,一个是 str,前者表示文本字符串,后者表示字节序列,不过两者并没有明显的界限,开发者也感觉很混乱,不明白编码错误的原因,不过在 Python3 中两者做了严格区分,分别用 str 表示字符串,byte 表示字节序列,任何需要写入文本或者网络传输的数据都只接收字节序列,这就从源头上阻止了编码错误的问题,关于Unicode与字符串,其实在之前的文章进行系统的讲解过深入理解Python字符编码。

py2 py3 表现 转换 作用
str byte 字节 encode 存储、传输
unicode str 字符 decode 展示
True和False
True 和 False 在 Python2 中是两个全局变量(名字),在数值上分别对应 1 和 0,既然是变量,那么他们就可以指向其它对象,例如:

py2

True = False
True
False
True is False
True
False = "x"
False
'x'
if False:
... print("?")
...
?
显然,上面的代码违背了 Python 的设计哲学 Explicit is better than implicit.。而 Python3 修正了这个缺陷,True 和 False 变为两个关键字,永远指向两个固定的对象,不允许再被重新赋值。

py3

True = 1
File "<stdin>", line 1
SyntaxError: can't assign to keyword
迭代器
在 Python2 中很多返回列表对象的内置函数和方法在 Python 3 都改成了返回类似于迭代器的对象,因为迭代器的惰性加载特性使得操作大数据更有效率。Python2 中的 range 和 xrange 函数合并成了 range,如果同时兼容2和3,可以这样:

try:
range = xrange
except:
pass
另外,字典对象的 dict.keys()、dict.values() 方法都不再返回列表,而是以一个类似迭代器的 "view" 对象返回。高阶函数 map、filter、zip 返回的也都不是列表对象了。Python2的迭代器必须实现 next 方法,而 Python3 改成了 next

nonlocal
我们都知道在Python2中可以在函数里面可以用关键字 global 声明某个变量为全局变量,但是在嵌套函数中,想要给一个变量声明为非局部变量是没法实现的,在Pyhon3,新增了关键字 nonlcoal,使得非局部变量成为可能。

def func():
c = 1
def foo():
c = 12
foo()
print(c)
func() #1
可以对比上面两段代码的输出结果

def func():
c = 1
def foo():
nonlocal c
c = 12
foo()
print(c)
func() # 12
其实很多内建模块也做了大量调整,Python3 中的模块组织更加清晰,类更加先进,还引入了异步IO,这次先写这么多,下次再继续。

转载于:https://blog.51cto.com/12593443/2064264

py2与py3的区别相关推荐

  1. ST3新建py2和py3的build system

    win7上同时装了py2和py3,在ST3中执行需要分别新建各自的build system:Tools->Build System->New Build System py2: {&quo ...

  2. python模块之lib2to3(py2转py3自动化工具)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之lib2to3(py2转py3自动化工具) #http://tieba.baidu.com ...

  3. python小技巧之:同时安装py2和py3,如何在指定的版本下pip安装包

    前言 由于python官方声明2020年以后不再维护python2,而之前的很多代码都是python2编写的,很多小伙伴在学习的时候同时安装了py2和py3两个版本,那么如果我想将第三方的包安装到指定 ...

  4. Python知识点-py2和py3编码

    编码 大小 支持语言 ASCII 1个字节 英文 Unicode 2个字节(生僻字4个) 所有语言 UTF-8 1-6个字节,英文字母1个字节,汉字3个字节,生僻字4-6个字节 所有语言 py2编码: ...

  5. Py与Py3的区别之输入input()函数

    Python 2.7中,一般是使用的input()比较常规些,可是也可以使用raw_input():他们仍有以下不同之处 C:\Windows\system32>python Python 2. ...

  6. mongo3.5 java cursor_pymongo for py2.7.py3.6版本-pymongo下载3.5.1 官方最新版-西西软件下载...

    Python 使用MongoDB的简单教程,将使用pymongo对MongoDB进行的各种操作进行了简单的汇总,NoSQLFan进行了简单整理,使用Python的同学可以看一看. 下载相应平台的版本, ...

  7. Python-函数的各种器

    Python中的各大器,方便函数的使用,新增函数的方法和用途 一.装饰器 定义:在原有的函数前后,增加功能,且不改变原函数的调用方式 def wrapper(f1):''' 使用闭包函数用于装饰器的原 ...

  8. Python 编程系列

    目录 文章目录 目录 入门 进阶 模块 入门 <Python 是一门怎样的语言> <Python 基础 - Python 编程特色> <Python 基础 - 同时安装 ...

  9. python基础教程视频(全13集)-Python基础视频教程全集

    原标题:Python基础视频教程全集 Python编程语言的定位是"优雅"."明确"."简单",所以对于Python初学者来说,学起来没有那 ...

最新文章

  1. 【LeetCode-704 | 二分查找】
  2. 百度爬虫爬到虚拟链接 网站被黑_网站地图sitemap对SEO优化有什么作用?
  3. ER图,数据建模与数据字典
  4. getlasterror返回57怎么解决_王者荣耀:用时最短职业比赛?3分57秒结束,解说都看呆了!...
  5. 数据挖掘--分类思维导图
  6. linux 安卓svn,linux安装svn
  7. 易筋SpringBoot 2.1 | 第廿五篇:SpringBoot之Jedis访问Redis
  8. ARCGIS小工具(插件)免费版_自取_GIS插件_工具_其他
  9. OC Foundation框架 数组
  10. 登录账号提示服务器出错怎么办,教育平台号和密码都正确,就是显示用户名和或密码错误,登不上怎么办呀?...
  11. python实现匿名发邮件_Python里实现发送邮件的方法
  12. 计算机专业的优秀学长寄语大一新生,学长学姐对大一新生的寄语 大学学长学姐寄语励志...
  13. 导出excel 并且处理长数字,处理科学计数法,以文本形式存储的数字
  14. oracle序列号查询最大值,Oracle sequence值到了最大值的处理
  15. ps基础知识学习总结
  16. HACKTHEBOX——Nibbles
  17. MySQL使用数据库
  18. 帝国时代3手机单机版java_帝国时代3手游单机版
  19. java75-GUL文本框和标签
  20. 什么是广义表、广义表及定义详解

热门文章

  1. 【248】◀▶IEW-Unit13
  2. 用yui compressor 压缩 javascirpt脚本
  3. [论文摘录] Classification of SOA Contract Specification Languages(ICWS, 2008), 第二部分
  4. mysql 锁测试_mysql行级锁测试 - echowu007的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. 安卓导航车机root方法_安卓手机设置充电提示音教程来了!教你三种方法,无需 ROOT!...
  6. oracle大量删除数据之后索引是否需要重建_oracle10g重建XDB
  7. dev gridcontrol summaryitem如何加条件_如何一次清洗1000根核磁管
  8. centos7 docker-compose安装_Docker Compose 搭建 Redis Cluster 集群环境
  9. Xcode控制台打印集锦
  10. 脑电数据的Epoching处理