当前位置: 首页 > 科技观察

Python 2 和 Python 3 主要区别有哪些(一)

时间:2023-03-14 19:29:39 科技观察

Python2和Python3之间的主要区别是什么?大多数缺陷无法通过其他方式修复。——摘自《流畅的Python》http://web.archive.org/web/20031002184114/www.amk.ca/python/writing/warts.html你可能没听说过学Java,纠结是学JDK6还是JDK7,并且从来没有听说过学习PHP纠结于学习PHP5或者PHP7,但是在Python社区中,却存在这样一个奇怪的现象:“学习Python到底是学2还是学3?”成了很多初学者的选择困惑。问题的“始作俑者”当然是Python。每个人都有不同的看法。有人说Python2是主流,大公司都在用。应该学2。也有人说Python3是以后的主流,大部分第三方框架基本都支持Python3。我个人的看法是Python2还会长期存在(只要那些用Python2的公司没倒闭,就会一直存在),找工作可能需要用2,Python3也是必须的掌握。因为越来越多的项目会优先考虑3,本质上都是同一种语言,只有很小一部分(1%?没有严格统计)不兼容,所以无所谓谁学的好,学一个,另一个需要很少的时间来掌握。今天介绍一下Python2和Python3的一些主要区别。打印可能是调试打印程序时最常用的语句。在Python2中,print是一条语句,而在Python3中,它作为一个函数存在。有些人可能会有疑问。我在Python2中也看到它是一个函数:#py2print("hello")#equivalentprint("hello")#py3print("hello")但是,你看到的只是表象,以上两者有什么区别表达?从输出结果来看,它们是一样的,但本质上,前者将("hello")作为一个整体来对待,而后者print()是一个接收字符串作为参数的函数。#py2>>>print("hello","world")('hello','world')#py3>>>print("hello","world")helloworld这个例子比较明显,在py2中,print语句后面跟着一个元组对象,在py3中,print函数可以接收多个位置参数。如果你想在py2中使用print作为一个函数,你可以在以后的模块中导入print_function#py2>>>print("hello","world")('hello','world')>>>>>>>from__future__importprint_function>>>print("hello","world")helloworldencodingPython2默认的编码是asscii,这也是Python2经常遇到编码问题的原因之一。至于为什么使用asscii作为默认编码,原因是Python2Unicode出来的时候并没有出现。Python3使用UTF-8作为默认编码,因此您不再需要在文件顶部编写#coding=utf-8。#py2>>>sys.getdefaultencoding()'ascii'#py3>>>sys.getdefaultencoding()'utf-8'网上很多文章都说Python2的编码问题可以通过修改默认编码格式来解决。其实这是个大坑,千万别做。字符串字符串是最小化编码问题的最大变化之一。在Python2中,字符串有两种,一种是unicode,一种是str。前者代表一个文本字符串,后者代表一个字节序列。但是两者之间没有明确的界限,开发者感到困惑,不明白编码错误的原因,但是在Python3中,两者是严格区分的,str用来表示字符串,byte用来表示表示字节序列。任何需要写入文本或通过网络传输的数据都只接收字节序列。这是从源码上面防止编码错误的问题。True和FalseTrue和False是Python2中的两个全局变量(名称),对应value中的1和0,既然是变量,就可以指向其他对象,例如:#py2>>>True=False>>>TrueFalse>>>TrueisFalseTrue>>>False="x">>>False'x'>>>ifFalse:...print("?")...?显然,上面的代码违背了Python的显式优于隐式的设计理念。不过,Python3修正了这个缺陷。True和False成为两个关键字,始终指向两个固定对象,不允许重新赋值。#py3>>>True=1File"",line1SyntaxError:can'tassigntokeyworditerator在Python2中,许多返回列表对象的内置函数和方法在Python3中被改为返回类似于迭代器的对象,因为迭代的容器的懒加载特性使得操作大数据更加高效。Python2中的range和xrange函数合并为range。如果2和3都兼容,你可以这样做:try:range=xrangeexcept:pass另外,字典对象的dict.keys()和dict.values()方法将不再返回List,而是作为一个返回类似迭代器的“视图”对象。高阶函数map、filter和zip不再返回列表对象。是的,py2的迭代器必须实现next方法,py3改成了__next__nolocal。我们都知道在py2中,可以在函数中使用关键字global将变量声明为全局变量,但是在嵌套函数中,如果想将变量声明为非局部变量是不可能的。py3添加了关键字nolcoal以使非局部变量成为可能。deffunc():c=1deffoo():c=12foo()print(c)func()#1可以比较上面两段代码的输出结果deffunc():c=1deffoo():nonlocalcc=12foo()print(count)func()#12其实很多内置模块都做了很多调整。Python3中模块组织更清晰,类更高级,引入了异步IO。这次先写这么多,下次再继续。【本文为专栏作家“刘志军”原创文章,作者微信公众号:Python之禅(VTtalk)】点此阅读更多本作者好文