Python 3.x 新特性及10大變化
Python 3.x 起始版本是Python 3.0,目前的最新版本是 3.3.3
Python之父Guido van Rossum談到了Python 3.0的構(gòu)思:
一直以來(lái),除非要打破向后兼容性,否則很多缺陷和錯(cuò)誤都無(wú)法修復(fù)。因此,Python 3000將會(huì)作為第一個(gè)放棄向后兼容性的Python版本,目的就是要讓Python向著最好的語(yǔ)言前進(jìn)。
Python的3.0版本,常被稱(chēng)為Python 3000,或簡(jiǎn)稱(chēng)Py3k。相對(duì)于Python的早期版本,這是一個(gè)較大的升級(jí)。為了不帶入過(guò)多的累贅,Python 3.0在設(shè)計(jì)的時(shí)候沒(méi)有考慮向下兼容。許多針對(duì)早期Python版本設(shè)計(jì)的程序都無(wú)法在Python 3.0上正常運(yùn)行。為了照顧現(xiàn)有程序,Python 2.6作為一個(gè)過(guò)渡版本,基本使用了Python 2.x的語(yǔ)法和庫(kù),同時(shí)考慮了向Python 3.0的遷移,允許使用部分Python 3.0的語(yǔ)法與函數(shù)?;谠缙赑ython版本而能正常運(yùn)行于Python 2.6并無(wú)警告。程序可以通過(guò)一個(gè)2to3的轉(zhuǎn)換工具無(wú)縫遷移到Python 3.0。Python有一些很有用的測(cè)試模塊,包括doctext和unitest。確保在嘗試移植到Python3之前,對(duì)應(yīng)用程序進(jìn)行全面測(cè)試。要確保測(cè)試范圍盡可能大,而且程序在Python2.6上運(yùn)行時(shí),能通過(guò)測(cè)試并且沒(méi)有出現(xiàn)任何警告信息。
新的Python程序建議使用Python 3.0版本的語(yǔ)法。除非運(yùn)行環(huán)境無(wú)法安裝Python 3.0或者程序本身使用了不支持Python 3.0的第三方庫(kù)。目前不支持Python 3.0的第三方庫(kù)有Twisted, py2exe, PIL等。大多數(shù)第三方庫(kù)都正在努力地兼容Python 3.0版本。即使無(wú)法立即使用Python 3.0,也建議編寫(xiě)兼容Python 3.0版本的程序,然后使用Python 2.6, Python 2.7來(lái)運(yùn)行。Python 2.7被確定為最后一個(gè)Python 2.x版本,它除了支持Python 2.x語(yǔ)法外,還支持部分Python 3.1語(yǔ)法.
變化大致總結(jié)如下:
01.print() and exec() 函數(shù)
python舊版本里,print和exec是作為一語(yǔ)句出現(xiàn),可以用print "Hello,World!", 來(lái)打印一個(gè)語(yǔ)句,在新版本里,print()和exec()作為一個(gè)函數(shù)出現(xiàn),所以上面的寫(xiě)就是錯(cuò)誤的,應(yīng)該寫(xiě)成print ("Hello,World!")對(duì)于Java的程序員來(lái)說(shuō),這樣的改變應(yīng)該是比較熟悉. System.out.print("Hello,World!");
Old: >>>print "The answer is", 2*2
New: >>>print("The answer is", 2*2)
Old: >>>print x, # Trailing comma suppresses newline
New: >>>print(x, end=" ") # Appends a space instead of a newline
Old: >>>print # Prints a newline
New: >>>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)!
不過(guò)在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() 同樣是函數(shù),在python 2.x里,下列代碼是ok的.
>>> def foo():
exec('a=4')
print a
>>> foo()
4
但在python 3.x里面就不行了,會(huì)報(bào)NameError: global name 'a' is not defined. 因?yàn)樽兞縜沒(méi)有定義。原因在于exec()作為函數(shù),只操作globals()和locals()函數(shù)返回的字典。但locals()函數(shù)返回的字典實(shí)際上是局部變量的一個(gè)副本。exec()函數(shù)中進(jìn)行的賦值只修改了局部變量的這份副本,而非局部變量本身。下面給出了一種解決辦法:
>>> def foo():
_locals = locals()
exec('a=4',globals(),_locals)
a = _locals['a']
print (a)
>>> foo()
4
02.整數(shù)及除法
int和long統(tǒng)一為int, int表示任何精度的整數(shù),移除sys.maxint, 因?yàn)閕nt已經(jīng)是最大的整數(shù)。新版本移除了含糊的除法符號(hào)('/'),而只返回浮點(diǎn)數(shù)。在以前的版本中,如果參數(shù)是int或者是long的話(huà),就會(huì)返回相除后結(jié)果的向下取整(floor), 而如果參數(shù)是float或者是complex的話(huà),那么就會(huì)返回相除后結(jié)果的一個(gè)恰當(dāng)?shù)慕啤?br />
Old: >>>1/2 #結(jié)果是0 暈死。。。
New: >>>1/2 #結(jié)果是0.5 總算接地氣了。
03.input()代替raw_input()
變簡(jiǎn)潔了。
Old: >>>question = raw_input("What is your quest? ")
New: >>>question = input("What is your quest? ")
04.源文件編碼默認(rèn)為UTF-8
Python 3 在字符編碼方面有很多改進(jìn),其中之一就是默認(rèn)的源文件編碼從ASCII變?yōu)閁TF-8,也就是說(shuō)以前在文件頭加上的各種花樣的 coding=utf-8不再需要了!
# coding: UTF-8
# vim:fileencoding=UTF-8
# -*- coding=UTF-8 -*-
# vim: set fileencoding=UTF-8
05.字符串格式化變化
格式化字符串的這個(gè)內(nèi)置的%操作符太有限了,新版本新增加了format(),比以前更靈活了,%要逐漸被淘汰。舉三個(gè)簡(jiǎn)單的例子如下:
>>>"I love {0}, {1}, and {2}".format("eggs", "bacon", "sausage")
'I love eggs, bacon, and sausage'
>>>"I love {a}, , 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對(duì)于值的比較要嚴(yán)格得多。在Python2中,任意兩個(gè)對(duì)象均可進(jìn)行比較,例如:
Old: >>>11 < 'ORACLE' # Python 2 結(jié)果為:True
New: >>>11 < 'ORACLE' # Python 3 這種比較將導(dǎo)致TypeError異常
07.標(biāo)識(shí)符支持非 ASCII 字符
所有 = all
class 男人:
@classmethod
def 包括(cls,ta):
return isinstance(ta,cls)
def 一起玩(人們):
if 所有(男人.包括(ta) for ta in 人們):
print ("他們是基友")
else:
print ("他們是朋友")
湯姆 = 男人()
杰瑞 = 男人()
一起玩([湯姆,杰瑞])
>>>
他們是基友
08.異常處理
* 異常類(lèi)必須繼承自BaseException,它是異常結(jié)構(gòu)的基類(lèi)。
* 移除了StandardError
* 拋出異常:使用raise Exception(args)而不是原來(lái)的raise Exception, args
* 捕獲異常: 使用except Exception as identifier而不是原來(lái)的except Exception, identifier
* 異常鏈(Exception chain)。
* 改良了一些windows不能加載模式時(shí)的異常信息,具有本地化處理。
例子1: Python 3中的異常處理
# 綁定ValueError到本地的ex
try:
x = float('blah')
except ValueError as ex:
print("value exception occurred ", ex)
# 同時(shí)捕獲兩個(gè)不用的異常
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 內(nèi)的另一個(gè)重大改變是字典內(nèi)dict.iterkeys(),dict.itervalues(),dict.iteritems()方法的刪除。取而代之的是:dict.keys(),dict.values(),dict.items(),它們被進(jìn)行了修補(bǔ),可以返回輕量的、類(lèi)似于集的容器對(duì)象,而不是鍵和值的列表。這樣的好處是在不進(jìn)行鍵和條目復(fù)制的情況下,就能在其上執(zhí)行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)
True
New: >>> 1 in d #新版本判斷key是否在字典里面
True
10.其他改變
* 移除了backticks(使用repr()代替)
* 移除了<>(不等號(hào),使用!=代替)
* as和with 變成了關(guān)鍵字
* True,False和None變成了關(guān)鍵字
* 移除了__getslice__,語(yǔ)法a[i:j]被解釋成a.__getitem__(slice(i,j))
* nonlocal聲明。使用nonlocal可以聲明一個(gè)外部變量(不是global變量)
* xrange()改名為range(),range()現(xiàn)在不是產(chǎn)生一個(gè)列表(list),而是一個(gè)迭代器。
* next()重命名為_(kāi)_next__(),新的內(nèi)建函數(shù)next()可以調(diào)用一個(gè)對(duì)象的__next__()方法。
* 八進(jìn)制字,二進(jìn)制和bin()函數(shù)。應(yīng)該寫(xiě)0o666而不是0666,oct()函數(shù)也做了響應(yīng)的改動(dòng)。同樣,0b1010等價(jià)于10,bin(10)返回”0b1010″。
>>>0o13 #八進(jìn)制轉(zhuǎn)十進(jìn)制
11
>>>0b010101 #八進(jìn)制轉(zhuǎn)二進(jìn)制
21
相關(guān)文章
深入理解python中實(shí)例方法的第一個(gè)參數(shù)self
在Python中,self?是類(lèi)的實(shí)例方法的一個(gè)參數(shù),代表類(lèi)的實(shí)例對(duì)象本身,在本篇文章中,我們將深入探討?self?的工作原理以及它在Python編程中的重要性,需要的可以參考下2023-09-09
Python ARP掃描與欺騙實(shí)現(xiàn)全程詳解
這篇文章主要介紹了Python 實(shí)現(xiàn)ARP掃描與欺騙,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10
Python對(duì)多屬性的重復(fù)數(shù)據(jù)去重實(shí)例
下面小編就為大家分享一篇Python對(duì)多屬性的重復(fù)數(shù)據(jù)去重實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04
Pytorch 實(shí)現(xiàn)自定義參數(shù)層的例子
今天小編就為大家發(fā)信息一篇Pytorch 實(shí)現(xiàn)自定義參數(shù)層的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
詳解python定時(shí)簡(jiǎn)單爬取網(wǎng)頁(yè)新聞存入數(shù)據(jù)庫(kù)并發(fā)送郵件
這篇文章主要介紹了python定時(shí)簡(jiǎn)單爬取網(wǎng)頁(yè)新聞存入數(shù)據(jù)庫(kù)并發(fā)送郵件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
詳解Python中的array數(shù)組模塊相關(guān)使用
數(shù)組并不是Python中內(nèi)置的標(biāo)配數(shù)據(jù)結(jié)構(gòu),不過(guò)擁有array模塊我們也可以在Python中使用數(shù)組結(jié)構(gòu),下面我們就來(lái)詳解詳解Python中的array數(shù)組模塊相關(guān)使用2016-07-07
Python程序中的觀察者模式結(jié)構(gòu)編寫(xiě)示例
觀察者模式是最常用的設(shè)計(jì)模式之一,旨在觀察目標(biāo)和觀察者之間建立一個(gè)抽象的耦合,減少對(duì)象之間的耦合,這里我們就來(lái)看一下Python程序中的觀察者模式結(jié)構(gòu)編寫(xiě)示例2016-05-05
macOS M1(Apple Silicon)安裝配置Conda環(huán)境的具體實(shí)現(xiàn)
由于常用的Anaconda和Miniconda現(xiàn)在都沒(méi)有提供M1處理器支持的conda環(huán)境,以下是conda-forge提供的miniforge,感興趣的可以了解一下2021-08-08

