前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[编程经验]python2和python3的区别总结

[编程经验]python2和python3的区别总结

作者头像
用户1622570
发布2018-04-11 16:09:44
9130
发布2018-04-11 16:09:44
举报

最近涨粉涨的厉害啊,那天看刚破800,今天打开又有32个新粉丝,有点开心,哈哈哈。说实话,看的人多的话,是我坚持下去最大的动力。。。

= = = print(" 我是分割线") = = =

1. print函数

在py2中print是一个语法结构,而在py3中print是一个函数,

print(value, ..., sep=' ', end='\n',file=sys.stdout, flush=False)

file可以是文件,也就是可以把打印的东西直接输出到文件,这个就很方便,我经常用。比如:

a = range(10)

out_file = open(“print_test_file.txt”, ‘w’)

for x in a:

print(x,sep=’ ‘, end = “\n”, file=out_file)

2. 编码问题

在py2中,编码问题是个大问题,可以单独拉出来讲一次。这里简单说一下,在py2中,把字符串分为Unicode和str两种类型。

>>> s1 = 'machine learning'

>>> type(s1)

<type 'str'>

>>> s2 = u'machine learning'

>>> type(s2)

<type 'unicode'>

>>> s3 = '中国'

>>> type(s3)

<type 'str'>

>>> s3

'\xd6\xd0\xb9\xfa'

>>> s4 = u'中国'

>>> type(s4)

<type 'unicode'>

py3中没有Unicode,他们都是字符串

>>> s1 = 'machine learning'

>>> type(s1)

<class 'str'>

>>>

>>> s2 = u'machine learning'

>>> type(s2)

<class 'str'>

>>> s3 = '中国'

>>> type(s3)

<class 'str'>

>>> s3

'中国'

当我们需要把py2中的unicode字符输出到文件或者传输到网络上,需要先把unicode字符转换为str类型,py2的encode方法就是编码unicode字符到指定字符类型,因为py2默认编码方式为unicode,所以当使用encode方式时,传入的参数就是目标编码格式,比如utf-8或者gbk等,当py2把一个字符存入到文件的时候,首先会判断字符的类型,如果是str,则直接存入文件,如果是Unicode类型,则先要转换为str类型,就需要encode方法,这时候默认的是ascii字符,然后ascii字符是不包括中文的,所以会引发UnicodeEncodeError。而decode是把str转换为unicode字符,刚说了py2的默认格式是unicode,所以decode的时候,需要传入的参数名字就是字符的现在的编码的编码方式,比如utf-8或者gbk,当传入的参数名字不是现在编码方式的时候,就会引发UnicodeDecodeError。

好了,这是py2中的坑,这些问题在py3中统统得到了解决。py3中没有Unicode和str的区别,Unicode字符也会当做utf-8来看待,我们知道utf-8是包括中文的,所以当把中文字符存入文件的时候,就不会发生编码问题。这也是为什么当代码中包括中文的时候,不需要在第一行显式的指定编码格式,# coding:utf-8.

3. 除法问题

在py2中两个整数除法的得到的是0,要得到浮点数,则除数或者被除数有一个是浮点数,而在py3中,整数相除可以得到浮点数。但是如果要在py3中整数相除也得到0的话,就要使用//,而不是/。

# python2

print 1/2

>>> 0

print 1/2.

>>>0.5

# python3

print(1/2)

>>> 0.5

print(1//2)

>>> 0

4. nonlocal 语句

py3 新加入的,可以指定非全局变量。

5. 输入函数

在py2中输入函数是raw_input和input两个函数, 而py3中删除了raw_inpus, 只使用input

6. I/O方法,xreadlines()

在py2中,一个文件对象有xreadlines()方法,返回一个迭代器,每次只读取一行数据,可以使用for循环输出结果。在py3中删除了这个方法。

7 cPickle

py2中的cPickle被移除,py3中被pickle代替。

8. urllib

py2中存在两个包,urllib和urllib2,是爬虫经常用的模块,py3中统一到了urllib中。并且py2中的urlparse模块被统一到了urllib.parse模块下。

9. 包内的相对导入

这个挺重要的一个改变,需要掌握一下。在py2中,假设你写了三个.py的模块,比如

--first.py

--second.py

--third.py

你想在3.py中导入1和2,可以直接

import first

import second

因为py2的解释器会首先在当前目录下搜索first和second,没有找到才会去python的路径中去找。而在py3中就不行,你需要这样做

from . import first

from . import second

因为py3会直接在python 的路径中去搜索,如果first.py和second.py在父目录当中,则需要这样

from .. import first

from .. import second

多加一个点,就这样,是不是很简单。

10. 新式的8进制变量,修改了oct函数,oct是返回一个整形或者长整形的8进制数。

py2可以这样

>>> 0666

438

>>> oct(438)

‘0666’

在py3中

>>> 0666

SyntaxError: invalid token

>>> 0o666

438

>>> oct(438)

‘0o666’

11. 新的super方法,可以不传参数

>>> class A(object):

def__init__(self, a):

print("A",a)

>>> class B(A):

def__init__(self, a):

super().__init__(a)

>>> B(8)

A 8

<__main__.B object at0x0000018FE6D0A198>

12. dict的.keys(),items(),values()方法返回一个迭代器,iterkeys(),has_key()废弃。

13. python3引入抽象基类

Abstract Base Classes, ABCs

14. 迭代器

迭代器的next()方法改名为__next__,增加了内置函数next()

15 增加装饰器

@abstractmethod 和@anstractproperty两个新装饰器,编写抽象方法更加方便。

16 移除了imageop,audiodev, Bastion, bsddb,bsddb185, exceptions,linuxaudiodev, md5, MimeWrite, mimify, popen2, rexec, sets, sha, strinold,strop, sunaudiodev, timing, xmlib, new模块

这些是自带的模块,在py3中还移除了一些第三方模块。

17. os模块中的os.tmpnam()和os.tmpfile()移到tmpfile模块中

18. http

在py2中相关的模块由httplib,Cookie, cookielib, BaseHTTPServer, SimpleHTTPServer, CGIHttpServer,在py3中统一到了http模块中,变成http.client,http.cookies, http.cookiejar, http.server.

19. urllib

py2中存在两个包,urllib和urllib2,是爬虫经常用的模块,py3中统一到了urllib中。并且py2中的urlparse模块被统一到了urllib.parse模块下。

20. 包内的相对导入

这个挺重要的一个改变,需要掌握一下。在py2中,假设你写了三个.py的模块,比如

--first.py

--second.py

--third.py

你想在3.py中导入1和2,可以直接

import first

import second

因为py2的解释器会首先在当前目录下搜索first和second,没有找到才会去python的路径中去找。而在py3中就不行,你需要这样做

from . import first

from . import second

因为py3会直接在python 的路径中去搜索,如果first.py和second.py在父目录当中,则需要这样

from .. import first

from .. import second

多加一个点,就这样,是不是很简单。

先这样吧, 后面遇到新内容会继续补充,同时欢迎大家补充~~

参考:

1. http://m.blog.csdn.net/pipisorry/article/details/22107553

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-11-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习和数学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档