Python 3.x 新特性及10大變化

Python 3.x 新特性及10大變化

投稿:junjie  字體:[增加 減小] 類型:轉載 時間:2015-06-12 我要評論

這篇文章主要介紹了Python 3.x 新特性及10大變化,本文講解了Python之父Guido van Rossum談到了Python 3.0的構思,Python3版本的一些變化如print() and exec() 函數、整數及除法、input()代替raw_input()等,需要的朋友可以參考下

Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3

Python之父Guido van Rossum談到了Python 3.0的構思:

一直以來,除非要打破向後兼容性,否則很多缺陷和錯誤都無法修復。因此,Python 3000將會作爲第一個放棄向後兼容性的Python版本,目的就是要讓Python向着最好的語言前進。

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 2.6並無警告。程序可以通過一個2to3的轉換工具無縫遷移到Python 3.0。Python有一些很有用的測試模塊,包括doctext和unitest。確保在嘗試移植到Python3之前,對應用程序進行全面測試。要確保測試範圍儘可能大,而且程序在Python2.6上運行時,能通過測試並且沒有出現任何警告信息。

新的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 2.7被確定爲最後一個Python 2.x版本,它除了支持Python 2.x語法外,還支持部分Python 3.1語法.

變化大致總結如下: 

01.print() and exec() 函數

python舊版本里,print和exec是作爲一語句出現,可以用print "Hello,World!", 來打印一個語句,在新版本里,print()和exec()作爲一個函數出現,所以上面的寫就是錯誤的,應該寫成print ("Hello,World!")對於Java的程序員來說,這樣的改變應該是比較熟悉. System.out.print("Hello,World!");

複製代碼 代碼如下:

Old: >>>print "The answer is", 2*2New: >>>print("The answer is", 2*2)Old: >>>print x,           # Trailing comma suppresses newlineNew: >>>print(x, end=" ")  # Appends a space instead of a newlineOld: >>>print              # Prints a newlineNew: >>>print()            # You must call the function!Old: >>>print >>sys.stderr, "fatal error"New: >>>print("fatal error", file=sys.stderr)Old: >>>print (x, y)       # prints repr((x, y))New: >>>print((x, y))      # Not the same as print(x, y)!

不過在Python 2.6版本里面: from __future__ import print_function

複製代碼 代碼如下:

>>> from __future__ import print_function>>> print ('Jerry','Sherry',sep='-')Jerry-Sherry

下面的修改在新版本是正確的:

複製代碼 代碼如下:

>>>print("There are <", 2**32, "> possibilities!", sep="")There are <4294967296> possibilities!>>>fid = open("log.txt", "a")>>>print("log.txt", file=fid)>>>print("Foo", "Bar", sep="%")>>>Foo%Bar

exec() 同樣是函數,在python 2.x裏,下列代碼是ok的.

複製代碼 代碼如下:

>>> def foo(): exec('a=4') print a >>> foo()4

但在python 3.x裏面就不行了,會報NameError: global name 'a' is not defined. 因爲變量a沒有定義。原因在於exec()作爲函數,只操作globals()和locals()函數返回的字典。但locals()函數返回的字典實際上是局部變量的一個副本。exec()函數中進行的賦值只修改了局部變量的這份副本,而非局部變量本身。下面給出了一種解決辦法:

複製代碼 代碼如下:

>>> def foo(): _locals = locals() exec('a=4',globals(),_locals) a = _locals['a'] print (a) >>> foo()4

02.整數及除法

int和long統一爲int, int表示任何精度的整數,移除sys.maxint, 因爲int已經是最大的整數。新版本移除了含糊的除法符號('/'),而只返回浮點數。在以前的版本中,如果參數是int或者是long的話,就會返回相除後結果的向下取整(floor), 而如果參數是float或者是complex的話,那麼就會返回相除後結果的一個恰當的近似。

複製代碼 代碼如下:

Old: >>>1/2   #結果是0     暈死。。。New: >>>1/2   #結果是0.5   總算接地氣了。

03.input()代替raw_input()變簡潔了。

複製代碼 代碼如下:

Old:  >>>question = raw_input("What is your quest? ")New:  >>>question = input("What is your quest? ")

04.源文件編碼默認爲UTF-8

Python 3 在字符編碼方面有很多改進,其中之一就是默認的源文件編碼從ASCII變爲UTF-8,也就是說以前在文件頭加上的各種花樣的 coding=utf-8不再需要了!


複製代碼 代碼如下:

# coding: UTF-8# vim:fileencoding=UTF-8# -*- coding=UTF-8 -*-# vim: set fileencoding=UTF-8

05.字符串格式化變化

格式化字符串的這個內置的%操作符太有限了,新版本新增加了format(),比以前更靈活了,%要逐漸被淘汰。舉三個簡單的例子如下:


複製代碼 代碼如下:

>>>"I love {0}, {1}, and {2}".format("eggs", "bacon", "sausage")'I love eggs, bacon, and sausage'

>>>"I love {a}, {b}, and {c}".format(a="eggs", b="bacon", c="sausage")

'I love eggs, bacon, and sausage'


>>>"I love {0}, {1}, and {param}".format("eggs", "bacon", param="sausage")

'I love eggs, bacon, and sausage'


06.比較Python3對於值的比較要嚴格得多。在Python2中,任意兩個對象均可進行比較,例如:

複製代碼 代碼如下:

Old: >>>11 < 'ORACLE'   # Python 2 結果爲:TrueNew: >>>11 < 'ORACLE'   # Python 3 這種比較將導致TypeError異常

07.標識符支持非 ASCII 字符

複製代碼 代碼如下:

所有 = allclass 男人:    @classmethod    def 包括(cls,ta):        return isinstance(ta,cls)def 一起玩(人們):    if 所有(男人.包括(ta) for ta in 人們):        print ("他們是基友")    else:        print ("他們是朋友")湯姆 = 男人()傑瑞 = 男人()

一起玩([湯姆,傑瑞])

>>>

他們是基友


08.異常處理

* 異常類必須繼承自BaseException,它是異常結構的基類。* 移除了StandardError* 拋出異常:使用raise Exception(args)而不是原來的raise Exception, args* 捕獲異常: 使用except Exception as identifier而不是原來的except Exception, identifier* 異常鏈(Exception chain)。* 改良了一些windows不能加載模式時的異常信息,具有本地化處理。例子1:  Python 3中的異常處理


複製代碼 代碼如下:

# 綁定ValueError到本地的extry:    x = float('blah')except ValueError as ex:    print("value exception occurred ", ex)# 同時捕獲兩個不用的異常try:    x = float('blah')except (ValueError, NameError):    print("caught both types of exceptions")

例子2:  Python 3中的隱式異常鏈

複製代碼 代碼如下:

def divide(a, b):    try:        print(a/b)    except Exception as exc:        def log(exc):            fid = open('logfile.txt') # missing 'w'            print(exc, file=fid)            fid.close()            log(exc)

divide(1,0)

09.字典dict

 Python 3.0 內的另一個重大改變是字典內dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的刪除。取而代之的是:dict.keys(),dict.values(),dict.items(),它們被進行了修補,可以返回輕量的、類似於集的容器對象,而不是鍵和值的列表。這樣的好處是在不進行鍵和條目複製的情況下,就能在其上執行set操作。dict.has_key()同樣被移除。

複製代碼 代碼如下:

>>> d = {1:"Food",2:"Book"}>>> d.keys(), d.values(),d.items()>>> for values in d.items(): print (values)(1, 'Food')(2, 'Book')>>> keys = list(d.items())>>> print (keys)[(1, 'Food'), (2, 'Book')]Old:  >>> d.has_key(1)TrueNew: >>> 1 in d     #新版本判斷key是否在字典裏面True

10.其他改變

* 移除了backticks(使用repr()代替)

* 移除了<>(不等號,使用!=代替)* as和with 變成了關鍵字* True,False和None變成了關鍵字* 移除了__getslice__,語法a[i:j]被解釋成a.__getitem__(slice(i,j))* nonlocal聲明。使用nonlocal可以聲明一個外部變量(不是global變量)* xrange()改名爲range(),range()現在不是產生一個列表(list),而是一個迭代器。* next()重命名爲__next__(),新的內建函數next()可以調用一個對象的__next__()方法。* 八進制字,二進制和bin()函數。應該寫0o666而不是0666,oct()函數也做了響應的改動。同樣,0b1010等價於10,bin(10)返回”0b1010″。


複製代碼 代碼如下:

>>>0o13             #八進制轉十進制11>>>0b010101         #八進制轉二進制21


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章