摘要:官方也宣布在停止對的維護。并且在很多面試過程中,面試官都會問與的區別。的版本,常被稱為,或簡稱。與部分地支持這種形式的語法。捕獲異常的語法由改為。在中,表示八進制字面量的方式只有一種,就是。已經支援新的模組。
前言
如果你是剛接觸 Python 的初學者,那你可能是直接學習 Python 3.x 版本。對于 Python 2.x 的版本是不會有所接觸。官方也宣布在 2020 停止對 Python 2.x 的維護。我也建議初學者直接去學 Python 3.x 版本。但我們還是要去了解下 Python 3.x 與 Python 2.x 之間都有哪些改變,通過對比能讓你對 Python 有更加深刻的理解。并且在很多面試過程中,面試官都會問:Python 2.x 與 Python 3.x 的區別。今天就給大家列舉 Python 3.0 主要改變的幾個方面。
Py3KPython 的 3.0 版本,常被稱為 Python 3000,或簡稱 Py3K。
為了照顧現有程式,Python 2.6 作為一個過度版本,基本使用了 Python 2.x 得語法和庫,同時考慮了向 Pythn 3.0 得遷移,允許使用部分 Python 3.0 的語法與函數。
Python 3.0 的變化主要在以下幾個方面:
1 print 函數print 語句沒有了,取而代之的是 print() 函數。Python 2.6 與 Python 2.7 部分地支持這種形式的 print 語法。在 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=", ")2 Unicode
Python 2 有 ASCII str() 類型,unicode() 是多帶帶的,不是 byte 類型。
現在,在 Python 3 ,我們最終有了 Unicode(utf-8) 字符串,以及一個字節類:byte 和 bytearrays。
由于 Python 3.x 源碼文件默認使用 uft-8 編碼,這就使得以下代碼是合法的:
>>> 中國 = "china" >>> print(中國) china
Python 2.x
>>> str = "我愛北京天安門" >>> str "xe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8" >>> str = u"我愛北京天安門" >>> str
Python 3.x
>>> str = "我愛北京天安門" >>> str "我愛北京天安門"3 除法運算
Python 中的除法較其它語言顯得非常高端,有套很復雜的規則。Python 中的除法有兩個運算符,/ 和 // 首先來說下 / 除法:
在 python 2.x 中 / 除法就跟我們熟悉的大多數語言,比如 Java、C 差不多,整數相除的結果是一個整數,把小數部分完全忽略掉,浮點數除法會保留小數點的部分得到一個浮點數的結果。
在 python3.x 中 / 除法不再這么做了,對于整數之間的相除,結果也會是浮點數。
Python 2.x
>>> 1 / 2 0 >>> 1.0 / 2.0 0.5
Python 3.x
>>> 1/2 0.5
而對于 // 除法,這種除法叫做 floor 除法,會對除法的結果自動進行一個 floor 操作,在 python 2.x 和 python 3.x 中是一致的。
而 floor 除法指的是返回數字的下舍整數,在 Python 中有個 floor 函數,它不能直接訪問,需要導入 math 模塊,通過靜態對象調用該方法。舉個例子:
import math # This will import math module print "math.floor(-45.17) : ", math.floor(-45.17)
輸出結果:
math.floor(-45.17) : -46.0
python 2.x:
>>> -1 // 2 -1
注意的是并不是舍棄小數部分,而是執行 floor 操作,如果要截取小數部分,那么需要使用 math 模塊的 trunc 函數
python 3.x
>>> import math >>> math.trunc(1 / 2) 0 >>> math.trunc(-1 / 2) 04 異常
在 Python 3 中處理異常也輕微的改變了,在 Python 3 中我們現在使用 as 作為關鍵詞。
捕獲異常的語法由 except exc, var 改為 except exc as var。
使用語法 except (exc1, exc2) as var 可以同時捕獲多種類別的異常。 Python 2.6 已經支持這兩種語法。
1. 在 2.x 時代,所有類型的對象都是可以被直接拋出的,在 3.x 時代,只有繼承自 BaseException 的對象才可以被拋出。
2. 2.x raise 語句使用逗號將拋出對象類型和參數分開,3.x 取消了這種奇葩的寫法,直接調用構造函數拋出對象即可。
在 2.x 時代,異常在代碼中除了表示程序錯誤,還經常做一些普通控制結構應該做的事情,在 3.x 中可以看出,設計者讓異常變的更加專一,只有在錯誤發生的情況才能去用異常捕獲語句來處理。
5 xrange在 Python 2 中 xrange() 創建迭代對象的用法是非常流行的。比如: for 循環或者是列表/集合/字典推導式。
這個表現十分像生成器(比如。"惰性求值")。但是這個 xrange-iterable 是無窮的,意味著你可以無限遍歷。
由于它的惰性求值,如果你不得僅僅不遍歷它一次,xrange() 函數 比 range() 更快(比如 for 循環)。盡管如此,對比迭代一次,不建議你重復迭代多次,因為生成器每次都從頭開始。
惰性求值:惰性求值,也就是延遲求值,表達式不會在它被綁定到變量之后就立即求值,而是等用到時再求值。
作用:這個特性可以解決一些巨大甚至無限的集合列表,延遲求值的一個好處是能夠建立可計算的無限列表,而沒有妨礙計算的無限循環或大小問題。
Python 中的很多方法沒有直接返回列表,而是返回了一個可迭代的 generator (生成器)對象,這便是 python 的惰性求值。
在 Python 3 中,range() 是像 xrange() 那樣實現以至于一個專門的 xrange() 函數都不再存在(在 Python 3 中 xrange() 會拋出命名異常)。
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 " timing range()" %timeit test_range(n) print " timing 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(" timing 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)6 八進制字面量表示in () ----> 1 print(xrange(10)) NameError: name "xrange" is not defined
八進制數必須寫成 0o777,原來的形式 0777 不能用了;二進制必須寫成 0b111。
新增了一個 bin() 函數用于將一個整數轉換成二進制字串。 Python 2.6 已經支持這兩種語法。
在 Python 3.x 中,表示八進制字面量的方式只有一種,就是 0o1000。
pyhon 2.x
>>> 0o1000 512 >>> 01000 512
python 3.x
>>> 01000 File "7 不等運算符", line 1 01000 ^ SyntaxError: invalid token >>> 0o1000 512
Python 2.x 中不等于有兩種寫法 != 和 <>
Python 3.x 中去掉了 <>,只有 != 一種寫法。
8 去掉了 repr 表達式 ``Python 2.x 中反引號 `` 相當于 repr 函數的作用
Python 3.x 中去掉了 `` 這種寫法,只允許使用 repr 函數。
repr 是什么:repr() 函數將對象轉化為供解釋器讀取的形式,返回一個對象的 string 格式。
9 多個模塊被改名(根據 PEP8)httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib 被合并到 http 包內。StringIO 模塊現在被合并到新的 io 模組內。 new, md5, gopherlib 等模塊被刪除。 Python 2.6 已經支援新的 io 模組。
取消了 exec 語句,只剩下 exec() 函數。 Python 2.6 已經支援 exec() 函數。
10 數據類型1)Py3.X 去除了 long 類型,現在只有一種整型——int,但它的行為就像 2.X 版本的 long。
2)新增了 bytes 類型,對應于 2.x 版本的八位串,定義一個 bytes 字面量的方法如下:
>>> b = b"china" >>> type(b)
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 替代它。
11 打開文件原先有兩種打開方式:
file( ..... ) 或 open(.....)
現在改成只能用
open(......)12 從鍵盤錄入一個字符串
raw_input("提示信息")
現在:
input("提示信息")
在 python2.x 中 raw_input() 和 input( ),兩個函數都存在,其中區別為:
raw_input():將所有輸入作為字符串看待,返回字符串類型
input():只能接收"數字"的輸入,在對待純數字輸入時具有自己的特性,它返回所輸入的數字的類型(int, float )
在 python3.x 中 raw_input() 和 input( ) 進行了整合,去除了 raw_input(),僅保留了 input() 函數,其接收任意任性輸入,將所有輸入默認為字符串處理,并返回字符串類型。
本文首發于公眾號「癡海」,后臺回復「1024」,領取最新 Python 教程。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42042.html
Python的3??.0版本,常被稱為Python 3000,或簡稱Py3k。相對于Python的早期版本,這是一個較大的升級。為了不帶入過多的累贅,Python 3.0在設計的時候沒有考慮向下相容。許多針對早期Python版本設計的程式都無法在Python 3.0上正常執行。為了照顧現有程式,Python 2.6作為一個過渡版本,基本使用了Python 2.x的語法和庫,同時考慮了向Python...
摘要:解決的辦法在處理計算密集型任務時,使用多進程協程,發揮計算機多核的威力,而處理密集型,則可以使用多線程。至此,有關知識點的面試題就已告一段落,下次更新數據庫,方面面試題。 showImg(https://segmentfault.com/img/bVbuYzy?w=3484&h=2480); 閱讀本文大約需要 5 分鐘。 15.說一說 GIL 前面有提到由于 Python 基于 C 語...
摘要:認為有極大的優化空間,在字符串和整形操作上可以取得很好的優化結果。的和方法返回迭代器,而之前的等函數都被廢棄。python有兩個主要的版本,python2 和 python3 ,但是python又不同于其他語言,向下兼容,python3是不向下兼容的,但是絕大多數組件和擴展都是基于python2的,下面就來總結一下python2和python3的區別。 ? 1.性能? Py3.0運...
摘要:認為有極大的優化空間,在字符串和整形操作上可以取得很好的優化結果。的和方法返回迭代器,而之前的等函數都被廢棄。python有兩個主要的版本,python2 和 python3 ,但是python又不同于其他語言,向下兼容,python3是不向下兼容的,但是絕大多數組件和擴展都是基于python2的,下面就來總結一下python2和python3的區別。 ? 1.性能? Py3.0運...
摘要:關鍵字在中,閉包只能讀外部函數的變量,而不能改寫它。注意關鍵字是中出現的所以在中無法直接使用關鍵字里只有種作用域全局作用域和局部作用域。兩者使用的范圍不同。 關鍵字nonlocal 在Python 2.x中,閉包只能讀外部函數的變量,而不能改寫它。為了解決這個問題,Python 3.x引入了nonlocal關鍵字,在閉包內用nonlocal聲明變量,就可以讓解釋器在外層函數中查找變量名...
閱讀 1738·2023-04-25 19:37
閱讀 1308·2021-11-16 11:45
閱讀 2807·2021-10-18 13:30
閱讀 2767·2021-09-29 09:34
閱讀 1630·2019-08-30 15:55
閱讀 3116·2019-08-30 11:10
閱讀 1835·2019-08-29 16:52
閱讀 999·2019-08-29 13:18