久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python 2 和 Python 3 主要區(qū)別有哪些(一)

 長沙7喜 2018-01-22

作者:劉志軍,,6年+Python使用經(jīng)驗(yàn),, 高級開發(fā)工程師,目前在互聯(lián)網(wǎng)醫(yī)療行業(yè)從事Web系統(tǒng)構(gòu)架工作

個人公眾號:Python之禪(微信ID:vttalk)


Guido(Python之父,,仁慈的獨(dú)裁者)在設(shè)計(jì) Python3 的過程中,,受一篇文章 “Python warts” 的影響,決定不向后兼容,,否則無法修復(fù)大多數(shù)缺陷,。—-摘錄自《流暢的Python》
http://web./web/20031002184114/www.amk.ca/python/writing/warts.html

你可能沒聽說過學(xué) Java 糾結(jié)是學(xué) JDK6 還是 JDK7,,也沒聽說學(xué) PHP 糾結(jié)是學(xué) PHP5 還是 PHP7,,但在 Python 社區(qū),有這么個怪現(xiàn)象:“學(xué) Python 到底是學(xué) 2 還是學(xué) 3,?”,,就像月經(jīng)一樣每隔斷時間就出現(xiàn)在你面前,也成了很多初學(xué)者的選擇困惑,,問題的“始作俑者”當(dāng)然是 Python 它爹,,大家眾說紛紜,,有說 Python2 是主流,大公司都在用,,你應(yīng)該學(xué) 2 ,。也有說 Python3 才是未來主流,大多數(shù)第三方框架已基本支持 Python3,。

個人看法是 Python2 還會存在很長一段時間(只要那些用 Python2 的公司還沒倒閉,,就一直會存在),你去找工作很有可能就需要用到 2,,而 Python3 也是你必須要掌握的,,因?yàn)樵絹碓蕉囗?xiàng)目會優(yōu)先選擇 3 ,本質(zhì)上,,它倆是同一門語言,,僅僅只是極少部分(1%?并沒有嚴(yán)格統(tǒng)計(jì))不兼容的地方,,所以就沒所謂學(xué)誰好,,學(xué)了一個,另一個花很少時間就能掌握,。

今天就給大家介紹 Python2 和 Python3 的一些主要區(qū)別,。

print

程序調(diào)試時用得最多的語句可能就是 print,在 Python2 中,,print 是一條語句,,而在 Python3 中是作為函數(shù)存在的。有人可能就有疑問了,,我在 Python2 中明明也看到當(dāng)函數(shù)使用:

# py2
print('hello')  # 等價 print  ('hello')

#py3
print('hello')

然而,,你看到的只是表象,上面兩個表達(dá)式有什么區(qū)別,?從輸出結(jié)果來看是一樣的,,但實(shí)質(zhì)上,前者是把 ('hello')當(dāng)作一個整體,,而后者 print()是個函數(shù),,接收字符串作為參數(shù)。

# py2
>>> print('hello', 'world')
('hello', 'world')

# py3
>>> print('hello', 'world')
hello world

這個例子就更明顯了,,在 py2 中,,print語句后面接的是一個元組對象,而在 py3 中,,print 函數(shù)可以接收多個位置參數(shù),。如果希望在 py2 中 把 print 當(dāng)函數(shù)使用,那么可以導(dǎo)入 future 模塊 中的 print_function

# py2
>>> print('hello', 'world')
('hello', 'world')
>>>
>>> from __future__ import print_function
>>> print('hello', 'world')
hello world

編碼

Python2 的默認(rèn)編碼是 asscii,,這也是導(dǎo)致 Python2 中經(jīng)常遇到編碼問題的原因之一,,至于是為什么會使用 asscii 作為默認(rèn)編碼,,原因在于 Python 2 出來的時候還沒出現(xiàn) Unicode。Python 3 默認(rèn)采用了 UTF-8 作為默認(rèn)編碼,,因此你不再需要在文件頂部寫 # coding=utf-8 了,。

# py2
>>> sys.getdefaultencoding()
'ascii'

# py3
>>> sys.getdefaultencoding()
'utf-8'

網(wǎng)上不少文章說通過修改默認(rèn)編碼格式來解決 Python2 的編碼問題,其實(shí)這是個大坑,,不要這么干,。

字符串

字符串是最大的變化之一,這個變化使得編碼問題降到了最低可能,。在 Python2 中,,字符串有兩個類型,一個是 unicode,,一個是 str,,前者表示文本字符串,后者表示字節(jié)序列,,不過兩者并沒有明顯的界限,,開發(fā)者也感覺很混亂,不明白編碼錯誤的原因,,不過在 Python3 中兩者做了嚴(yán)格區(qū)分,,分別用 str 表示字符串,byte 表示字節(jié)序列,,任何需要寫入文本或者網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)都只接收字節(jié)序列,,這就從源頭上阻止了編碼錯誤的問題。

True和False

True 和 False 在 Python2 中是兩個全局變量(名字),,在數(shù)值上分別對應(yīng) 1 和 0,既然是變量,,那么他們就可以指向其它對象,,例如:

# py2
>>> True = False
>>> True
False
>>> True is False
True
>>> False = 'x'
>>> False
'x'
>>> if False:
...     print('?')
...
?

顯然,上面的代碼違背了 Python 的設(shè)計(jì)哲學(xué) Explicit is better than implicit.,。而 Python3 修正了這個缺陷,,True 和 False 變?yōu)閮蓚€關(guān)鍵字,永遠(yuǎn)指向兩個固定的對象,,不允許再被重新賦值,。

# py3
>>> True = 1
 File '', line 1
SyntaxError: can't assign to keyword

迭代器

在 Python2 中很多返回列表對象的內(nèi)置函數(shù)和方法在 Python 3 都改成了返回類似于迭代器的對象,因?yàn)榈鞯亩栊约虞d特性使得操作大數(shù)據(jù)更有效率,。Python2 中的 range 和 xrange 函數(shù)合并成了 range,,如果同時兼容2和3,可以這樣:

try:
   range = xrange
except:
   pass

另外,,字典對象的 dict.keys(),、dict.values() 方法都不再返回列表,,而是以一個類似迭代器的 “view” 對象返回。高階函數(shù) map,、filter,、zip 返回的也都不是列表對象了。有,,py2的迭代器必須實(shí)現(xiàn) next 方法,,而 py3 改成了 __next__

nolocal

我們都知道在 py2 中可以在函數(shù)里面可以用關(guān)鍵字 global 聲明某個變量為全局變量,但是在嵌套函數(shù)中,,想要給一個變量聲明為非局部變量是沒法實(shí)現(xiàn)的,,py3 新增了關(guān)鍵字 nolcoal,使得非局部變量成為可能,。

def func():    c = 1    def foo():        c = 12    foo()    print(c)func()    #1

可以對比上面兩段代碼的輸出結(jié)果

def func():    c = 1    def foo():        nonlocal c        c = 12    foo()    print(count)func()   # 12

其實(shí)很多內(nèi)建模塊也做了大量調(diào)整,,Python3 中的模塊組織更加清晰,類更加先進(jìn),,引入了異步IO,,這次先寫這么多,下次再繼續(xù),。

Python愛好者社區(qū)歷史文章大合集

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多