## 引言
Python 是一种极具可读性和通用性的编程语言。Python 这个名字的灵感来自于英国喜剧团体 **Monty Python**,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣。Python 易于上手,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择。
Python 是一种多范式语言,也就是说,它支持多种编程风格,包括**脚本和面向对象**,这使得它适用于通用目的。随着越来越多地在工业中,被诸如联合太空联盟(NASA 的主要飞机支持承包商)和工业光魔(VFX 和卢卡斯影业的动画工作室)等组织使用,Python 为那些寻求额外编程语言的人提供了巨大的潜力 。
开发于 20 世纪 80 年代末并于 1991 年首次被发布,Python 的创始人是 Guido van Rossum ,而他现在仍然活跃在社区中。被认为是 ABC 编程语言的继承者,Python 的第一版就已经包括异常处理,函数和带继承的类。当一个重要的被称为 comp.lang.python 的 Python 新闻组在 1994 年形成时,Python 的用户基础不断增长,这为 Python 成为开源开发中最受欢迎的编程语言之一铺平了道路。
## 总体概述
在探讨 Python 2 和 Python 3 之间的潜在可能性和关键的程序化差异之前,我们来看看最近的 Python 主要版本的背景。
### Python 2
Python 2 发布于 2000 年年底,意味着较之先前版本,这是一种更加清晰和更具包容性的语言开发过程。而先前版本的 Python 应用的是 PEP (Python 增强协议),这种技术规范能向 Python 社区成员提供信息或描述这种语言的新特性。
此外,Python 2 还包括了更多的程序性功能,包括能自动化地管理内存的循环检测垃圾收集器,增加了对 Unicode 的支持以实现字符的标准化,并采用列表综合的方式以在现有列表基础上创建列表。 随着 Python 2 的不断发展,更多的功能被添加进来,包括将 Python 的类型和类在 Python 2.2 版本中统一为一层。
### Python 3
Python 3 被视为 Python 的未来,是目前正在开发中的语言版本。作为一项重大改革,Python 3 于 2008 年年末发布,以解决和修正以前语言版本的内在设计缺陷。Python 3 开发的重点是清理代码库并删除冗余,清晰地表明只能用一种方式来执行给定的任务。
对 Python 3.0 的主要修改包括将 **print 语句更改为内置函数**,**改进整数分割的方式**,并对 **Unicode 提供更多的支持**。
起初,Python 3的采用很缓慢,因为该语言不能向后兼容 Python 2,这就需要人们决定该使用哪个版本的语言。此外,许多封装库库只适用于 Python 2,但是由于 Python 3 背后的开发团队重申了终止对 Python 2 的支持,促使更多的库被移植到 Python 3 上来。从对 Python 3 提供支持的 Python 包的数量可以看出,Python 3 已得到越来越多的采用,在撰写本文时,支持它的包就已包括了 339 个最受欢迎的 Python 包。
### Python 2.7
在 2008 年 Python 3.0 的发布之后,Python 2.7 于 2010 年 7 月 3 日发布,并计划作为 2.x 版本的最后一版。发布 Python 2.7 的目的在于,通过提供一些测量两者之间兼容性的措施,使 Python 2.x 的用户更容易将功能移植到 Python 3 上。这种兼容性支持包括了 2.7 版本的增强模块,如支持测试自动化的 unittest,用于解析命令行选项的 argparse,以及更方便的集合类。
Python 2.7 具有 Python 2 和 Python 3.0 之间的早期迭代版本的独特位置,它因为对许多具有鲁棒性的库具有兼容性,对于程序员而言一直是非常流行的选择。当我们今天讨论 Python 2 时,我们通常指的是 Python 2.7 版本,因为它是最常用的版本。
然而,Python 2.7 被认为是一种遗留语言,且它的后续开发,包括现在最主要的 bug 修复,将在 2020 年完全停止。
## 主要差异
虽然 Python 2.7 和Python 3 有许多类似的功能,但它们不应该被认为是完全可互换的。虽然你可以在任一版本中编写出优秀的代码和有用的程序,但是值得了解的是,在代码语法和处理方面两者会有一些相当大的差异。
下面是一些例子,而且你应该记住,当你深入学习 Python 时,你可能会遇到更多的语法差异。
## Print
在 Python 2 中, print 被视为一个语句而不是一个函数,这是一个典型的容易弄混的地方,因为在 Python 中的许多操作都需要括号内的参数来执行。如果在 Python 2 中你想要你的控制台输出 ”Sammy the Shark is my favorite sea creature”,你应该写下这样的 print 语句:
> print "Sammy the Shark is my favorite sea creature"
在使用 Python 3 时,print()会被显式地视为一个函数,因此要输出上面相同的字符串,你可以使用这种非常简单且易于使用的函数语法:
> print("Sammy the Shark is my favorite sea creature")
这种改变使得 Python 的语法更加一致,并且在不同的 print 函数之间进行切换更加容易。就方便性而言,print()语法也与 Python 2.7 向后兼容,因此您的 Python 3 print()函数可以在任一版本中运行。
## 整数的除法
在 Python 2 中,您键入的任何不带小数的数字,将被视为整数的编程类型。虽然乍看起来这似乎是一个简单的处理编程类型的方法,但有时候当你试图除以整数以期望获得一个带小数位的答案(称为浮点数),如:
> 5 / 2 = 2.5
然而,在 Python 2 中,整数是强类型的,并且不会变成带小数位的浮点数,即使这样做具有直观上的意义。
当除法/符号的任一侧的两个数字是整数时,Python 2进行底除法,使得对于商x,返回的数字是小于或等于x的最大整数。这意味着当你写下 5 / 2 来对这两个数字相除时,Python 2.7 将返回最大的小于或等于 2.5 的整数,在这种情形下:
```
> a=5/2
>
> print a
> Output
>
> 2
```
为解决这个问题,你可以在 5.0 / 2.0 中添加小数位,以得到预期的答案 2.5。
在 Python 3 中,整数除法变得更直观,如
```
> a=5/2
>
> print(a)
> Output
>
> 2.5
```
你也可以使用 5.0 / 2.0 返回 2.5,但是如果你想做底层划分,你应该使用 “//” 这样的 Python 3 语法,像这样
```
> b=5//2
>
> print(b)
> Output
>
> 2
```
在 Python 3 中的这种修改使得整数除法更为直观,并且它的特点是不能向后兼容 Python 2.7。
## 支持 Unicode
当编程语言处理字符串类型时,也就是一个字符序列,它们可以用几种不同的方式来做,以便计算机将数字转换为字母和其他符号。
Python 2 默认使用 ASCII 字母表,因此当您输入“Hello,Sammy!”时, Python 2 将以 ASCII 格式处理字符串。被限定为在多种扩展形式上的数百个字符,用ASCII 进行字符编码并不是一种非常灵活的方法,特别是使用非英语字符时。
要使用更通用和更强大的Unicode字符编码,这种编码支持超过128,000个跨越现今和历史的脚本和符号集的字符,你必须输入
> u“Hello,Sammy!”
前缀 u 代表 Unicode。
Python 3 默认使用 Unicode,这节省了程序员多余的开发时间,并且您可以轻松地在程序中直接键入和显示更多的字符。因为 Unicode 支持更强大的语言字符多样性以及 emoji 的显示,所以将它作为默认字符编码来使用,能确保全球的移动设备在您的开发项目中都能得到支持。
如果你希望你的 Python 3 代码向后兼容 Python 2,你可以通过在你的字符串的前面保留 “u” 来实现。
## 后续发展
Python 3 和 Python 2 之间的最大区别不是语法上的,而是事实上 Python 2.7 将在 2020 年失去后续的支持,Python 3 将继续开发更多的功能和修复更多的错误。
最近的发展包括格式化的字符串,类创建的简单定制,和用一种更干净的句法方式来处理矩阵乘法。
Python 3 的后续开发意味着,开发人员可以对问题被及时解决抱有信心,并且随着时间的推移更多的功能将被添加进来,程序也会变得更加有效。
## 其他注意事项
作为一个在 Python 上开始的新手程序员,或作为一个有经验的程序员开始接触 Python 语言,你会考虑在语言学习中你希望实现什么。
如果你希望只是在没有设定项目的情况下学习,你最可能考虑到 Python 3 将得到后续支持和开发,而 Python 2.7 不会。
但是,如果您计划加入已有的项目,则你最有可能希望了解该团队正在使用的 Python 版本,还有如果项目使用的软件包支持不同版本,不同版本应该如何与旧版代码库进行交互,以及项目的实施细节。
如果你正开启了一个项目,你会想,调查哪些包可以使用,以及这些包和哪个版本的 Python 是兼容的。如上所述,尽管早期版本的 Python 3与为 Python 2 版本构建的库的兼容性较低,但是许多库已移植到 Python 3,或致力于在未来四年这样做。
## 结论
Python 是一种多用途的且良好的编程语言,无论你选择使用 Python 2 还是 Python 3,你都能够做出一些令人兴奋的软件项目。
虽然有几个关键的区别,做一些调整以从 Python 3 跨越到 Python 2 并不是太困难,并且你经常会发现,Python 2.7 可以轻松地运行 Python 3 的代码,尤其是当你刚起步的时候。
重要的是要记住,随着越来越多的开发人员和团队的注意力集中在 Python 3 上,这种语言将变得更加精细,并与程序员不断变化的需求相一致,相较而言,对 Python 2.7 的支持将会越来越少。
- 前言
- 环境搭建
- pypi
- 打包
- Python 2 和 Python 3 的版本之间差别
- 项目
- 第一部分
- 第1章 基础
- Python安装
- python代码文件类型
- python对象
- 核心数据类型
- 核心数据类型--整型和浮点型
- 核心数据类型--字符串
- str.format
- 核心数据类型--列表
- 核心数据类型--元组
- 核心数据类型--字典
- 核心数据类型--集合
- 核心数据类型--文件对象
- 调用bash
- 标准输入输出
- str-repr
- 字符编码
- 迭代器和生成器
- 第2章 语句和语法
- 赋值语句
- if语句
- while语句
- for语句
- assert
- 第3章 函数
- 函数作用域
- 工厂函数
- 内置函数
- 递归
- 嵌套作用域和lambda
- 参数传递
- 函数式编程
- property可写与可读
- 第5章 模块
- 模块导入
- 模块命名空间
- 相对导入和绝对导入
- 模块重载
- 在模块中隐藏数据
- 过渡性重载
- 第6章 类
- 面向对象还是面向过程?
- 构造函数 析构函数
- call
- 运算符重载
- str()
- 待定
- 即时生成属性
- 多态
- 线程和进程
- thread模块
- threading模块
- threading线程锁
- 糖果机
- multiprocessing
- 阻塞非阻塞同步异步
- 单线程和多线程对比
- 生产者消费者模型
- 第二部分
- 获取系统资源信息
- 获取进程所占的物理内存
- dmidecode获取系统信息
- 网络编程
- 网络基础
- python中的套接字
- socket模块
- 第三部分 高级功能
- 闭包入门
- 闭包的应用
- 装饰器入门
- 装饰器应用
- 第四部分 项目实战
- graphite
- 模块
- collections
- datetime
- Enum
- faker
- fabric
- fileinput
- fire
- fnmatch
- getpass
- glob
- hashlib
- heapq
- json模块
- log
- os
- Paramiko
- parser
- platform
- pyyaml
- Queue
- random
- re
- 特殊符号和字符
- re模块
- shelves
- subprocess
- time
- urllib_urllib2_requests
- urllib urllib2
- requests
- 标准模块ConfigParser
- 扩展模块Mysqldb
- 扩展模块dns
- 扩展模块request
- uuid
- cacheout 缓存库
- delorean 时间
- 附录
- 内置函数
- python实现各种排序算法
- 常见报错
- pymongo
- pyrocksdb
- 常用
- ERROR