国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python對(duì)象的身份迷思:從全體公民到萬物皆數(shù)

chunquedong / 699人閱讀

摘要:真正的前方高能第一個(gè)鋪墊告訴我們,對(duì)象可以映射成布爾值真假,第二個(gè)鋪墊告訴我們,布爾值可以映射成數(shù)字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對(duì)這看似不合現(xiàn)代語境卻又流傳千古的思想做出任何揣測(cè)。

這么久以來,我終于確認(rèn)了一件事,那就是不管是人也好,還是貓也好,常常會(huì)忘了想自己當(dāng)下的身份位置,以及曾經(jīng)的身份位置。

這個(gè)現(xiàn)象在我身上,表現(xiàn)出了雙倍分量的嚴(yán)重。這種時(shí)刻,我就會(huì)想起阿爾法貓,以及她識(shí)破我身份的那個(gè)遙遠(yuǎn)的午后。(往事入口:《有了Python,我能叫出所有貓的名字》)

阿爾法貓還沒有蹤影,她的謎題,還在指引我。

學(xué)習(xí)Python之后,我明顯感覺到了自己的變化,當(dāng)然有時(shí)候是被迫的,因?yàn)槟切┥砩系拿軟_突得厲害。

畢竟,你應(yīng)該知道,夜行貓和日間人的分界是清晰的。日夜的顛倒,對(duì)人和對(duì)貓,是雙倍的壓榨。說來你別不信,昨晚當(dāng)瞄見明亮的月球的時(shí)候,一剎那恍惚,我還誤以為自己回到了喵星的清晨。

大概是想家了吧。地球上美好的事物很多,但我至今仍不習(xí)慣的就是它公轉(zhuǎn)的速度太快了,不久就會(huì)是寒冷的冬天了。想我的暖爐了,喵。

先不說我啦,來說說我發(fā)現(xiàn)的Python對(duì)象的身份問題吧。

我對(duì)身份的話題特別感興趣,也許是因?yàn)槲要?dú)特的身份吧。但是,正因?yàn)楠?dú)特的視角,我敢說發(fā)現(xiàn)了所有人類都沒有發(fā)現(xiàn)的真相。

我即將說出來的東西,也許你本以為知道了,或者你本以為很熟悉,但是,經(jīng)過我的分析,我相信你會(huì)得到不一樣的感悟,從此以后,你對(duì)Python的理解也會(huì)更深一步。

1、全體公民與特權(quán)種族

在某種意義上說,Python世界是普遍公平的,因?yàn)樗械淖用穸际菍?duì)象“公民”,這在任何一個(gè)現(xiàn)實(shí)社會(huì)里,乃至于在虛擬的國度里,都是極其罕見的。對(duì)象們分屬在五大部落里(數(shù)字、字符串、列表、元祖、字典),各有所長,各司其職,協(xié)作共處,通婚繁衍。

還有一點(diǎn)難得的是,他們沒有受到愚民政策的對(duì)待,全民都享有思想自由,還習(xí)得了超便利的自省能力。人能自知,這能力彌足珍貴。

雖然在這個(gè)世界里,不會(huì)時(shí)常出現(xiàn)崗哨攔阻,但在任何有需要的時(shí)候,他們都可以自證清白,id() 和 type() 是一種通行語言,你不需要翻譯來對(duì)接。而對(duì)于更進(jìn)一步的詢問,長得相似的兩個(gè)對(duì)象只需一個(gè)簡明的判斷句,就能區(qū)分清楚。請(qǐng)你看一段對(duì)話:

Object1=2018
Object2="2018"
id(Object1) >>>2399282764784
id(Object2) >>>2399281922600
type(Object1) >>>int
type(Object2) >>>str
Object1 is Object2 >>>False

全體皆公民,這項(xiàng)天賦權(quán)力讓我對(duì)Python產(chǎn)生了良好的印象。不過,隨著對(duì)它的認(rèn)識(shí)加深,我發(fā)現(xiàn)它還暗地里制定了很多“效率優(yōu)先”的規(guī)則。

最明顯的例子就是——“特權(quán)種族”。(參見:《Python中的“特權(quán)種族”是什么? 》)從現(xiàn)有的證據(jù)來看,特權(quán)種族至少包括了:一些數(shù)值較小的數(shù)字對(duì)象(區(qū)間:[-5,256])、布爾值對(duì)象、None對(duì)象、較短的字符串對(duì)象(長度不超過20,且僅包括下劃線、數(shù)字、字母的字符串)等等,還不知道這份名單漏了誰。

效率優(yōu)先的規(guī)則允許這些對(duì)象傳承內(nèi)存地址,也就是說,當(dāng)一個(gè)“祖先”對(duì)象搶占了一塊內(nèi)存地盤后,所有它那一脈的“子孫后代”都會(huì)繼承它的遺產(chǎn)(視為同一個(gè)對(duì)象)。

a=100
b=1000
# c與a共用id,d另立門戶
c=100
d=1000
id(a)==id(c) >>>True
id(b)==id(d) >>>False

設(shè)想一下,兩個(gè)祖先(a和b)占了相鄰的兩塊內(nèi)存,一個(gè)可以與它的“后代”共用內(nèi)存,一個(gè)卻只能讓“后代”另立門戶;當(dāng)它們走完自己的生命周期后,b會(huì)馬上被當(dāng)垃圾回收,內(nèi)存地址遺產(chǎn)被剝奪,然而a卻形滅而實(shí)存,蔭庇后世。

Python為這些對(duì)象傾斜資源,也就是為某種階層固化提供了合法性。劃分的依據(jù)是因?yàn)樗鼈儽容^常用,共用內(nèi)存就意味著減少開支,提高內(nèi)存使用效率。

這就是Python有趣的地方了,一面是全體公民,一面是特權(quán)種族,組成了看似矛盾的二元對(duì)立結(jié)構(gòu)。

2、官方名片與私人名片

除了上面的群體性身份外,我發(fā)現(xiàn)Python中也存在著個(gè)體身份的二元結(jié)構(gòu)。

這就是__repr__()__str__() 的關(guān)系了。如你所知,這是Python的兩個(gè)魔法方法,其對(duì)應(yīng)的內(nèi)置函數(shù)是repr() 和 str()。對(duì)于對(duì)象x,有x.__repr__() 等價(jià)于 repr(x),同理,x.__str__() 等價(jià)于 str(x)。

它們的主要用途在于,返回對(duì)象的字符串格式。用法示例:

repr(2018) >>>"2018"
str(2018)  >>>"2018"
repr([1,2,3]) >>>"[1, 2, 3]"
str([1,2,3])  >>>"[1, 2, 3]"

words = "Hello pythonCat!
"
repr(words) >>>"Hello pythonCat!
"
str(words)  >>>"Hello pythonCat!
"
# 結(jié)合print,注意換行符

print(repr(words))
>>>"Hello pythonCat!
"
print(str(words)) 
>>>Hello pythonCat! # 再加換行
>>>

一個(gè)對(duì)象的字符串形式就是它的“臉面”,是向他人介紹自己的一張名片。前面提到過,Python世界有五大部落,這些部落的原住民們與生俱來就擁有這兩張名片。

對(duì)于原住民來說,這兩張名片似乎沒啥區(qū)別,除了在使用打印函數(shù)的時(shí)候,在換行符等用法上會(huì)有不同。

而對(duì)于外來人口(例如,自定義的類),如果它沒有定做名片(即實(shí)現(xiàn)__repr__()__str__() 方法)的話,其默認(rèn)的名片就會(huì)是類名及內(nèi)存地址,如下所示。

class Person:
     def __init__(self,name,sex):
         self.name = name
         self.sex = sex

me = Person("pythonCat", "male")

repr(me)
>>> "<__main__.Person object at 0x0000022EA8D7ED68>"
str(me)
>>> "<__main__.Person object at 0x0000022EA8D7ED68>"

事實(shí)上,repr()返回的是對(duì)象的官方名片,通常人們會(huì)說,這張名片是給機(jī)器閱讀的。本質(zhì)上,它就是一個(gè)對(duì)象的代碼表示形式,可以用來重新構(gòu)造這個(gè)對(duì)象。通過eval()函數(shù),你可以利用這張名片,重新構(gòu)造出這個(gè)對(duì)象。

eval()函數(shù)是個(gè)內(nèi)置函數(shù),它將字符串str當(dāng)成有效的表達(dá)式來求值并返回計(jì)算結(jié)果。也就是eval(repr(x))==x,示例如下:

a = 1 + 1
b = [1, 2, "cat"]
c = {"name":"pythonCat", "sex":"male"}
eval(repr(a)) >>>2
eval(repr(b)) >>>[1, 2, "cat"]
eval(repr(c)) >>>{"name": "pythonCat", "sex": "male"}

相對(duì)地,str()得到的是對(duì)象的私人名片,通常有更友好的表現(xiàn)形式,因?yàn)樗菫槿祟愰喿x而設(shè)計(jì)的。

如果一個(gè)對(duì)象公民沒有私人名片,那Python默認(rèn)會(huì)調(diào)用它的官方名片。因?yàn)檫@個(gè)機(jī)制,很多人建議如果要定制一個(gè)名片,最好是定制官方那個(gè)。但是我卻不認(rèn)同,我認(rèn)為應(yīng)該定制私人的那個(gè),因?yàn)檫@樣發(fā)揮空間更大。不張揚(yáng)個(gè)性,毋寧死。

class Person:
     def __init__(self,name,sex):
         self.name = name
         self.sex = sex
     # 定制私人名片
     def __str__(self):
         return "{} is an elegant creature!".format(self.name)

me = Person("pythonCat", "male")

repr(me)
>>>"<__main__.Person object at 0x000002E6845AC390>"
str(me)
>>>"pythonCat is an elegant creature!"

在《The Zen of Python》里第一句話就是:Beautiful is better than ugly。在我看來,定制私人名片要比定制官方名片更優(yōu)美。能夠?yàn)樽约簬},想想就覺得雞凍啦!

3、何為真假,萬物皆數(shù)

以上說法,不管是全體公民身份與特權(quán)種族身份,還是官方名片與私人名片,多少帶進(jìn)了我淺薄的社會(huì)經(jīng)驗(yàn)的偏見。我起初很為一方鳴不平,為一種討巧的做法鳴得意,但是,現(xiàn)在當(dāng)我知道Python中另一種更不為人知的身份現(xiàn)象的時(shí)候,我就釋然了。

我接下來要揭示的身份話題,已經(jīng)超越了社會(huì)學(xué)和心理學(xué)范疇,進(jìn)入了一種哲學(xué)的思想疆域。

前方高能!

前方高能!

前方高能!

首先,來做一個(gè)基礎(chǔ)知識(shí)的鋪墊。Python有一個(gè)令大部分編程語言都忘塵莫及的特性,那就是,所有對(duì)象都可以用于做真假判斷。

在做判斷的時(shí)候,以下情況都視為假(False):None、數(shù)值的零值、空序列(如空字符串""、空列表[]、空元祖() )、空集合{} 等等。除此之外,一般對(duì)象都可以作為真值(True)來使用。來看示例:

list = [1, 2]
if list: # 即if True
    print("list is not empty")
else:
    print("list is empty")

>>> list is not empty

判斷一個(gè)列表是否為空,你不需要寫 if len(list) > 0,或者寫if list == [],簡明的使用方法是 if list 或者 if not list,有物則為真,無物則為假。其它判斷情況類似。

接下來,還是一個(gè)鋪墊,這次是進(jìn)階知識(shí)。零值(含整數(shù)0、浮點(diǎn)0.0、虛數(shù)0j等)可以映射為False,其它非零值映射為True;但是,反過來,F(xiàn)alse唯一映射整數(shù)0,True唯一映射整數(shù)1。

這意味著,可以拿False、True做數(shù)學(xué)運(yùn)算。

True + 1 >>>2
True + 1.0 >>>2.0
False + False >>>0
True + (True*2) >>>3
True/2*5 >>>2.5

兩個(gè)鋪墊之后,接下來進(jìn)入正題了。真正的前方高能!

第一個(gè)鋪墊告訴我們,對(duì)象可以映射成布爾值(True真False假),第二個(gè)鋪墊告訴我們,布爾值可以映射成數(shù)字(1和0)。

你是否覺察出什么了呢?你是否開始好奇,True和Flase到底是什么東西了呢?這到底是什么原理啊?還有,為什么會(huì)存在這樣的設(shè)定呢?

見證真相的時(shí)刻到了——在Python中,布爾值其實(shí)是整數(shù)對(duì)象的子類。

type(True) >>> bool
isinstance(True,int)  >>>True
isinstance(False,int) >>>True

啊!哪有什么真真假假,真假并不是本質(zhì)的存在,真假其實(shí)只是數(shù)啊!

再回看前面兩個(gè)鋪墊,結(jié)合起來,那不就是說,所有對(duì)象都映射成了數(shù)么?

我不由得想起了2500年前,古希臘哲學(xué)家與數(shù)學(xué)家畢達(dá)哥拉斯的哲學(xué)命題——萬物皆數(shù)

難道這竟是Python的哲學(xué)么?總不會(huì)是一種巧合吧?

我突然覺得智商不足,思辨受阻。得知布爾值True和False有這一層隱秘的身份,我已興奮不已,再難對(duì)這看似不合現(xiàn)代語境、卻又流傳千古的思想做出任何揣測(cè)。

哎呀,我貓性發(fā)作,突然困得要命,且容我去小憩片刻了~~~

各位親愛的讀者,在我休息的時(shí)候,請(qǐng)你來幫我想想,這到底是什么回事啊?

(未完待續(xù)......)

-----------------

本文原創(chuàng)并首發(fā)于微信公眾號(hào)【Python貓】,后臺(tái)回復(fù)“愛學(xué)習(xí)”,免費(fèi)獲得20+本精選電子書。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42667.html

相關(guān)文章

  • Python對(duì)象身份迷思全體公民萬物皆數(shù)

    摘要:真正的前方高能第一個(gè)鋪墊告訴我們,對(duì)象可以映射成布爾值真假,第二個(gè)鋪墊告訴我們,布爾值可以映射成數(shù)字和。得知布爾值和有這一層隱秘的身份,我已興奮不已,再難對(duì)這看似不合現(xiàn)代語境卻又流傳千古的思想做出任何揣測(cè)。 這么久以來,我終于確認(rèn)了一件事,那就是不管是人也好,還是貓也好,常常會(huì)忘了想自己當(dāng)下的身份位置,以及曾經(jīng)的身份位置。 這個(gè)現(xiàn)象在我身上,表現(xiàn)出了雙倍分量的嚴(yán)重。這種時(shí)刻,我就會(huì)想起...

    xzavier 評(píng)論0 收藏0
  • Python對(duì)象空間邊界:獨(dú)善其身與開放包容

    摘要:上表就是定長對(duì)象的一份名單。一旦邊界確定下來,它們絕不會(huì)允許越界行為。 showImg(https://segmentfault.com/img/bVbk60b?w=2135&h=1423);導(dǎo)讀:Python貓是一只喵星來客,它愛地球的一切,特別愛優(yōu)雅而無所不能的 Python。我是它的人類朋友豌豆花下貓,被授權(quán)潤色與發(fā)表它的文章。如果你是第一次看到這個(gè)系列文章,那我強(qiáng)烈建議,請(qǐng)先看...

    sunny5541 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

chunquedong

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<