首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

新手学python应该如何选择python2和python3

引言

Python 是一种极具可读性和通用性的编程语言。Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣。Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择。

Python 是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的。随着越来越多地在工业中,被诸如联合太空联盟(NASA 的主要飞机支持承包商)和工业光魔(VFX 和卢卡斯影业的动画工作室)等组织使用,Python 为那些寻求额外编程语言的人提供了巨大的潜力 。

Python 2.x和Python 3.x区别在哪里

简单的结论:Python 2.x是旧版,Python 3.x是python语言的现在和未来。

Python 3.0于2008年发布。最终的2.x版本2.7版本在2010年年中发布,并声明对这一生命周期版本进行了扩展支持。之后,2.x分支机构将看不到新的主要版本。 3.x正在积极发展,已经有超过五年的稳定版本,包括2012年的3.3版,2014年的3.4个,2015年的3.5个,2016年的3.6个。这意味着例如所有最近的标准库改进仅在Python 3.x中可用。

Guido van Rossum(Python语言的原始创建者)决定正确地清理Python 2.x,而不用考虑向后兼容性,而不是2.x范围内的新版本。最大的改进是更好的Unicode支持(默认情况下,所有文本字符串都是Unicode)以及saner字节/ Unicode分隔。

此外,核心语言的几个方面(例如打印和执行语句,使用分区的整数)已被调整为使新手更容易学习,并与其他语言更加一致,而旧的拼图已被删除(例如,所有类现在都是新样式的,“range()”返回一个高效的内存可迭代,而不是像2.x中的列表)。

Python 3.0文档中的新功能可以很好地概述主要的语言变化以及与现有Python 2.x代码不兼容的可能来源。 Nick Coghlan(CPython核心开发人员之一)也创建了一个相对较广泛的关于转换的FAQ。

然而,更广泛的Python生态系统多年来已经积累了大量优质的软件。在3.x中打破向后兼容性的缺点是,其中一些软件(特别是公司内部的软件)仍然不能在3.x上运行。

到底应该选哪个版本呢

如果你可以使用python3.x完成需求,那么很赞,3.x有一些细微的缺点。

有些库并不支持

目前发行的Linux和Mac仍然默认自带2.x

但作为一种语言Python 3.x肯定准备好了只要Python 3.x安装在用户的计算机上(这应该是简单的,因为很多阅读这个人的人只能为自己或他们控制的环境开发某些东西),而你正在写的东西,你不知道需要Python 2.x模块,这是一个很好的选择。此外,大多数Linux发行版都已经安装了Python 3.x,并且它们都可用于最终用户。有些正在淘汰Python 2作为默认预装的。

特别是,向新程序员介绍Python的教师应该首先考虑教Python 3,然后再引入Python 2中的差异(如果需要的话),因为Python 3消除了许多怪癖,这些怪癖可能会使开始的程序员试图学习Python 2。

但是,有一些关键问题可能需要您使用Python 2而不是Python 3。

首先,如果您部署到您无法控制的环境中,那么可能会强加一个特定版本,而不是允许您从可用版本中自由选择。

其次,如果要使用尚未具有与Python 3兼容的发布版本的特定第三方软件包或实用程序,并且移植该软件包是一项非常重要的任务,您可以选择按顺序使用Python 2 以保留对该包的访问。

Python 3已经广泛地支持创建GUI应用程序,Tkinter在标准库中。 Python 3已经被PyQt支持,几乎从Python 3发行的那一天开始, PySide在2011年添加了Python 3支持。可以使用支持Python 3的PyGObject创建GTK + GUI,并且是PyGtk的后继。

许多其他主要软件包已被移植到Python 3,包括:

NumPy和SciPy(用于数字处理和科学计算)

Django,Flask,CherryPy和Pyramid(做网站)

PIL(图像处理模块)被它的分支Pillow取代,它支持Python 3。

cx_Freeze (用于包装应用程序及其依赖项)

py2exe (为Windows用户打包应用程序)

OpenCV 3 (一个开源计算机视觉和机器学习库)现在支持版本3.0和更高版本的Python 3。

Requests (一个功能强大的Pythonic XML处理库,将libxml2 / libxslt与ElementTree API相结合)

BeautifulSoup4(用于解析HTML和XML的屏幕抓取库)

用于交互式计算的IPython / Jupyter项目完全支持Python 3。

和许多,更多!

如果你想使用Python 3.x,但是由于依赖性而害怕,可能值得先做一些研究。 这是一个正在进行的工作,这个wiki页面可能已经过时了。 此外,由Python 2.6+和Python 3.3+支持的大型常用子集,许多现代Python代码应该在Python 3上大部分未经修改,尤其是与Web和GUI框架互操作的代码,强制应用程序正确区分二进制数据和文本 (可能需要来自六个兼容性模块的一些帮助来处理名称更改。

尽管官方python文档和教程已经完全更新为Python 3,但仍然有很多文档(包括示例)在Web上和使用Python 2的参考书籍,尽管更多的是一直在更新。 这可能需要一些调整,以使事情与Python 3的工作。

有些人只是不想使用Python 3.x,这是它们的特权。 但是,他们在少数。

值得注意的是,如果您希望使用Python的替代实现,例如IronPython,Jython或Pyston(或Python平台或编译器实现的较长列表之一),Python 3的支持仍然相对较少。 如果您有兴趣选择此类实现,以便与其他系统集成或执行性能,可能会影响您。

但是我不想避免选择2.x? 这是一个有很多错误的古老语言,它花了一个主要版本来让他们出来。

嗯,不完全对。 3.0和3.1中的一些较少破坏性的改进分别已经反映到2.6和2.7。 有关返回功能的更多详细信息,请参阅Python 2.6中的新功能和Python 2.7中的新功能。

一个非穷尽的功能列表,仅在3.x版本中可用,不会被转载到2.x系列:

字符串默认为Unicode

干净的Unicode /字节分离

异常链接

函数注释

关键字参数的语法

扩展元组拆包

非局部变量声明

此外,语言演进不仅限于核心语法或语义变化。 它还关注标准库,在3.x中进行了许多改进,不会直接转发到Python 2.请参见Python 3中的新增功能。 然而,许多标准库的改进也可通过PyPI获得。

也就是说,写得很好的2.x代码可能很像3.x代码。 这可能意味着许多事情,包括使用新式类,不使用古老的不推荐的奥术咒语打印,使用可用的惰性迭代器等。一个实际的例子:良好的2.x代码通常将使用xrange()而不是范围; xrange()是Python 3.x范围实现的起点(尽管Python 3中的范围更好,因为它可以处理大于sys.maxint的值)。 应该注意的是xrange()不包括在Python 3中。

最重要的是,建议您专注于编写好的代码,以便2.x与3.x不再是一个问题。 包括编写完整的单元测试套件,并获得Unicode权限。 (Python 3.x相对于Unicode而言比Unicode少得多2.x认为这是一件好事,虽然它使一些软件包变得非常烦人。)

我想使用Python 3,但是我只想使用这个Python 2.x的这个小型库。 我真的需要恢复使用Python 2或放弃使用该库吗?

假设您找不到已经支持Python 3的替代软件包,您仍然可以考虑几个选项:

将库导入3.x. (“移植”意味着您使库工作在3.x上)

如果事实证明是非常困难的,并且所有其他的依赖项确实存在于2.x中,那么请考虑从2.x开始。 正如已经在其他地方所解释的那样,一旦每个依赖关系被成功移植,好的2.x代码通常会使切换变得无痛。

确定功能是否真的那么重要。 也许你可以放弃它?

理想的情况是您尝试将库移植到3.x. 通常你会发现有人已经在这个工作了。 即使情况并非如此,现有的项目成员通常也会欣赏这些帮助,特别是随着移植常常在原始软件中发现错误,提高原始和3.x端口的质量。 移植并不总是容易的,但通常比从头开始编写自己的东西更容易。

在这个Python 2移植指南中解释了你应该怎么做移植。基本思想是使用2.x版本的库,并检查在Python 2中使用-3命令行开关时,所有单元测试是否仍然通过,如果测试失败或发出警告,请修改源并重试(这可能需要降低与旧版本的Python版本的兼容性)。一旦使用-3开关代码运行时没有警告,那么尝试使用Python 3运行它。最好的情况是当这个“工作” - 使用现代Python 2成语编写的代码与Python 3源代码兼容时,在这一点上,“港口”可能已经完成。

如果Python 3中的测试仍然失败,那么标准库的2to3实用程序通常可以自动创建一个将在Python 3下运行的版本。或者,Armin Ronacher的python-modernize实用程序代替Python 2.6+和3.2+或3.3+(取决于所使用的命令行选项)。 (如果使用后者,检查测试仍然通过Python 2是很重要的!)

任何一种方法使得可以从单个2.x代码库并行支持2.x和3.x。这比试图并行维护独立的2.x和3.x分支要容易得多(只是问Python核心开发人员关于那个呢 - 他们已经停止了这么多年了)。

如果自动转换或现代化后测试仍然失败,则代码可能会受到Python 2和3之间的语义变化的影响,转换器无法自动处理,也不会被-3开关检测到。这样的问题应该是罕见的,但可能仍然存在 - 如果遇到一个问题,那么值得提交一个针对CPython的错误请求一个新的-3警告。

我决定在3.x中写一些东西,但是现在有人想要使用只有2.x的东西。 我该怎么办?

除了可以从2.x源代码生成3.x代码的2to3工具外,还有3to2工具,其目的是将3.x代码转换回2.x代码。 在理论上,这应该比走向另一个方向更好,因为3.x没有这么多讨厌的拐角情况,转换器处理(摆脱尽可能多的那些是打破的主要原因之一 向后兼容性毕竟!)。 然而,不太可能成功地转换大量使用3.x功能的代码(如函数注释或扩展元组解压缩)。

说3to2是在这个阶段比2to3少的路,所以你可能会在这里和那里遇到一些粗糙的边缘。 但是,如果要编写3.x代码,这绝对是值得探索的一个想法。

在通用代码库中支持Python 2和Python 3

Python 2.6+和Python 3.3+的普通子集相当大 - 在Python 3.3中恢复u前缀支持unicode字面意味着语义上正确的Python 2.6+代码可以与Python 3.3+源兼容,而仍然主要是惯用的Python。 主要区别在于,有些事情需要从不同的地方导入,以便处理Python 2和Python 3中具有不同名称的事实。

因此,六个兼容性包是在单个代码库中支持Python 2和Python 3的关键实用程序。

未来的兼容性包仍然是beta版,并不支持尽可能多的Python版本(只有Python 2.6,而6个支持Python 2.4),但是允许Python 2兼容的代码写成样式 这更接近习惯Python 3(例如,它包括Python 3字节类型的实际Python 2兼容实现,而不是依赖于暴露稍微不同的API的Python 2.x 8位字符串类型)。

识别标准库模块的另一个关键是如果在PyPI上有更多的最新版本,可以优先于2.x标准库版本使用。 以下模块是PyPI backports,或者原始模块作为Python 2.7或3.x中的标准库添加源(或灵感):略

使用backports命名空间模块的优点是,它清楚地指出什么时候是标准库功能的跨版本后端,并且还允许在适当时使用原始模块名称,而不会与标准库名称冲突。

支持 Unicode

当编程语言处理字符串类型时,也就是一个字符序列,它们可以用几种不同的方式来做,以便计算机将数字转换为字母和其他符号。

Python 2 默认使用 ASCII 字母表,因此当您输入“Hello,Sammy!”时, Python 2 将以 ASCII 格式处理字符串。被限定为在多种扩展形式上的数百个字符,用ASCII 进行字符编码并不是一种非常灵活的方法,特别是使用非英语字符时。

要使用更通用和更强大的Unicode字符编码,这种编码支持超过128,000个跨越现今和历史的脚本和符号集的字符,你必须输入

, 前缀 u 代表 Unicode。

Python 3 默认使用 Unicode,这节省了程序员多余的开发时间,并且您可以轻松地在程序中直接键入和显示更多的字符。因为 Unicode 支持更强大的语言字符多样性以及 emoji 的显示,所以将它作为默认字符编码来使用,能确保全球的移动设备在您的开发项目中都能得到支持。

如果你希望你的 Python 3 代码向后兼容 Python 2,你可以通过在你的字符串的前面保留 “u” 来实现。

结论

Python 是一种多用途的且良好的编程语言,无论你选择使用 Python 2 还是 Python 3,你都能够做出一些令人兴奋的软件项目。

虽然有几个关键的区别,做一些调整以从 Python 3 跨越到 Python 2 并不是太困难,并且你经常会发现,Python 2.7 可以轻松地运行 Python 3 的代码,尤其是当你刚起步的时候。

重要的是要记住,随着越来越多的开发人员和团队的注意力集中在 Python 3 上,这种语言将变得更加精细,并与程序员不断变化的需求相一致,相较而言,对 Python 2.7 的支持将会越来越少。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180118G00SCZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券