前不久学了一下Python2.7.5,最近看的CS50的课程介绍了Python3
发觉Python2.x版本与Python3.x版本还是存在很大差异。去了官网,把2.x与3.0的主要区别找了一下,尝试着作了翻译,有不理解的地方、有不对的地方,就等着以后学习途中不断更正和补充吧!
1.区别在哪里?
简单的说:Python 2.x 是遗留产物,Python 3.x是现在且将来的语言。
Python3.0发布于2008年,Python2.7的最终版2.x发行与2010的中期,同时还发行了这个版本的“遗言”【end-of-life release】2.x版本不会再有新的主要的版本发布。因为3.x版本正在紧锣密鼓地研发中,并在五年内发布了许多稳定的版本,包括2012年的3.3;2014的3.4;3.5 in 2015, and 3.6 in 2016.
这意味着所有现在的标准库的升级,都只在Python3.x上进行。
Guido van Rossum(Python语言的原始创建者)决定清理Python 2.x,而更少地考虑向后兼容性。 最大的改进是更好地支持Unicode(默认情况下,所有文本字符串都是Unicode)以及saner字节/ Unicode seperation。
除此之外,关于核心语言的部分也有不少改变(如print 和
exec?,
integers using floor division )调整得更加容易,更加适合新学者。也与语言的其他部分更加衔接。不整齐、晦涩的部分已被移除(例如,class都为新形式了,range()函数返回一个高效的内存迭代器(a memory efficient iterable ),而不是2.x的列表)
2.Python 3.0新增了什么?
https://docs.python.org/3/whatsnew/3.0.html#what-s-new-in-python-3-0
a.Print函数
Old: print "The answer is", 2*2
New: print("The answer is", 2*2)
Old: print x, # Trailing comma suppresses newline 以前逗号结尾,意味着不要创建新行。
New: print(x, end=" ") # Appends a space instead of a newline 使用 end=" " 告诉python不要换行
Old: print # Prints a newline
New: print() # You must call the function! 调用函数去创建新行
Old: print >>sys.stderr, "fatal error"
New: print("fatal error", file=sys.stderr)
Old: print (x, y) # prints repr((x, y)) #repr()
New: print((x, y)) # Not the same as print(x, y)!
//repr()是?
Python 有办法将任意值转为字符串:将它传入repr() 或str() 函数。
函数str() 用于将值转化为适于人阅读的形式,而repr() 转化为供
解释器读取的形式(如果没有等价的语法,则会发生SyntaxError 异常) 某对象没有适于人阅读的解释形式的话, str() 会返回与repr()等同的值。很多类型,诸如数值或链表、字典这样的结构,针对各函数都有着统一的解读方式。字符串和浮点数,有着独特的解读方式。
可以在分隔符之间客制化输出
print("There are <", 2**32, "> possibilities!", sep="")
输出:There are <4294967296> possibilities!
NOTE:
1.Python3的print()函数不支持原有的print()中的空格特性。
举个例子,
在 Python 2.x, print "A\n", "B" 会输出 "A\nB\n"; 【中间的转义字符与B之间有一空格,print自己处理了,消除了该空格】
但是在Python 3.0, print("A\n", "B") 会输出 "A\n B\n".【在P3中,这种特性没有了,变成了原来有空格,那么就有空格】
2.用print()代替print语句吧!
b.views and iterators instead of lists
一些常用的API不再返回lists了:
- dict 方法中的dict.keys(),dict.items(),dict.values() 返回 "views"??而不返回lists.举个例子:这样行不通了:k = d.keys(); k.sort(). Use k = sorted(d) instead ( Python 2.5 可行).
- 同样的,不再支持方法如,dict.iterkeys(), dict.iteritems(),dict.itervalues()
map()
filter()返回迭代器iterators
- range()取替了原有的xrange()
- zip()现在返回一个迭代器
c.运算操作符
- 类似于1 < '', 0 > None or len <= len的运算操作符,不再有效。如None < None会出现TypeError而不是返回False.这样导致的结果就是,排列一个异构的列表变得不再可行--因为所有元素都需要与其他元素可比。【即比较需要同类型】
- cmp()函数不再支持【--cmp()--也是】用__lt()__排序;__eq()__用来取替__hash()__
d.整数
- PEP237:long 型 更名为 int 这意味着只有一种内置的整型类型,叫 int;不过它跟原有的long类型表现得更像
- PEP238:像1/2的表示形式,返回float型数据;用1//2这样的表示形式,返回int型数据。
- long型整数的repr()函数不再包含L结尾。
- 八进制数,不再是0720【以0开头的形式】,而更换为0o720的形式
e.Text Vs. Data Instead Of Unicode Vs. 8-bit
- Python3.0使用text和 二进制 数据取替原有的unicode字符串和8位字符串。All text is unicode;然而,编译为unicode表现为二进制数据。
- 不可再用u"...."代表unicode text,必须用b"...."代表binary data
- 由于str 和 bytes 类型不能再混合使用了,所以你必须明确地在它们之间转换。用str.encode()从str变成bytes。用bytesdecode()从bytes变成str.同时可以用bytes(s,encoding=) 或者str(b,encoding)
- 像str,bytes类型也是不可变的。有一个可变的类型叫bytearray,几乎所有的API都接受bytes和bytearray。可变的API是基于collections.MutableSequence.
- 所有raw string里面的\会被逐个解析。这意味着原来'\u'可以从raw strings中跳出的行为不再被接受。例如,
r'\u20ac'
在 Python 3.0是一个六个字符的字符串;而在2.6中,ur'\u20ac'是一个
“euro”字符。
- PEP 3120:默认的soure encoding是UTF-8
- 原有的
StringIO
还有 cStringIO模块没有了,取而代之的是,import io module和分别使用io.StringIO用于text或者io.BytesIO用于data
d.新语法
- PEP3104:nonlocal的声明。使用nonlocal x,你可以直接指派一个外部变量(不是non-global)
- PEP 3132: 拓展的可迭代的拆包。 a, b, *rest = some_sequence. 是可以的。又甚至, *rest, a = stuff.rest通常是要(空)列表
(a, *rest, b) = range(5)
结果:a to 0, b to 4, and rest to [1, 2, 3].
- 新的八进制,如0o720 (already in 2.6). 原有的八进制 (0720) 已经取消了.
- 新的二进制,如0b1010 (already in 2.6),现在有新的内置函数bin()
- bytes也有了新的内置函数bytes()
- metaclass语法
- 原来的metaclass
class C:
__metaclass__ = M
...
现为:
class C(metaclass=M):
...
原有的__metaclass__不再支持
- 去除元组参数解包。不能def(a, (b, c)):pass这样定义函数了
- 去除了引号‘’而改用repr()
- 去除了<>而改用!=
- 去除了关键字:exec(),其不再为关键字,而是函数了
- 整型数据不支持l或L结尾
- 字符串数据不再支持u或U开头
- from module import *的语法从此至允许在模块层次上导入,而不再支持在函数内部使用