设为首页 收藏本站
查看: 639|回复: 0

[经验分享] python2.x和python3.x的区别

[复制链接]

尚未签到

发表于 2018-8-5 08:21:26 | 显示全部楼层 |阅读模式
  Python的3​​.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。
  为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下相容。许多针对早期Python版本设计的程式都无法在Python 3.0上正常执行。为了照顾现有程式,Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。
  新的Python程式建议使用Python3.0版本的语法。除非执行环境无法安装Python3.0或者程式本身使用了不支援Python 3.0的第三方库。目前不支援Python 3.0的第三方库有Twisted, py2exe, PIL等。
  大多数第三方库都正在努力地相容Python 3.0版本。即使无法立即使用Python 3.0,也建议编写相容Python 3.0版本的程式,然后使用Python 2.6, Python 2.7来执行。
  Python 3.0的变化主要在以下几个方面:

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

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

Unicode
  在 Python2 中,有两种字符串数据类型。一种纯旧式的文字: “str” 对象,存储 bytes 。如果你使用一个 “u” 前缀,那么你会有一个“unicode”对象,存储的是code points。在一个unicode字符串中,你可以使用反斜杠 u(u) 来插入任何的 unicode 代码点。现在,在Python3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。
  由于 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
  
'我爱北京天安门'
  

除法运算
  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
  

异常
  在 Python 3 中处理异常也轻微的改变了,在 Python 3中我们现在使用as作为关键词。捕获异常的语法由 except exc, var 改为 except exc as var。使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。



  • 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
  • 在2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。
  在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。

xrange
  在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。这个表现十分像生成器(比如。"惰性求值")。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。
  在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。

八进制字面量表示
  八进制数必须写成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
  

不等运算符
  Python 2.x中不等于有两种写法 != 和 <>
  Python 3.x中去掉了<>, 只有!=一种写法

去掉了repr表达式``
  函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供解释器读取的形式。Python 2.x 中反引号``相当于repr函数的作用。Python 3.x 中去掉了``这种写法,只允许使用repr函数
  python2.x
  

>>> `"abc"`  
"'abc'"
  
>>> repr("abc")
  
"'abc'"
  

  python3.x
  

In [25]: repr("abc")  
Out[25]: "'abc'"
  

  
In [26]: `"abc"`
  File "<ipython-input-26-1d8e11730830>", line 1
  `"abc"`
  ^
  
SyntaxError: invalid syntax
  

  

多个模块被改名(根据PEP8)

旧的名字
新的名字
_winreg
winreg
ConfigParser
configparser
copy_reg
copyreg
Queue
queue
SocketServer
socketserver
repr
reprlib  StringIO模块现在被合并到新的io模组内。 new, md5, gopherlib等模块被删除。 Python 2.6已经支援新的io模组。httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。取消了exec语句,只剩下exec()函数。

数据类型
  1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long
  2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下:
  

>>> b = b'china'  
>>> type(b)
  
<type 'bytes'>
  
str对象和bytes对象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互转化。
  

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

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

通过input()解析用户的输入
  Python 3改进了input()函数,这样该函数就会总是将用户的输入存储为str对象。在Python2中,为了避免读取非字符串类型会发生的一些危险行为,不得不使用raw_input()代替input()。
  Python 2.x
  

Python 2.7.6  
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
  
Type "help", "copyright", "credits" or "license" for more information.
  

  
>>> my_input = input('enter a number: ')
  

  
enter a number: 123
  

  
>>> type(my_input)
  
<type 'int'>
  

  
>>> my_input = raw_input('enter a number: ')
  

  
enter a number: 123
  

  
>>> type(my_input)
  
<type 'str'>
  

  Python 3.x
  

Python 3.4.1  
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
  
Type "help", "copyright", "credits" or "license" for more information.
  

  
>>> my_input = input('enter a number: ')
  
enter a number: 123
  
>>> type(my_input)
  
<class 'str'>
  

next()函数和.next()方法
  next() 返回迭代器的下一个项目。由于会经常用到next()(.next())函数(方法),所以还要提到另一个语法改动(实现方面也做了改动):在Python2.7.5中,函数形式和方法形式都可以使用,而在Python3中,只能使用next()函数(试图调用.next()方法会触发AttributeError)。
  Python 2.x
  

>>> my_generator = (letter for letter in 'abcdefg')  
>>> next(my_generator)
  
'a'
  
>>> my_generator.next()
  
'b'
  

  Python 3.x
  

In [36]: my_generator = (letter for letter in 'abcdefg')  ...:
  

  
In [37]: next(my_generator)
  ...:
  
Out[37]: 'a'
  

  
In [38]: my_generator.next()
  ...:
  
---------------------------------------------------------------------------
  
AttributeError                            Traceback (most recent call last)
  
<ipython-input-38-0ac0f88aeec6> in <module>()
  
----> 1 my_generator.next()
  

  
AttributeError: 'generator' object has no attribute 'next'
  

map、filter 和 reduce
  map() 会根据提供的函数对指定序列做映射。第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
  map() 函数语法:

  map(function, iterable, ...)

  参数

  function -- 函数,有两个参数
  iterable -- 一个或多个序列

  filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
  filter() 方法的语法:

  filter(function, iterable)

  参数

  function -- 判断函数。
  iterable -- 可迭代对象。

  这三个函数号称是函数式编程的代表。在Python3.x和Python2.x中也有了很大的差异。首先我们先简单的在 Python2.x 的交互下输入 map 和 filter,看到它们两者的类型是 built-in function(内置函数):
  

>>> map  
<built-in function map>
  
>>> filter
  
<built-in function filter>
  
>>>
  

  它们输出的结果类型都是列表:
  

>>> map(lambda x:x *2, [1,2,3])  
[2, 4, 6]
  
>>> filter(lambda x:x %2 ==0,range(10))
  
[0, 2, 4, 6, 8]
  
>>>
  

  Python 3.x中它们却不是这个样子了:
  

>>> map  
<class 'map'>
  
>>> map(lambda x:x *2, [1,2,3])
  
<map at 0x10d7e32e8>
  
>>> filter
  
<class 'filter'>
  
>>> filter(lambda x:x % 2 == 0, range(10))
  
<filter object at 0x10d8bd3c8>
  
>>>
  

  首先它们从函数变成了类,其次,它们的返回结果也从当初的列表成了一个可迭代的对象, 我们尝试用 next 函数来进行手工迭代:
  

>>> f =filter(lambda x:x %2 ==0, range(10))  
>>> next(f)
  
0
  
>>> next(f)
  
2
  
>>> next(f)
  
4
  
>>> next(f)
  
6
  

  对于比较高端的 reduce 函数,它在 Python 3.x 中已经不属于 built-in 了,被挪到 functools 模块当中。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-546749-1-1.html 上篇帖子: Python习题 下篇帖子: 关于 Python3 的编码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表