Python2还是Python3?

前不久学了一下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型数据。
  Python2还是Python3?_第1张图片
Python2还是Python3?_第2张图片

  • 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 *的语法从此至允许在模块层次上导入,而不再支持在函数内部使用





你可能感兴趣的:(Python)