溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python2與Python3的區(qū)別是什么

發(fā)布時間:2021-02-03 15:28:28 來源:億速云 閱讀:165 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)Python2與Python3的區(qū)別是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

具體如下:

Python的3??.0版本相對于Python的早期版本,這是一個較大的升級。為了不帶入過多的累贅,Python 3.0在設(shè)計的時候沒有考慮向下相容。許多針對早期Python版本設(shè)計的程式都無法在Python 3.0上正常執(zhí)行。為了照顧現(xiàn)有程式,Python 2.6作為一個過渡版本,基本使用了Python 2.x的語法和庫,同時考慮了向Python 3.0的遷移,允許使用部分Python 3.0的語法與函數(shù)。新的Python程式建議使用Python 3.0版本的語法。越來越多的庫要放棄Python 2了,大多數(shù)第三方庫都正在努力地相容Python 3.0版本。即使無法立即使用Python 3.0,也建議編寫相容Python 3.0版本的程式,然后使用Python 2.6, Python 2.7來執(zhí)行。本片博文就是講述一下Python2.x與3??.x版本區(qū)別。

一、print函數(shù)

Python 2中print是語句(statement),Python 3中print則變成了函數(shù)。在Python 3中調(diào)用print需要加上括號,不加括號會報SyntaxError。Python 2.6與Python 2.7部分地支持這種形式的print語法。在Python 2.6與Python 2.7里面,以下三種形式是等價的:

print "123"
print ("123") #注意print后面有個空格
print("123") #print()不能帶有任何其它參數(shù)
# 然而,Python 2.6實際已經(jīng)支持新的print()語法:
from __future__ import print_function
print("123", "456", sep=', ')

二、Unicode

Python 2有兩種字符串類型:str和unicode,Python 3中的字符串默認就是Unicode,Python 3中的str相當于Python 2中的unicode。在Python 2中,如果代碼中包含非英文字符,需要在代碼文件的最開始聲明編碼,如下:

# -*- coding: utf-8 -*-

由于 Python3.X 源碼文件默認使用utf-8編碼,這就使得以下代碼是合法的:

>>> 你好 = 'hello'
>>>print(你好)
hello

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中的除法較其它語言顯得非常高端,有套很復(fù)雜的規(guī)則。Python中的除法有兩個運算符,/和//。

首先來說/除法:在python 2.x中/除法就跟我們熟悉的大多數(shù)語言,比如Java啊C啊差不多,整數(shù)相除的結(jié)果是一個整數(shù),把小數(shù)部分完全忽略掉,浮點數(shù)除法會保留小數(shù)點的部分得到一個浮點數(shù)的結(jié)果。在python 3.x中/除法不再這么做了,對于整數(shù)之間的相除,結(jié)果也會是浮點數(shù)。

Python 2.x:

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

Python 3.x:

>>> 1/2
0.5

而對于//除法,這種除法叫做floor除法,會對除法的結(jié)果自動進行一個floor操作,在python 2.x和python 3.x中是一致的。

Python 2.x/Python 3.x相同:

>>> -1 // 2
-1

四、異常處理

在 Python 3 中處理異常也輕微的改變了,在 Python 3 中我們現(xiàn)在使用 as 作為關(guān)鍵詞。捕獲異常的語法由 except exc, var 改為 except exc as var。使用語法except (exc1, exc2) as var可以同時捕獲多種類別的異常。

Python 2.x:

try:
  1/0
except ZeroDivisionError, e:
  print str(e)

Python 3.x(此種方式python 2.x也可用,python 3.x必須帶as):

try:
  1/0
except ZeroDivisionError as e:
  print str(e)

五、xrange

在 Python 2 中 xrange() 創(chuàng)建迭代對象的用法是非常流行的。比如: for 循環(huán)或者是列表/集合/字典推導(dǎo)式。這個表現(xiàn)十分像生成器(比如。"惰性求值")。但是這個 xrange-iterable 是無窮的,意味著你可以無限遍歷。由于它的惰性求值,如果你不得僅僅不遍歷它一次,xrange() 函數(shù) 比 range() 更快(比如 for 循環(huán))。盡管如此,對比迭代一次,不建議你重復(fù)迭代多次,因為生成器每次都從頭開始。在 Python 3 中,range() 是像 xrange() 那樣實現(xiàn)以至于一個專門的 xrange() 函數(shù)都不再存在(在 Python 3 中 xrange() 會拋出命名異常)。

簡單來說就是:Python 2中有 range 和 xrange 兩個方法。其區(qū)別在于,range返回一個list,在被調(diào)用的時候即返回整個序列;xrange返回一個iterator,在每次循環(huán)中生成序列的下一個數(shù)字。Python 3中不再支持 xrange 方法,Python 3中的 range 方法就相當于 Python 2中的 xrange 方法。

六、map、filter 和 reduce

這三個函數(shù)號稱是函數(shù)式編程的代表。在 Python3.x 和 Python2.x 中也有了很大的差異。首先我們先簡單的在 Python2.x 的交互下輸入 map 和 filter,看到它們兩者的類型是 built-in function(內(nèi)置函數(shù)):

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

但是在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>
>>>

首先它們從函數(shù)變成了類,其次,它們的返回結(jié)果也從當初的列表成了一個可迭代的對象, 我們嘗試用 next 函數(shù)來進行手工迭代,對于比較高端的 reduce 函數(shù),它在 Python 3.x 中已經(jīng)不屬于 built-in 了,被挪到 functools 模塊當中。

七、raw_input()和input()

在python2.x中raw_input()和input( ),兩個函數(shù)都存在,其中區(qū)別為:

raw_input()---將所有輸入作為字符串看待,返回字符串類型

input()---只能接收"數(shù)字"的輸入,在對待純數(shù)字輸入時具有自己的特性,它返回所輸入的數(shù)字的類型(int, float )

在python3.x中raw_input()input( )進行了整合,去除了raw_input(),僅保留了input()函數(shù),其接收任意任性輸入,將所有輸入默認為字符串處理,并返回字符串類型。

八、數(shù)據(jù)類型

1. Python3.x去除了long類型,現(xiàn)在只有一種整型——int,但它的行為就像Python2.x版本的long

2. 新增了bytes類型,對應(yīng)于2.X版本的八位串,定義一個bytes字面量的方法如下:

>>> b = b'china'
>>> type(b)
<type 'bytes'>
str對象和bytes對象可以使用.encode() (str -> bytes) or .decode() (bytes -> str)方法相互轉(zhuǎn)化。
>>> s = b.decode()
>>> s
'china'
>>> b1 = s.encode()
>>> b1
b'china'

3. dict的.keys()、.items.values()方法返回迭代器,而之前的iterkeys()等函數(shù)都被廢棄。同時去掉的還有 dict.has_key(),用 in替代它吧 。

關(guān)于“Python2與Python3的區(qū)別是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI