【Python学习笔记】第二十九节 Python2 和Python3发生了哪些变化

Python 版本分为两大流派,一个是 Python 2.x 版本,另外一个是 Python 3.x 版本,Python 官方同时提供了对这两个版本的支持和维护。

2020 年 1 月 1 日,Python 官方终止了对 Python 2.7 版本(最后一个 Python 2.x 版本) 的支持,这意味着开发者不会在接收到任何来自 Python 2.7 的错误修复或安全更新。自此 Python 2 完全退休,Python 3 时代正式来临。

尽管 Python 2 已退出历史舞台 ,但国内外一些互联网公司仍在使用 Python 2.7 开发程序,同时为了让大家更好地了解 Python 3 ,我们非常有必要知道这两个版本间存在区别。

你也许会问,为什么终止支持了,还会有公司再使用?其实,版本的更换是一项庞大、复杂的工作,一些小型的互联网公司在人力、财力不足的情况下,只能要继续使用低版本的 Python,只有万不得已时才会更新版本。

和 Python 2.x 版本相比,Python 3.x 版本在语句输出、编码、运算和异常等方面做出了一些调整,本节就对这些调整逐一地做简单介绍。


1、print 函数

print 语句没有了,取而代之的是 print() 函数。 Python 2.6 与 Python 2.7 部分地支持这种形式的 print 语法。在 Python 2.6 与Python 2.7 里面,以下三种形式是等价的:

print "hello"
print ("python") #注意print后面有个空格
print("app") #print()不能带有任何其它参数

然而,Python 2.6实际已经支持新的print()语法:

from __future__ import print_function
print("hello", "python","app", sep=',')

2、Unicode

目前 Python 用户面对的又一个“陷阱”就是,字符串现在默认为 Unicode 编码。这种变 化不可能很快就来,当处理 Unicode 和通常的 ASCII 字符串时,无数的 Python 开发人员遇到 这种问题已经不止一两天了。这种问题看起来如下所示。

UnicodeEncodeError: 'ascii' codec can't encode character
u'xae' in position 0: ordinal not in range(128)

在 Python 3.x 中这种类型的问题将不再经常发生。随着新版本的 Python 采用了这种模型,用户将不再需要使用 Unicode 和 ASCII/非 Unicode 字符串这些 术语。

“Python 3.0 中的新内容”(What’s New in Python 3.0)文档相当详细地总结了这种 新模型。 Python 3 使用了文本(text)和(二进制)数据的概念,而非 Unicode 字符串和 8 位字符 串。所有的文本都是 Unicode 编码的。然而,编码的 Unicode 表示成二进制数据。用来保存 文本的类型是 str,而用来保存数据的类型是 bytes。

Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。

现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。

python2

python3

是否可变

str("")

bytes(b"")

unicode(u"")

str("")

N/A

bytearray

由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的:

>>> 中国 = 'china'
>>>print(中国)
china
  • Python 2.x

>>> str = "我爱北京天安门"
>>> str
'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8'
>>> str = u"我爱北京天安门"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'
  • Python 3.x

>>> str = "我爱北京天安门"
>>> str
'我爱北京天安门'

3、除法运算

Python 中的除法较其它语言显得非常高端,有套很复杂的规则。

Python 中的除法有两个运算符,///

首先来说 / 除法:

在 Python 2.x 中 / 除法就跟我们熟悉的大多数语言,比如 Java 和 C ,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。

在 Python 3.x 中 / 除法不再这么做了,对于整数之间的相除,结果也会是浮点数。

  • Python 2.x:

>>> 1 / 2
0
>>> 1.0 / 2.0
0.5
  • Python 3.x:

>>> 1/2
0.5

而对于 // 除法,这种除法叫做 floor 除法,会对除法的结果自动进行一个 floor 操作,在 Python 2.x 和 Python 3.x 中是一致的。

  • python 2.x:

>>> -1 // 2
-1
  • python 3.x:

>>> -1 // 2
-1

注意的是并不是舍弃小数部分,而是执行 floor 操作,如果要截取整数部分,那么需要使用 math 模块的 trunc 函数

  • python 3.x:

>>> import math
>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0

4、不等运算符

  • Python 2.x中不等于有两种写法 != 和 <>

  • Python 3.x中去掉了<>, 只有!=一种写法,还好,我从来没有使用<>的习惯

5、去掉了repr表达式``

Python 2.x 中反引号``相当于repr函数的作用

Python 3.x 中去掉了``这种写法,只允许使用repr函数,这样做的目的是为了使代码看上去更清晰么?不过我感觉用repr的机会很少,一般只在debug的时候才用,多数时候还是用str函数来用字符串描述对象。

def sendMail(from_: str, to: str, title: str, body: str) -> bool:
    pass

6、输入的不同

从键盘录入一个字符串

原:

raw_input( "提示信息" )

改为:

 input( "提示信息" )
  • 在python2.x中raw_input()和input( ),两个函数都存在,其中区别为:

– raw_input()---将所有输入作为字符串看待,返回字符串类型

– input()-----只能接收"数字"的输入,在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型(int, float )

  • 在python3.x中rawinput()和input( )进行了整合,去除了rawinput(),仅保留了input()函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。

6、模块改名

旧的名字

新的名字

_winreg

winreg

ConfigParser

configparser

copy_reg

copyreg

Queue

queue

SocketServer

socketserver

repr

reprlib

StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。 取消了exec语句,只剩下exec()函数。

7、数据类型

1)Python3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long

2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下:

>>> b = b'china' 
>>> type(b) 
<type 'bytes'> 

str 对象和 bytes 对象可以使用 .encode() (str -> bytes) 或 .decode() (bytes -> str)方法相互转化。

>>> s = b.decode() 
>>> s 
'china' 
>>> b1 = s.encode() 
>>> b1 
b'china' 

3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有 dict.has_key(),用 in替代它吧 。

8、八进制字面量表示

八进制数必须写成0o777,原来的形式0777不能用了;二进制必须写成0b111。

新增了一个bin()函数用于将一个整数转换成二进制字串。 Python 2.6已经支持这两种语法。

在Python 3.x中,表示八进制字面量的方式只有一种,就是0o1000。

  • python 2.x

>>> 0o1000
512
>>> 01000
512
  • python 3.x

>>> 01000
  File "<stdin>", line 1
    01000
        ^
SyntaxError: invalid token
>>> 0o1000
512

9、xrange

在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。

这个表现十分像生成器(比如。"惰性求值")。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。

由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。

在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。

import timeit

n = 10000
def test_range(n):
    return for i in range(n):
        pass

def test_xrange(n):
    for i in xrange(n):
        pass   
  • Python 2

print 'Python', python_version()

print '\ntiming range()' 
%timeit test_range(n)

print '\n\ntiming xrange()' 
%timeit test_xrange(n)

Python 2.7.6

timing range()
1000 loops, best of 3: 433 µs per loop


timing xrange()
1000 loops, best of 3: 350 µs per loop

Python 3

print('Python', python_version())

print('\ntiming range()')
%timeit test_range(n)

Python 3.4.1

timing range()
1000 loops, best of 3: 520 µs per loop
print(xrange(10))
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-5d8f9b79ea70> in <module>()
----> 1 print(xrange(10))

NameError: name 'xrange' is not defined

10、更新异常的语法

异常处理 在过去,捕获异常的语法和异常参数/实例有以下形式。 except ValueError, e: 用相同的处理程序捕获多个异常,会使用下面的语法。 except (ValueError, TypeError), e: 所需的圆括号使得一些用户迷惑,因为他们经常尝试编写看起来像下面这样的无效 代码。 except ValueError, TypeError, e: 新的 as 关键字是为了确保你不会因为原始语法中的逗号而混淆;然而,当你试图使用相 同的处理程序捕获一种以上的异常时,仍旧需要圆括号。这里有两个相同功能的新语法例子, 它们展示了这种变化:

except ValueError as e:
except (ValueError, TypeError) as e:

自 Python 2.6 以来,之后发行的 2.x 版本在创建异常处理程序时都开始接受这两种形式, 从而促进了移植过程。可以在 PEP 3110 找到关于该变化的更多信息。 抛出异常 Python 2.x 中抛出异常的最受欢迎的语法如下所示。

raise ValueError, e

需要重点强调的是,你正在创建一种异常的一个实例,Python 3.x 中唯一支持的一种语 法如下所示。 raise ValueError(e) 这个语法其实一点也不新鲜。

在超过 10 年前的 Python 1.5(是的,你没有看错)中就引 入了这种语法,当时异常由字符串变化成类,类实例化的语法看起来更像是后者而非前者, 并且我们确信你会同意这一点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宝爷~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值