前不久学了一下Python2.7.5,最近看的CS50的课程介绍了Python3

发觉Python2.x版本与Python3.x版本还是存在很大差异。去了官网,把2.x与3.0的主要区别找了一下,尝试着作了翻译,有不理解的地方、有不对的地方,就等着以后学习途中不断更正和补充吧!


1.区别在哪里?

简单的说:Python 2.x 是遗留产物,Python 3.x是现在且将来的语言。


这意味着所有现在的标准库的升级,都只在Python3.x上进行。




Guido van Rossum(Python语言的原始创建者)决定清理Python 2.x,而更少地考虑向后兼容性。 最大的改进是更好地支持Unicode(默认情况下,所有文本字符串都是Unicode)以及saner字节/ Unicode seperation。


exec?, integers using floor division




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() 函数。


解释器读取的形式(如果没有等价的语法,则会发生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.6 2.7区别 python2.7和3.5区别_字符串




python2.6 2.7区别 python2.7和3.5区别_ico_02



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