# Python2.x與3??.x版本區別
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 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 3.0的變化主要在以下幾個方面:
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=', ')
```
新的str類別表示一個Unicode字串,相當于Python 2.x版本的unicode類別。而位元組序列則用類似b"abc"的語法表示,用bytes類表示,相當于Python 2.x的str類別。
現在兩種類別不能再隱式地自動轉換,因此在Python 3.x里面"fish"+b"panda"是錯誤。正確的寫法是"fish"+b"panda".decode("utf-8")。 Python 2.6可以自動地將位元組序列識別為Unicode字串,方法是:
```
from __future__ import unicode_literals
print(repr("fish"))
```
除法運算符"/"在Python 3.x內總是返回浮點數。而在Python 2.6內會判斷被除數與除數是否是整數。如果是整數會返回整數值,相當于整除;浮點數則返回浮點數值。
為了讓Python 2.6統一返回浮點數值,可以:
```
from __future__ import division
print(3/2)
```
* 捕獲異常的語法由except exc, var改為except exc as var。使用語法except (exc1, exc2) as var可以同時捕獲多種類別的異常。 Python 2.6已經支援這兩種語法。
* 集合(set) 的新寫法:{1,2,3,4}。注意{}仍然表示空的字典(dict) 。
* 字典推導式(Dictionary comprehensions) {expr1: expr2 for k, v in d},這個語法等價于
```
result={}
for k, v in d.items():
result[expr1]=expr2
return result
```
集合推導式(Set Comprehensions) {expr1 for x in stuff}。這個語法等價于:
```
result = set()
for x in stuff:
result.add(expr1)
return result
```
* 八進制數必須寫成0o777,原來的形式0777不能用了;二進制必須寫成0b111。新增了一個bin()函數用于將一個整數轉換成二進制字串。 Python 2.6已經支援這兩種語法。
* dict.keys(), dict.values??(), dict.items(), map(), filter(), range(), zip()不再返回列表,而是迭代器。
* 如果兩個物件之間沒有定義明確的有意義的順序。使用<, >, <=, >=比較它們會投擲異常。比如1 < ""在Python 2.6里面會返回True,而在Python 3.0里面會投擲異常。現在cmp(), instance.__cmp__()函數已經被刪除。
* 可以注釋函數的參數與返回值。此特性可方便IDE對原始碼進行更深入的分析。例如給參數增加類別訊息:
```
def sendMail(from_: str, to: str, title: str, body: str) -> bool:
pass
```
* 合并int與long類型。
* 多個模塊被改名(根據PEP8):
| 舊的名字 | 新的名字 |
| --- | --- |
| _winreg | winreg |
| ConfigParser | configparser |
| copy_reg | copyreg |
| Queue | queue |
| SocketServer | socketserver |
| repr | reprlib |
* StringIO模塊現在被合并到新的io模組內。 new, md5, gopherlib等模塊被刪除。 Python 2.6已經支援新的io模組。
* httplib, BaseHTTPServer, CGIHTTPServer, SimpleHTTPServer, Cookie, cookielib被合并到http包內。
* 取消了exec語句,只剩下exec()函數。 Python 2.6已經支援exec()函數。
- Python 基礎教程
- Python 簡介
- Python 環境搭建
- Python 基礎語法
- Python 變量類型
- Python 運算符
- Python 條件語句
- Python 循環語句
- Python While循環語句
- Python for 循環語句
- Python 循環嵌套
- Python break 語句
- Python continue 語句
- Python pass 語句
- Python 數字
- Python 字符串
- Python 列表(Lists)
- Python 元組
- Python 字典(Dictionary)
- Python 日期和時間
- Python 函數
- Python 模塊
- Python 文件I/O
- Python 異常處理
- Python 高級教程
- Python 面向對象
- Python 正則表達式
- Python CGI編程
- Python 使用SMTP發送郵件
- Python 多線程
- Python 2.x與3??.x版本區別
- Python IDE
- Python JSON
- Python3 教程
- Python3 基礎語法
- Python3 基本數據類型
- Python3 解釋器
- Python3 注釋
- Python3 數字運算
- Python3 字符串
- Python3 列表
- Python3 編程第一步
- Python3 條件控制
- Python3 循環
- Python3 函數
- Python3 數據結構
- Python3 模塊
- Python3 輸入和輸出
- Python3 錯誤和異常
- Python3 類
- Python3 標準庫概覽
- 免責聲明