知行编程网知行编程网  2022-09-07 10:30 知行编程网 隐藏边栏  3 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于python2.x和3.x的区别有哪些的相关知识,包括python中index什么意思,以及python3.5和3.8有什么区别这些编程知识,希望对大家有参考作用。

python2.x和3.x有什么区别


Python2.x与3.x版本区别

Python 3.0 版本,通常称为 Python 3000,或简称 Py3k。这是对早期 Python 版本的一次重大升级。

为了不带来太多负担,Python 3.0 在设计时并未考虑向后兼容。

许多为早期 Python 版本设计的程序在 Python 3.0 上无法正常运行。

为了照顾现有程序,Python 2.6 作为过渡版本,基本使用 Python 2.x 的语法和库,同时考虑迁移到 Python 3.0,允许使用一些 Python 3.0 的语法和函数。

新的Python程式建议使用Python 3.0版本的语法。

除非执行环境无法安装 Python 3.0 或者程序本身使用了不支持 Python 3.0 的第三方库。目前不支持 Python 3.0 的第三方库包括 Twisted、py2exe、PIL 等。

大多数第三方库都在努力与 Python 3.0 兼容。即使不能立即使用 Python 3.0,建议编写兼容 Python 3.0 的程序,然后使用 Python 2.6、Python 2.7 执行。

Python 3.0的变化主要在以下几个方面:


print 函数

print 语句消失了,取而代之的是 print() 函数。 Python 2.6 和 Python 2.7 部分支持这种形式的打印语法。在 Python 2.6 和 Python 2.7 中,以下三种形式是等价的:

print "fish"
print ("fish") #注意print后面有个空格
print("fish") #print()不能带有任何其它参数

然而,Python 2.6实际已经支持新的print()语法:

from __future__ import print_function
print("fish", "panda", sep=', ')


Unicode

Python 2 有 ASCII str() 类型,unicode() 是单独的,不是 byte 类型。

现在,在 Python 3 中,我们终于有了 Unicode (utf-8) 字符串和一类字节:字节和字节数组。

由于 Python3.X 源文件默认使用 utf-8 编码,这使得以下代码合法:

>>> 中国 = 'china' 
>>>print(中国) 
china

Python 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'
>>> str = u"我爱北京天安门"
>>> str
u'\u6211\u7231\u5317\u4eac\u5929\u5b89\u95e8'

Python 3.x

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


除法运算

Python中的划分相对于其他语言来说是非常高端的,并且有一套非常复杂的规则。 Python 中的除法有两个运算符,/ 和 //

首先来说/除法:

python 2.x中/除法和我们熟悉的大部分语言类似,比如Java和C。整数除法的结果是整数,小数部分完全被忽略了。浮点除法会保留小数点并得到一个整数。浮点数的结果。

python 3.x / 除法不再这样做了,对于整数之间的除法,结果也将是一个浮点数。

Python 2.x:

>>> 1 / 2
0
>>> 1.0 / 2.0
0.5

Python 3.x:

>>> 1/2
0.5

对于//除法,这种除法称为地板除法,它自动对除法的结果进行地板运算,这在python 2.x和python 3.x中是一致的。

python 2.x:

>>> -1 // 2
-1

python 3.x:

>>> -1 // 2
-1

请注意,不是丢弃小数部分,而是执行地板操作。如果要截断整数部分,需要使用math模块的trunc函数

python 3.x:

>>> import math
>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0


异常

在 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 中可以看出,设计者让异常更加具体,只有当出现错误的情况时,才能用异常捕获语句来处理。


xrange

使用 xrange() 创建可迭代对象在 Python 2 中非常流行。例如:for 循环或列表/集合/字典推导。

这非常像生成器(例如“惰性评估”)。但是这个 xrange-iterable 是无限的,这意味着你可以迭代它。

由于它的惰性求值,xrange() 函数比 range() 更快,如果你只需要迭代一次(如 for 循环)。尽管如此,不建议你迭代多次,而不是迭代一次,因为生成器每次都从头开始。

在 Python 3 中,range() 的实现方式与 xrange() 类似,因此不再存在专用的 xrange() 函数(xrange() 在 Python 3 中引发命名异常)。

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

Python 2

print 'Python', python_version()
print '\ntiming range()' 
%timeit test_range(n)
print '\n\ntiming xrange()' 
%timeit test_xrange(n)
Python 2.7.6
timing range()
1000 loops, best of 3: 433 µs per loop
timing xrange()
1000 loops, best of 3: 350 µs per loop

Python 3

print('Python', python_version())
print('\ntiming range()')
%timeit test_range(n)
Python 3.4.1
timing range()
1000 loops, best of 3: 520 µs per loop
print(xrange(10))
---------------------------------------------------------------------------
NameError        Traceback (most recent call last)
<ipython-input-5-5d8f9b79ea70> in <module>()
----> 1 print(xrange(10))
NameError: name 'xrange' is not defined


八进制字面量表示

八进制数必须写为0o777,不能使用原形式0777;二进制数必须写为 0b111。

添加了一个新的 bin() 函数以将整数转换为二进制字符串。 Python 2.6 已经支持这两种语法。

在Python 3.x中,表示八进制字面量的方式只有一种,就是0o1000。

python 2.x

>>> 0o1000
512
>>> 01000
512

python 3.x

>>> 01000
  File "<stdin>", line 1
    01000
        ^
SyntaxError: invalid token
>>> 0o1000
512


不等运算符

Python 2.x中不等于有两种写法 != 和 <>

在 Python 3.x 中,<> 被删除,只有一种写法 !=。还好我从来没有用过<>的习惯


去掉了repr表达式``

Python 2.x 中反引号``相当于repr函数的作用

在 Python 3.x 中,删除了 ``,只允许使用 repr 函数。这样做的目的是让代码看起来更清晰吗?但是,我觉得使用repr的机会很少。一般只在调试时使用。大多数时候,str 函数用于用字符串描述对象。

def sendMail(from_: str, to: str, title: str, body: str) -> bool:
    pass


多个模块被改名(根据PEP8)

python2.x和3.x有什么区别

StringIO 模块现在合并到新的 io 模块中。删除了 new、md5、gopherlib 等模块。 Python 2.6 已经支持新的 io 模块。

httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包内。

取消了exec语句,只剩下exec()函数。 Python 2.6已经支援exec()函数。


5.数据类型

1)Py3.X去掉了long类型,现在只有一种整数类型——int,但表现得像2.X版本的long

2) 增加了bytes类型,对应2.X版本的八进制字符串。定义字节文字的方法如下:

>>> b = b'china' 
>>> type(b) 
<type 'bytes'>

str 对象和 bytes 对象可以使用 .encode() (str -> bytes) 或 .decode() (bytes -> str)方法相互转化。

>>> s = b.decode() 
>>> s 
'china' 
>>> b1 = s.encode() 
>>> b1 
b'china'

3)dict的.keys()、.items和.values()方法返回迭代器,丢弃之前的iterkeys()等函数。还删除了 dict.has_key(),将其替换为 in 。


打开文件

原:

file( ..... )
或 
open(.....)

改为只能用

open(.....)

从键盘录入一个字符串

原:

raw_input( "提示信息" )

改为:

input( "提示信息" )

在python2.x中raw_input()和input( ),两个函数都存在,其中区别为:


·

raw_input()---将所有输入作为字符串看待,返回字符串类型


·

input()-----只能接收"数字"的输入,在对待纯数字输入时具有自己的特性,它返回所输入的数字的类型(int, float )

在python3.x中,raw_input()和input()是集成的,去掉raw_input(),只保留input()函数,它接受任意输入,默认所有输入为字符串处理,返回一个字符串类型。


map、filter 和 reduce

这三个函数声称是函数式编程的代表。 Python3.x 和 Python2.x 也有很大的不同。

首先我们在Python2.x的交互下简单进入map和filter,看到它们的类型是内置函数(built-in function):

>>> map
<built-in function map>
>>> filter
<built-in function filter>
>>>

它们输出的结果类型都是列表:

>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]
>>> filter(lambda x:x %2 ==0,range(10))
[0, 2, 4, 6, 8]
>>>

但是在Python 3.x中它们却不是这个样子了:

>>> map
<class 'map'>
>>> map(print,[1,2,3])
<map object at 0x10d8bd400>
>>> filter
<class 'filter'>
>>> filter(lambda x:x % 2 == 0, range(10))
<filter object at 0x10d8bd3c8>
>>>

首先,它们从函数变成了类,其次,它们的返回结果也从原来的列表变成了可迭代对象。我们尝试使用下一个函数手动迭代:

>>> f =filter(lambda x:x %2 ==0, range(10))
>>> next(f)
0
>>> next(f)
2
>>> next(f)
4
>>> next(f)
6
>>>

对于更高端的 reduce 函数,Python 3.x 中不再内置,已移至 functools 模块。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享