溫馨提示×

溫馨提示×

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

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

Python2和Python3的區(qū)別有哪些

發(fā)布時間:2021-12-17 13:55:00 來源:億速云 閱讀:168 作者:iii 欄目:編程語言

本篇內(nèi)容主要講解“Python2和Python3的區(qū)別有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python2和Python3的區(qū)別有哪些”吧!

什么是鴨子類型(duck typing)?

鴨子類型是動態(tài)類型語言判斷一個對象是不是某種類型時使用的方法,也叫做鴨子判定法。簡單的說,鴨子類型是指判斷一只鳥是不是鴨子,我們只關心它游泳像不像鴨子、叫起來像不像鴨子、走路像不像鴨子就足夠了。換言之,如果對象的行為跟我們的預期是一致的(能夠接受某些消息),我們就認定它是某種類型的對象。

在Python語言中,有很多bytes-like對象(如:bytes、bytearray、array.array、memoryview)、file-like對象(如:StringIO、BytesIO、GzipFile、socket)、path-like對象(如:str、bytes),其中file-like對象都能支持read和write操作,可以像文件一樣讀寫,這就是所謂的對象有鴨子的行為就可以判定為鴨子的判定方法。再比如Python中列表的extend方法,它需要的參數(shù)并不一定要是列表,只要是可迭代對象就沒有問題。

說明:動態(tài)語言的鴨子類型使得設計模式的應用被大大簡化。

說一下Python中變量的作用域。

Python中有四種作用域,分別是局部作用域(Local)、嵌套作用域(Embedded)、全局作用域(Global)、內(nèi)置作用域(Built-in),搜索一個標識符時,會按照LEGB的順序進行搜索,如果所有的作用域中都沒有找到這個標識符,就會引發(fā)NameError異常。

題目28:說一下你對閉包的理解。

閉包是支持一等函數(shù)的編程語言(Python、JavaScript等)中實現(xiàn)詞法綁定的一種技術。當捕捉閉包的時候,它的自由變量(在函數(shù)外部定義但在函數(shù)內(nèi)部使用的變量)會在捕捉時被確定,這樣即便脫離了捕捉時的上下文,它也能照常運行。簡單的說,可以將閉包理解為能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。正在情況下,函數(shù)的局部變量在函數(shù)調(diào)用結(jié)束之后就結(jié)束了生命周期,但是閉包使得局部變量的生命周期得到了延展。使用閉包的時候需要注意,閉包會使得函數(shù)中創(chuàng)建的對象不會被垃圾回收,可能會導致很大的內(nèi)存開銷,所以閉包一定不能濫用。

題目29:說一下Python中的多線程和多進程的應用場景和優(yōu)缺點。

線程是操作系統(tǒng)分配CPU的基本單位,進程是操作系統(tǒng)分配內(nèi)存的基本單位。通常我們運行的程序會包含一個或多個進程,而每個進程中又包含一個或多個線程。多線程的優(yōu)點在于多個線程可以共享進程的內(nèi)存空間,所以進程間的通信非常容易實現(xiàn);但是如果使用官方的CPython解釋器,多線程受制于GIL(全局解釋器鎖),并不能利用CPU的多核特性,這是一個很大的問題。使用多進程可以充分利用CPU的多核特性,但是進程間通信相對比較麻煩,需要使用IPC機制(管道、套接字等)。

多線程適合那些會花費大量時間在I/O操作上,但沒有太多并行計算需求且不需占用太多內(nèi)存的I/O密集型應用。多進程適合執(zhí)行計算密集型任務(如:視頻編碼解碼、數(shù)據(jù)處理、科學計算等)、可以分解為多個并行子任務并能合并子任務執(zhí)行結(jié)果的任務以及在內(nèi)存使用方面沒有任何限制且不強依賴于I/O操作的任務。

擴展:Python中實現(xiàn)并發(fā)編程通常有多線程、多進程和異步編程三種選擇。異步編程實現(xiàn)了協(xié)作式并發(fā),通過多個相互協(xié)作的子程序的用戶態(tài)切換,實現(xiàn)對CPU的高效利用,這種方式也是非常適合I/O密集型應用的。

說一下Python 2和Python 3的區(qū)別。

點評:這種問題千萬不要背所謂的參考答案,說一些自己最熟悉的就足夠了。

  1. Python 2中的print和exec都是關鍵字,在Python 3中變成了函數(shù)。

  2. Python 3中沒有l(wèi)ong類型,整數(shù)都是int類型。

  3. Python 2中的不等號<>在Python 3中被廢棄,統(tǒng)一使用!=。

  4. Python 2中的xrange函數(shù)在Python 3中被range函數(shù)取代。

  5. Python 3對Python 2中不安全的input函數(shù)做出了改進,廢棄了raw_input函數(shù)。

  6. Python 2中的file函數(shù)被Python 3中的open函數(shù)取代。

  7. Python 2中的/運算對于int類型是整除,在Python 3中要用//來做整除除法。

  8. Python 3中改進了Python 2捕獲異常的代碼,很明顯Python 3的寫法更合理。

  9. Python 3生成式中循環(huán)變量的作用域得到了更好的控制,不會影響到生成式之外的同名變量。

  10. Python 3中的round函數(shù)可以返回int或float類型,Python 2中的round函數(shù)返回float類型。

  11. Python 3的str類型是Unicode字符串,Python 2的str類型是字節(jié)串,相當于Python 3中的bytes。

  12. Python 3中的比較運算符必須比較同類對象。

  13. Python 3中定義類的都是新式類,Python 2中定義的類有新式類(顯式繼承自object的類)和舊式類(經(jīng)典類)之分,新式類和舊式類在MRO問題上有非常顯著的區(qū)別,新式類可以使用__class__屬性獲取自身類型,新式類可以使用__slots__魔法。

  14. Python 3對代碼縮進的要求更加嚴格,如果混用空格和制表鍵會引發(fā)TabError。

  15. Python 3中字典的keys、values、items方法都不再返回list對象,而是返回view object,內(nèi)置的map、filter等函數(shù)也不再返回list對象,而是返回迭代器對象。

  16. Python 3標準庫中某些模塊的名字跟Python 2是有區(qū)別的;而在三方庫方面,有些三方庫只支持Python 2,有些只能支持Python 3。

到此,相信大家對“Python2和Python3的區(qū)別有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!

向AI問一下細節(jié)

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

AI