Python2.x和3.x到底有哪些區別,這不僅在你開發程序中需要考慮的,也是面試程序面試官經常會問及的,
1. print
在Python 2.6之前,只支持
print "hello"
在Python 2.6和2.7中,可以支持如下三種
print "hello"
print("hello")
print ("hello")
在Python3.x中,可以支持如下兩種
print("hello")
print ("hello")
2. 編碼方式
在Python2.x中,默認使用ASCII編碼,
所以默認情況下,我們不能在程式中使用中文,若要使用中文,必須在檔案頭部,宣告使用 "UTF-8" 編碼,并在使用的時候注意編碼轉換,要列印的時候需先轉成"Unicode"編碼,否則會亂碼,
Python 2的正確使用方法,如下
# coding:utf-8
str1="中國"
print str1.decode("utf-8")
亦或者可以這樣,u表示,這個字串使用Unicode編碼,不再需要轉換,
# coding:utf-8
str1=u"中國"
print str1
在Python3.x中,默認使用Unicode的UTF-8編碼,
所以我們可以在程式中,隨意的使用中文(但并不推薦),不會報錯,
3. 除法運算
Python 2.x中除法運算,整數間運算只保留整數(向下取整),
'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:531509025
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
>>> 8/2
4
>>> 8/3
2
>>> -8/3
-3
>>> -8/3.0
-2.6666666666666665
Python 3.x中除法運算,全部保留小數(即使能被整除),
>>> 8/2
4.0
>>> 8/3
2.6666666666666665
這里要說明一下,3.x 中的//用法和 2.x 用法是一樣的,這個運算叫做 floor 運算,即向下取整,
>>> 8//2
4
>>> 8//3
2
>>> -8//3.0
-3.0
4. 例外捕獲
在 Python 3 中,只能使用 as 作為關鍵詞,而在Python 2中經常使用 except Exception, e
使用語法except (exc1, exc2) as var可以同時捕獲多種類別的例外,
Python 2.6已經支持這兩種語法,
- 在2.x時代,所有型別的物件都是可以被直接拋出的,在3.x時代,只有繼承自BaseException的物件才可以被拋出,
- 2.x raise陳述句使用逗號將拋出物件型別和引數分開,3.x取消了這種奇葩的寫法,直接呼叫建構式拋出物件即可,
在2.x時代,例外在代碼中除了表示程式錯誤,還經常做一些普通控制結構應該做的事情,在3.x中可以看出,設計者讓例外變的更加專一,只有在錯誤發生的情況才能去用例外捕獲陳述句來處理,
5. xrange
首先,要了解的是,xrange是只有在Python2.x中才有的產物,
在 2.x 中xrange和range的使用方法可以說完全一致,只是從內部來看,range是回傳一個list物件,而xrange回傳一個生成器物件,所以在處理大批量資料時,xrange的性能會更好,
>>>xrange(1,5)
xrange(1, 5)
>>>list(xrange(1,5))
[1, 2, 3, 4]
而在3.x 中,只有range函式,為什么沒有xrange,因為3.x中的range其實就是2.x中的xrange,你可以這樣理解,
>>> range(10)
range(0, 10)
6. 用戶輸入
在2.x 中,有兩個函式,raw_input()和input(),
raw_input():將所有輸入作為字串看待,回傳字串型別,- input():只能接收"數字"的輸入,
在3.x 中,對這兩個函式進行整合,只留下一個input(),既可輸入數字,也可輸入字串,回傳的是字串型別,
7. 資料型別
Python 3.x 一個很重要的特性是,對字串和二進制資料流做了明確的區分,
文本總是Unicode,由str型別表示,二進制資料則由bytes型別表示,
Python 3不會以任意隱式的方式混用str和bytes,你不能拼接字串和位元組流,也無法在位元組流里搜索字串(反之亦然),也不能將字串傳入引數為位元組流的函式(反之亦然),
還有一點是,3.X去除了long型別,取代它的是整型(int),3.x的整型是沒有限制大小的,可以當做long型別使用, 但實際上由于機器記憶體的有限,我們使用的整數是不可能無限大的,
8. 函式式編程
在Python中,我們常常使用到的map,filter,reduce,在2.x和3.x中也有所不同,
在2.x中,這三貨,是內建函式,回傳的是一個串列,
>>> map
<built-in function map>
>>> filter
<built-in function filter>
>>> map(lambda x:x *2, [1,2,3])
[2, 4, 6]
>>> filter(lambda x:x %2 ==0,range(10))
[0, 2, 4, 6, 8]
在3.x中,前面兩貨,卻變成類了,回傳的是可迭代物件,
'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:531509025
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
>>> map
<class 'map'>
>>> map(print,[1,2,3])
<map object at 0x10d8bd400>
>>> filter
<class 'filter'>
>>> filter(lambda x:x % 2 == 0, range(10))
<filter object at 0x10d8bd3c8>
對于 reduce 函式,它在 Python 3.x 中已經不屬于 built-in 了,被挪到 functools 模塊當中,
9. 協程關鍵字
在Python3.3后,協程中,新增了yield from 和 async/await 關鍵字,這在2.x中是沒有,
關于yield from的語法剖析,可以前往查看我的另一篇文章,
10. 類的型別
Python2.x 默認使用經典類,只有顯示繼承object才是新式類,
Python3.x 沒有經典類,只有新式類,而且有三種寫法
class Cls:
pass
class Cls():
pass
class Cls(object):
pass
11. 變數作用域
在2.x中無法將區域變數宣告為全域變數,
在3.x中可以使用nonlocal語法將區域變數宣告為全域變數,
'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:531509025
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
def foo():
var=100
def bar():
nonlocal var
var=200
bar()
print(var)
foo()
# 2.x輸出:100
# 3.x輸出:200
12. 元類的使用
在2.x 中
class Metaclass(type):
pass
class Person(list):
__metaclass__ = Metaclass
pass
在3.x中
class MetaPerson(type):
pass
class Person(metaclass=MetaPerson):
pass
13. 模塊變化
去掉了一些模塊,由于不常用,這里就不列舉了,
新增了一些模塊,比如:concurrent.futures,asyncio等
修改了一些模塊,比如:Queue改成queue,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/423919.html
標籤:其他
