python 2和3的区别 和 Python 3 有哪些主要区别

1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 class Foobar(object): pass 显式地子类化object3. 原来1/2(两个整数相除)结果是0,现在是0.5了4. 新的字符串格式化方法format取代%5. raw_input重命名为input6. xrange重命名为range7. !=取代 &
& 8. long重命名为int9. except Exception, e变成except (Exception) as e10. exec变成函数其他还有很多。。。
我来更正及评论下.&br&&
1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')&br&但是 python2.6+ 可以使用 from __future__ import print_function 来实现相同功能&br&&
2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 class Foobar(object): pass 显式地子类化object&br&但是最好还是加上. 主要区别在于 old-style 是 classtype 类型而 new-style 是 type类型&br&&
3. 原来1/2(两个整数相除)结果是0,现在是0.5了&br&python 2.2+ 以上都可以使用 from __future__ import division 实现改特性, 同时注意 // 取代了之前的 / 运算&br&&
4. 新的字符串格式化方法format取代%&br&错误, 从 python2.6+ 开始已经在str和unicode中有该方法, 同时 python3依然支持 % 算符&br&&
6. xrange重命名为range&br&同时更改的还有一系列内置函数及方法, 都返回迭代器对象, 而不是列表或者 元组, 比如 filter, map, dict.items 等&br&&
&br&python2 也很少有人用
所以不算什么修改&br&&
8. long重命名为int&br&不完全对, python3 彻底废弃了 long+int 双整数实现的方法, 统一为 int , 支持高精度整数运算.&br&&
9. except Exception, e变成except (Exception) as e&br&只有 python2.5 及以下版本不支持该语法. python2.6 是支持的. 不算新东西&br&&
10. exec变成函数&br&类似 print() 的变化, 之前是语句.&br&&br&简单补充下&br&* 主要是类库的变化, 组织结构变了些. 但功能没变. urlparse - &
urllib.parse 这样的变化&br&* 最核心的变化它没有说, 对 bytes 和 原生 UNICODE 字符串的支持, 删除了 unicode 对象, str 为原生 unicode 字符串, bytes 替代了之前的 str 这个是最核心的.&br&* 其它... 貌似不怎么重要了.
我来更正及评论下. & 1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc') 但是 python2.6+ 可以使用 from __future__ import print_function 来实现相同功能 & 2. 在Python 3中,没有旧式类,只有新式类,也就是说不用再像这样 cla…
看到大家都没说,我来补充个很重要的:&br&import在Python3中默认使用绝对路径导入了,这是因为相对路径的导入是具有歧义的&br&比如文件夹结构:&br&&ul&&li&test/&/li&&ul&&li&main.py&/li&&li&lib/&/li&&ul&&li&__init__.py&/li&&li&some_func.py&/li&&li&other_func.py&/li&&/ul&&/ul&&/ul&如果运行的是main.py文件,python会将当前cwd作为PYTHONPATH变量&br&在main.py中,通过&br&&blockquote&import lib.some_func&/blockquote&或者&br&&blockquote&from lib import some_func&br&&/blockquote&在some_func.py中,如果使用import other_func是会报错的,建议使用&br&&blockquote&from lib import other_func&/blockquote&强行使用相对导入需要from .other_func import *&br&所以说从Python2迁移到Python3,会看到一个大型项目原有的代码结构是否良好,如果之前你的代码到处都是相对导入。。。啧啧&br&更详细的参见:&a href=&///?target=https%3A//www.python.org/dev/peps/pep-0328/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PEP 0328 -- Imports: Multi-Line and Absolute/Relative&i class=&icon-external&&&/i&&/a&&br&&br&详细的2to3迁移事项可以参考2to3库的文档:&a href=&///?target=https%3A//docs.python.org/3/library/2to3.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&26.6. 2to3 - Automated Python 2 to 3 code translation&i class=&icon-external&&&/i&&/a&
能自动迁移的部分就不用人工了呗~
看到大家都没说,我来补充个很重要的: import在Python3中默认使用绝对路径导入了,这是因为相对路径的导入是具有歧义的 比如文件夹结构: test/main.pylib/__init__.pysome_func.pyother_func.py如果运行的是main.py文件,python会将当前cwd作为PYTHONPATH…
已有帐号?
无法登录?
社交帐号登录
Python, JavaScript, HTML5, iOS developerPython 2.x 与3.x 最本质的区别是什么?为什么从2.7直接出现3.1,3.2呢?最近在看Python
不是从2.7出现3.1,是从2.6.2.7是为了让Python平稳过度到3.X而发布的版本,加入了一些3.X的特性.主要区别有(个人观点,你可以到官方看它的说法)没有了经典类,全是新型类,就是class对象没有父类,那么就是从object继承而来的;print、exec从语句改为函数;还有就是str改为了unicode,就相当于2.X的unicode对象,2.X的str改为了bytes(这个要方便得多了,不像2.X要是编码出错,很不爽的).
为您推荐:
其他类似问题
扫描下载二维码Python3.x和Python2.x的区别介绍
字体:[ ] 类型:转载 时间:
python3.x与python2.x区别很大,这里搜索了一些相关内容,记录在此,供自己学习参考,有需要的朋友不妨看看
1.性能Py3.0运行 pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可以取得很好的优化结果。Py3.1性能比Py2.5慢15%,还有很大的提升空间。
2.编码Py3.X源码文件默认使用utf-8编码,这就使得以下代码是合法的:&&& &&& 中国 = 'china'&&& &&&print(中国)&&& china
3. 语法1)去除了&&,全部改用!=2)去除``,全部改用repr()3)关键词加入as 和with,还有True,False,None4)整型除法返回浮点数,要得到整型结果,请使用//5)加入nonlocal语句。使用noclocal x可以直接指派外围(非全局)变量6)去除print语句,加入print()函数实现相同的功能。同样的还有 exec语句,已经改为exec()函数&& 例如:&&&& 2.X: print "The answer is", 2*2&&&& 3.X: print("The answer is", 2*2)&&&& 2.X: print x,&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 使用逗号结尾禁止换行&&&& 3.X: print(x, end=" ")&&&&&&&&&&&&&&&&&&&& # 使用空格代替换行&&&& 2.X: print&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 输出新行&&&& 3.X: print()&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # 输出新行&&&& 2.X: print &&sys.stderr, "fatal error"&&&& 3.X: print("fatal error", file=sys.stderr)&&&& 2.X: print (x, y)&&&&&&&&&&&&&&&&&&&&&&&&& # 输出repr((x, y))&&&& 3.X: print((x, y))&&&&&&&&&&&&&&&&&&&&&&&& # 不同于print(x, y)!7)改变了顺序操作符的行为,例如x&y,当x和y类型不匹配时抛出TypeError而不是返回随即的 bool值 8)输入函数改变了,删除了raw_input,用input代替:&& 2.X:guess = int(raw_input('Enter an integer : ')) # 读取键盘输入的方法&& 3.X:guess = int(input('Enter an integer : '))
9)去除元组参数解包。不能def(a, (b, c)):pass这样定义函数了10)新式的8进制字变量,相应地修改了oct()函数。&& 2.X的方式如下:&&&& &&& 0666&&&& 438&&&& &&& oct(438)&&&& '0666'&& 3.X这样:&&&& &&& 0666&&&& SyntaxError: invalid token (&pyshell#63&, line 1)&&&& &&& 0o666&&&& 438&&&& &&& oct(438)&&&& '0o666'11)增加了 2进制字面量和bin()函数&&& &&& bin(438)&&& '0b'&&& &&& _438 = '0b'&&& &&& _438&&& '0b'12)扩展的可迭代解包。在Py3.X 里,a, b, *rest = seq和 *rest, a = seq都是合法的,只要求两点:rest是list对象和seq是可迭代的。13)新的super(),可以不再给super()传参数,&&& &&& class C(object):&&&&&&&&& def __init__(self, a):&&&&&&&&&&&& print('C', a)&&& &&& class D(C):&&&&&&&&& def __init(self, a):&&&&&&&&&&&& super().__init__(a) # 无参数调用super()&&& &&& D(8)&&& C 8&&& &__main__.D object at 0x00D7ED90&14)新的metaclass语法:&&& class Foo(*bases, **kwds):&&&&& pass15)支持class decorator。用法与函数decorator一样:&&& &&& def foo(cls_a):&&&&&&&&& def print_func(self):&&&&&&&&&&&& print('Hello, world!')&&&&&&&&& cls_a.print = print_func&&&&&&&&& return cls_a&&& &&& @foo&&& class C(object):&&&&& pass&&& &&& C().print()&&& Hello, world!class decorator可以用来玩玩狸猫换太子的大把戏。更多请参阅PEP 3129
4. 字符串和字节串1)现在字符串只有str一种类型,但它跟2.x版本的unicode几乎一样。2)关于字节串,请参阅“数据类型”的第2条目
5.数据类型1)Py3.X去除了long类型,现在只有一种整型——int,但它的行为就像2.X版本的long2)新增了bytes类型,对应于2.X版本的八位串,定义一个bytes字面量的方法如下:&&& &&& b = b'china'&&& &&& type(b)&&& &type 'bytes'&str对象和bytes对象可以使用.encode() (str -& bytes) or .decode() (bytes -& str)方法相互转化。&&& &&& s = b.decode()&&& &&& s&&& 'china'&&& &&& b1 = s.encode()&&& &&& b1&&& b'china'3)dict的.keys()、.items 和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有dict.has_key(),用 in替代它吧
6.面向对象1)引入抽象基类(Abstraact Base Classes,ABCs)。2)容器类和迭代器类被ABCs化,所以cellections模块里的类型比Py2.5多了很多。&&& &&& import collections&&& &&& print('\n'.join(dir(collections)))&&& Callable&&& Container&&& Hashable&&& ItemsView&&& Iterable&&& Iterator&&& KeysView&&& Mapping&&& MappingView&&& MutableMapping&&& MutableSequence&&& MutableSet&&& NamedTuple&&& Sequence&&& Set&&& Sized&&& ValuesView&&& __all__&&& __builtins__&&& __doc__&&& __file__&&& __name__&&& _abcoll&&& _itemgetter&&& _sys&&& defaultdict&&& deque另外,数值类型也被ABCs化。关于这两点,请参阅 PEP 3119和PEP 3141。3)迭代器的next()方法改名为__next__(),并增加内置函数next(),用以调用迭代器的__next__()方法4)增加了@abstractmethod和 @abstractproperty两个 decorator,编写抽象方法(属性)更加方便。
7.异常1)所以异常都从 BaseException继承,并删除了StardardError2)去除了异常类的序列行为和.message属性3)用 raise Exception(args)代替 raise Exception, args语法4)捕获异常的语法改变,引入了as关键字来标识异常实例,在Py2.5中:&&& &&& try:&&& ...&&& raise NotImplementedError('Error')&&& ... except NotImplementedError, error:
&&& ...&&& print error.message&&& ...&&& Error在Py3.0中:&&& &&& try:&&&&&&&&& raise NotImplementedError('Error')&&&&&&& except NotImplementedError as error: #注意这个 as&&&&&&&&& print(str(error))&&& Error5)异常链,因为__context__在3.0a1版本中没有实现
8.模块变动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模块(单独发布,可以从获取)5)移除了new模块6)os.tmpnam()和os.tmpfile()函数被移动到tmpfile模块下7)tokenize模块现在使用bytes工作。主要的入口点不再是generate_tokens,而是 tokenize.tokenize()
9.其它1)xrange() 改名为range(),要想使用range()获得一个list,必须显式调用:&&& &&& list(range(10))&&& [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]2)bytes对象不能hash,也不支持 b.lower()、b.strip()和b.split()方法,但对于后两者可以使用 b.strip(b' \n\t\r \f')和b.split(b' ‘)来达到相同目的3)zip()、map()和filter()都返回迭代器。而apply()、 callable()、coerce()、 execfile()、reduce()和reload()函数都被去除了
现在可以使用hasattr()来替换 callable(). hasattr()的语法如:hasattr(string, '__name__')
4)string.letters和相关的.lowercase和.uppercase被去除,请改用string.ascii_letters 等5)如果x & y的不能比较,抛出TypeError异常。2.x版本是返回伪随机布尔值的6)__getslice__系列成员被废弃。a[i:j]根据上下文转换为a.__getitem__(slice(I, j))或 __setitem__和__delitem__调用7)file类被废弃,在Py2.5中:&&& &&& file&&& &type 'file'&在Py3.X中:&&& &&& file&&& Traceback (most recent call last):&&& File "&pyshell#120&", line 1, in &module&&&&&&& file&&& NameError: name 'file' is not defined
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Python 2.7.x 和 3.x 版本的重要区别 | 程序师

我要回帖

更多关于 python 2 3 区别 的文章

 

随机推荐