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

最近涨粉涨的厉害啊,那天看刚破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

原文发布于微信公众号 - 机器学习和数学(ML_And_Maths)

原文发表时间:2017-11-25

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术点滴

编译器构造

编译器构造 一、 编译器简介 前面谈到静态链接器构造的基本流程,最后提到所构造的链接器若要能正常工作的前提是需要构造一个能生成符合链接器输入文件格式的编译器,本...

2378
来自专栏转载gongluck的CSDN博客

C++中_onexit()用法简述

引问:main 主函数执行完毕后,是否可能会再执行一段代码? 答案:可以,可以用_onexit 注册一个函数,它会在main 之后执行。 知识了解: (1)...

3438
来自专栏SDNLAB

【一课专栏】解构2 - 明察YangInstanceIdentifier

屈原《离骚》中云:“路漫漫其修远兮,吾将上下而求索”,其实,学习软件编程,学习SDN技术也是一个路漫漫,上下求索的过程。

2342
来自专栏linux系统运维

sed工具

1654
来自专栏码云1024

c++模板与泛型编程

2913
来自专栏Pythonista

python中的函数

初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变...

1364
来自专栏Brian

Python进阶教程(二)

概述 在上一篇博客中,我们介绍了Python进阶教程(一),还有一些新的技巧没有翻译完,我们下面来继续我们的翻译。 Intermediate Python 中译...

4508
来自专栏java一日一条

Java 程序优化:字符串操作、基本运算方法等优化策略

字符串对象或者其等价对象 (如 char 数组),在内存中总是占据最大的空间块,因此如何高效地处理字符串,是提高系统整体性能的关键。

661
来自专栏生信宝典

Python学习教程(三)

函数操作 函数是重用的程序段。它们允许你给一块语句一个名称,然后你可以在你的程序的任何地方使用这个名称任意多次地运行这个语句块。这被称为 调用 函数。我们已经使...

2179
来自专栏逆向技术

逆向知识第七讲,三目运算符在汇编中的表现形式,以及编译器优化方式

                  逆向知识第七讲,三目运算符在汇编中的表现形式 一丶编译器优化方式 首先说一下编译器优化方式. 1.常量折叠 2.常量传播 3...

2548

扫码关注云+社区

领取腾讯云代金券