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 条评论
登录 后参与评论

相关文章

来自专栏程序员宝库

一些我认为有用有趣的 JDK 方法

在学习JDK的源码过程中我遇到了一些有趣有用的方法,在此之前如果要使用这些工具方法,我首先会想到的是 commons-lang和 guava这样的语言扩展包,但...

2817
来自专栏有趣的Python

py编程技巧-1.1-如何在列表、字典、集合中根据条件筛选数据

所有代码先加这行解决中文乱码问题 # -*- coding: utf-8 -*- 版本区别注意: py2.7: xrange(); py3.x: ra...

3527
来自专栏磐创AI技术团队的专栏

Python开发的十个Tips,你知道几个?

下面是十个Python中很有用的贴士和技巧。其中一些是初学这门语言常常会犯的错误。

892
来自专栏我有一个梦想

3D游戏开发之UE4中的集合:TSet容器

好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集。 一、TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容...

21710
来自专栏逸鹏说道

Python3 与 C# 基础语法对比(List、Tuple、Dict专栏)

Python3 与 C# 基础语法对比(基础知识场):https://www.cnblogs.com/dotnetcrazy/p/9102030.html

23710
来自专栏python全栈布道师

2017年9月5日

2725
来自专栏desperate633

LeetCode 6. ZigZag Conversion分析代码

这道题就是要根据z字形遍历,我们模拟一遍过程可以发现遍历的规律,可以用循环解决,先遍历下去,又向上。然后重复这个步骤,向下,向上!

791
来自专栏于晓飞的专栏

Java 容器 接口

在开发中使用容器正常的流程是,首先根据需求确定使用何种容器模型,然后选择一个符合性能要求的容器实现类或者自己实现一个容器类。例如:

982
来自专栏null的专栏

设计模式——类图以及类与类之间的关系

    设计模式在程序设计上有着很重要的作用,使用设计模式可以使得代码更容易被理解,使得代码更规范,真正实现工程化。 一、用UML表示一个类 ? 类图一般是三行...

3624
来自专栏机器学习算法与Python学习

Python开发的十个Tips,你知道几个?

下面是十个Python中很有用的贴士和技巧。其中一些是初学这门语言常常会犯的错误。

781

扫码关注云+社区