python 3.x 与2.x的区别

前言

  保持学习的态度,学一门动态语言其实是很早以前的就准备要做的事情,当时还在纠结python与ruby。现在不单单是要学python,还在考虑用它做点什么,这些等后续再说吧,因为看的是python2.x的书籍。用的是python 3.7.所以先把两者的区别记录一下,仅限于基础。

python3.x 与2.x的区别

1.print

print语句没有了,取而代之的是print()函数。

py 2.x:

print "wyl" #语句
print("wyl") 

py 3.x:

>> print("wyl")
wyl
>>> print 'wyl'
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('wyl')?

2.Unicode

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

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

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

py 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'

py 3.x

>>> str='王延领那小子真帅'
>>> str
'王延领那小子真帅'
>>> 

 3.除法运算 

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

首先来说/除法:

在python 2.x中/除法就跟我们熟悉的大多数语言,比如Java啊C#啊差不多,取整,把小数部分完全忽略掉。

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

py 2.x

>>> 1/2
0
>>> 

py 3.x

>>> 1/2
0.5
>>>

第二种//除法:

这种除法叫做floor除法,py2.x与py3.x相同

 py2.x py3.x

>>> 1//2
0
>>> 

4.异常

在 py3.x 中我们现在使用 as 作为关键词,而非‘,’

所以异常都从 BaseException继承,并删除了StardardError 

去除了异常类的序列行为和.message属性 

用 raise Exception(args)代替 raise Exception, args语法 

捕获异常的语法改变,引入了as关键字来标识异常实例

py3.0:

>>> try:
  1/0
except Exception , err:
  print err
  
SyntaxError: invalid syntax
>>> 
#正确的写法
>>> try:
  1/0
except Exception as err:
  print(err)

  
division by zero
>>> 

5.xrange

xrange() 改名为range(),要想使用range()获得一个list,必须显式调用: 

py 2.x

>>> range(1,10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

py3.x

>>> range(10)
range(0, 10)
>>> 

py3.x 如果想使用range(),可以结合list

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 

 6.八进制

python 八进制不能0开头而是以0o开头

py 3.x

>>> 0101
SyntaxError: invalid token
>>> 0o101
65
>>> 

7.不等运算符

不等运算py3.x只有“!=”,“<>”已被移除

py3.x

>>> 1!=3
True
>>> 1<>3
SyntaxError: invalid syntax
>>> 

8.去掉了repr表达式``

py3.x

>>> s=`wyl`
SyntaxError: invalid syntax
>>> s='wyl'
>>> repr(s)
"'wyl'"

9.多个模块被改名(根据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()函数。 Python 2.6已经支援exec()函数。

10.数据类型

py 3.x

1>去掉了long

2>新增了bytes类型,对应于2.X版本的八位串

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

11.面向对象

1>引入抽象基类(Abstraact Base Classes,ABCs)

2>容器类和迭代器类被ABCs化,所以cellections模块里的类型比Py2.x多了很多

>>> import collections
>>> print('\n'.join(dir(collections)))
AsyncGenerator
AsyncIterable
AsyncIterator
Awaitable
ByteString
Callable
ChainMap
Collection
Container
Coroutine
Counter
Generator
Hashable
ItemsView
Iterable
Iterator
KeysView
Mapping
MappingView
MutableMapping
MutableSequence
MutableSet
OrderedDict
Reversible
Sequence
Set
Sized
UserDict
UserList
UserString
ValuesView
_Link
_OrderedDictItemsView
_OrderedDictKeysView
_OrderedDictValuesView
__all__
__builtins__
__cached__
__doc__
__file__
__loader__
__name__
__package__
__path__
__spec__
_chain
_collections_abc
_count_elements
_eq
_heapq
_iskeyword
_itemgetter
_nt_itemgetters
_proxy
_recursive_repr
_repeat
_starmap
_sys
abc
defaultdict
deque
namedtuple
>>> 

3>迭代器的next()方法改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法 

4>增加了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便。

12.模块

1>移除了cPickle模块,可以使用pickle模块代替。最终我们将会有一个透明高效的模块。 

2>移除了imageop模块 

3>移除了 audiodev, Bastion, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2,  rexec, sets, sha, stringold, strop, sunaudiodev, timing和xmllib模块 

4>移除了bsddb模块(单独发布,可以从http://www.jcea.es/programacion/pybsddb.htm获取

5>移除了new模块 

6>os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下 

7>tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是 tokenize.tokenize() 

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏owent

AC自动机

整个程序的算法思想是看别人的ACM的blog看懂的,感觉确实和KMP很像。但是代码呢就比较工程化一点。顺便回忆了一把ACM的感觉。

481
来自专栏一个会写诗的程序员的博客

React极简教程: Hello,World!React简史React安装Hello,World

A programming paradigm is a fundamental style of computer programming. There are...

691
来自专栏光变

你所不知道的Java之Integer

以下内容为作者辛苦原创,版权归作者所有,如转载演绎请在“光变”微信公众号留言申请,转载文章请在开始处显著标明出处。

1160
来自专栏HTML5学堂

为什么不要在 JavaScript 中使用位操作符?

如果你的第一门编程语言不是 JavaScript,而是 C++ 或 Java,那么一开始你大概会看不惯 JavaScript 的数字类型。在 JavaScrip...

34510
来自专栏LeoXu的博客

NDK学习笔记(二)使用JNI同原生代码通信 原

任何使用JNI的操作都需要两次或者三次函数调用,因此要实现大量的原生方法并让它们同Java类保持同步很容易编程一件非常艰辛的工作。

723
来自专栏小樱的经验随笔

51 Nod 1028 大数乘法 V2【Java大数乱搞】

1028 大数乘法 V2 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出2个大整数A,B,计算A*B的结果。 Inpu...

2504
来自专栏Google Dart

Dart语言指南(二) 顶

Dart是一种面向对象的语言 包含类和基于 mixin 的继承两部分。每个对象是一个类的实例, 并且 Object.是所有类的父类。 基于 mixin 的继承指...

361
来自专栏有趣的Python

慕课网-C++远征之多态篇(下)-学习笔记

RTTI(运行时类型识别) Run-Time Type Identification typeid < - > dynamic_cast 例子: class F...

3274
来自专栏jeremy的技术点滴

py3_cookbook_notes_01

2878
来自专栏技术之路

Windows数据类型

 WORD:16位无符号整形数据 DWORD:32字节无符号整型数据(DWORD32) DWORD64:64字节无符号整型数据 INT:32位有符号整型数据类型...

1606

扫描关注云+社区