首页 > 编程知识 正文

简述Python2.x和Python3.x的区别,python3x和python2x唯一的区别就是print

时间:2023-05-06 03:28:15 阅读:259608 作者:1959

Python2.x和Python3.x的主要区别 print函数

print 语法的变化可能是最广为人知的了,但是仍值得一提的是: Python 2 的 print 声明已经被 print() 函数取代了,这意味着我们必须包装我们想打印在小括号中的对象。
Python 2 不具有额外的小括号问题。但对比一下,如果我们按照 Python 2 的方式不使用小括号调用 print 函数,Python 3 将抛出一个语法异常(SyntaxError)。
Python2

import platformprint 'Python', python_version()print 'Hello, World!'print "text", ; print 'print more text on the same line'

结果:
Python 2.7.5
Hello, World!
text print more text on the same line

Python3

import platformprint('Python', python_version())print('Hello, World!')print("some text,", end="") print(' print more text on the same line')

结果:
Python 3.5.1
Hello, World!
some text, print more text on the same line
print more text on the same line

整除

python3的版本变化中,整数计算可以说是很大的并且可能在移植过程中造成很大危险,比如:

你在 Python 2 上执行 Python 3 的代码。因为这个整除的变化表现在它会被忽视(即它不会抛出语法异常)

Python2

print '3 / 2 =', 3 / 2print '3 // 2 =', 3 // 2print '3 / 2.0 =', 3 / 2.0print '3 // 2.0 =', 3 // 2.0

结果:
3 / 2 = 1
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

Python3

print('3 / 2 =', 3 / 2)print('3 // 2 =', 3 // 2)print('3 / 2.0 =', 3 / 2.0)print('3 // 2.0 =', 3 // 2.0)

结果:
3 / 2 = 1.5
3 // 2 = 1
3 / 2.0 = 1.5
3 // 2.0 = 1.0

Unicode

Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。
现在, 在 Python 3,我们最终有了 Unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。
由于 Python3.X 源码文件默认使用utf-8编码,这就使得以下代码是合法的

Python3

中国 = 'china'print(中国)

结果:
china

Python2

str = "我爱北京天安门"print 'str'

结果
‘xe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8’

xrange

在 Python 2 中 xrange() 创建迭代对象的用法是非常流行的。比如: for 循环或者是列表/集合/字典推导式。
这个表现十分像生成器(比如。“惰性求值”)。但是这个 xrange-iterable 是无穷的,意味着你可以无限遍历。
由于它的惰性求值,如果你不得仅仅不遍历它一次,xrange() 函数 比 range() 更快(比如 for 循环)。尽管如此,对比迭代一次,不建议你重复迭代多次,因为生成器每次都从头开始。
在 Python 3 中,range() 是像 xrange() 那样实现以至于一个专门的 xrange() 函数都不再存在(在 Python 3 中 xrange() 会抛出命名异常)。

import timeitn = 10000def test_range(n): return for i in range(n): passdef test_xrange(n): for i in xrange(n): pass

Python2

import platformprint 'Python', python_version()print 'ntiming range()'%timeit test_range(n)print 'nntiming xrange()'%timeit test_xrange(n)

结果:
Python 2.7.5
timing range()
1000 loops, best of 3: 433 µs per loop
timing xrange()
1000 loops, best of 3: 350 µs per loop

Python3

import platformprint('Python', python_version())print('ntiming range()')%timeit test_range(n)

结果:
Python 3.6.4
timing range()
1000 loops, best of 3: 520 µs per loop

不等运算符 Python2.x中不等于有两种写法!=和<>Python3.x中去掉了<>,只有!=一种写法 数据类型 Python3.x去除了long类型,现在只有一种整形——int,但它的行为就像2.x中long新增了bytes类型,对应于2.x的八位串dict的.keys()、.items和.values()方法返回迭代器,而之前的iterkeys()等函数都被废弃。同时去掉的还有dict.has_key(),用in来代替它 异常

在 Python 3 中处理异常也轻微的改变了,在 Python 3 中我们现在使用 as 作为关键词。
捕获异常的语法由 except exc, var 改为 except exc as var。
使用语法except (exc1, exc2) as var可以同时捕获多种类别的异常。 Python 2.6已经支持这两种语法。

在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。

在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理

Python2

import platformprint 'Python', python_version()try: let_us_cause_a_NameErrorexcept NameError, err: print err, '--> our error message'

结果:
Python 2.7.5
name ‘let_us_cause_a_NameError’ is not defined —> our error message

Python3

import platformprint('Python', python_version())try: let_us_cause_a_NameErrorexcept NameError as err: print(err, '--> our error message')

结果:
Python 3.6.4
name ‘let_us_cause_a_NameError’ is not defined —> our error message

通过input()解析用户的输入

幸运的是,在 Python 3 中已经解决了把用户的输入存储为一个 str 对象的问题。为了避免在 Python 2 中的读取非字符串类型的危险行为,我们不得不使用 raw_input() 代替。

返回可迭代对象,而不是列表

如果在 xrange 章节看到的,现在在 Python 3 中一些方法和函数返回迭代对象 — 代替 Python 2 中的列表
因为我们通常那些遍历只有一次,我认为这个改变对节约内存很有意义。尽管如此,它也是可能的,相对于生成器 —- 如需要遍历多次。它是不那么高效的。
而对于那些情况下,我们真正需要的是列表对象,我们可以通过 list() 函数简单的把迭代对象转换成一个列表。

Python2

import platformprint 'Python',python_version()print range(3)print type(range(3))

结果:
Python 2.7.5
[0, 1, 2]
< type ‘list’>

Python3

import platformprint('Python', python_version())print(range(3))print(type(range(3)))print(list(range(3)))

结果:
Python 3.6.4
range(0, 3)
< class ‘range’>
[0, 1, 2]

在Python3中一些经常使用到的不再返回列表的函数和方法:

zip()map()filter()dictionary`s.keys() methoddictionary`s.values() method

dictionary`s.items() method

For循环变量和全局命名空间泄漏

在 Python 3.x 中 for 循环变量不会再导致命名空间泄漏。
在 Python 3.x 中做了一个改变,在 What’s New In Python 3.0 中有如下描述:
“列表推导不再支持 [… for var in item1, item2, …] 这样的语法。使用 [… for var in (item1, item2, …)] 代替。也需要提醒的是列表推导有不同的语义: 他们关闭了在 list() 构造器中的生成器表达式的语法糖, 并且特别是循环控制变量不再泄漏进周围的作用范围域.”

Python2

import platformprint 'Python', python_version()i = 1print 'before: i =', iprint 'comprehension: ', [i for i in range(5)]print 'after: i =', i

结果:
Python 2.7.5
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 4

Python3

import platformprint('Python', python_version())i = 1print('before: i =', i)print('comprehension:', [i for i in range(5)])print('after: i =', i)

结果:
Python 3.6.4
before: i = 1
comprehension: [0, 1, 2, 3, 4]
after: i = 1

特别声明
在上述代码在Python3.6和Python2.7中编译成功,其它环境自行测试

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。