Python設(shè)計模式 - 觀察者模式
"""觀察者模式:又叫發(fā)布-訂閱模式。
????它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時鑒定某一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,
會通知所有的觀察者對象,使它們能夠自動更新自己。
觀察者模式所做的工作實際上就是解耦,根據(jù)“依賴倒轉(zhuǎn)原則”,讓耦合的雙方都依賴于抽象,而不是依賴于具體,
從而使得各自的變化都不會影響另一邊的變化。
實際場景中存在的問題:現(xiàn)實中實際觀察者不一定有實現(xiàn)觀察者的通知回調(diào)方法。
解決之道:
1、為其封裝一個觀察類出來,實現(xiàn)相應(yīng)的接口。
2、修改通知類,讓具體觀察者的Notify函數(shù)直接去調(diào)用相應(yīng)的接口。
"""
class?Subject(object):
????def?__init__(self):
????????self._observers?=?[]
????def?attach(self,?observer):
????????if?observer?not?in?self._observers:
????????????self._observers.append(observer)
????def?detach(self,?observer):
????????try:
????????????self._observers.remove(observer)
????????except?:
????????????pass
????def?notify(self,?modifier=None):
????????for?observer?in?self._observers:
????????????if?modifier?!=?observer:
????????????????observer.update(self)
#用法示例
class?Data(Subject):
????def?__init__(self,?name=''):
????????Subject.__init__(self)
????????self.name?=?name
????????self._data?=?0
????@property
????def?data(self):
????????return?self._data
????@data.setter
????def?data(self,?value):
????????self._data?=?value
????????self.notify()
class?HexViewer:
????def?update(self,?subject):
????????print('十六進(jìn)制查看器:?主題?%s?有數(shù)據(jù)?0x%x'?%?(subject.name,?subject.data))
class?:
????def?update(self,?subject):
????????print('十進(jìn)制查看器:?主題?%s?有數(shù)據(jù)?%d'?%
??????????????(subject.name,?subject.data))
#?用法示例...
def?main():
????data1?=?Data('Data?1')
????data2?=?Data('Data?2')
????view1?=?()
????view2?=?HexViewer()
????data1.attach(view1)
????data1.attach(view2)
????data2.attach(view2)
????data2.attach(view1)
????print("設(shè)置數(shù)據(jù)1變量?=?10")
????data1.data?=?10
????print("設(shè)置數(shù)據(jù)2變量?=?15")
????data2.data?=?15
????print("設(shè)置數(shù)據(jù)1變量?=?3")
????data1.data?=?3
????print("設(shè)置數(shù)據(jù)2變量?=?5")
????data2.data?=?5
????print("從data1和data2分離HexViewer。")
????data1.detach(view2)
????data2.detach(view2)
????print("設(shè)置數(shù)據(jù)1變量?=?10")
????data1.data?=?10
????print("設(shè)置數(shù)據(jù)2變量?=?15")
????data2.data?=?15
if?__name__?==?'__main__':
????main()
Python設(shè)計模式:觀察者模式
觀察者設(shè)計模式是最簡單的行為模式之一。在觀察者設(shè)計模式中,對象(主題)維護了一個依賴(觀察者)列表,以便主題可以使用觀察者定義的任何方法通知所有觀察者它所發(fā)生的變化。
舉個生活中的小例子: 職員們趁老板不在,都在搞著自己與工作無關(guān)的事情,同時觀察著前臺小姐姐,前臺小姐姐在老板回來的時候,發(fā)布通知讓各同事回到工作狀態(tài)。
python中觀察者模式的作用
在現(xiàn)實國際中,許多方針并不是獨立存在的,其間一個方針的行為產(chǎn)生改動可能會導(dǎo)致一個或許多個其他方針的行為也產(chǎn)生改動。
這樣的例子還有許多,例如小偷與警察,貓和老鼠等
觀察者形式就如一個聊天室,當(dāng)你需要收到聊天室的音訊時,你就注冊成為聊天室的成員,當(dāng)聊天室有信息更新時,就會傳到你那去。當(dāng)你不需要接收聊天室的信息時,能夠注銷掉,退出聊天室。
2.形式的界說與特點
降低了方針與觀察者之間的耦合聯(lián)系,兩者之間是抽象耦合聯(lián)系。
方針與觀察者之間建立了一套觸發(fā)機制。
4.它的主要缺陷如下
經(jīng)過前面的分析與應(yīng)用實例可知觀察者形式適合以下幾種情形。
方針間存在一對多聯(lián)系,一個方針的狀況產(chǎn)生改動會影響其他方針。
當(dāng)一個抽象模型有兩個方面,其間一個方面依靠于另一方面時,可將這二者封裝在獨立的方針中以使它們能夠各自獨立地改動和復(fù)用。
有哪些 Python 經(jīng)典書籍
《深度學(xué)習(xí)入門》([ 日] 齋藤康毅)電子書網(wǎng)盤下載免費在線閱讀
資源鏈接:
鏈接: ?pwd=bhct 提取碼: bhct?
書名:深度學(xué)習(xí)入門
作者:[ 日] 齋藤康毅
譯者:陸宇杰
豆瓣評分:9.4
出版社:人民郵電出版社
出版年份:2021-7
頁數(shù):285
內(nèi)容簡介:本書是深度學(xué)習(xí)真正意義上的入門書,深入淺出地剖析了深度學(xué)習(xí)的原理和相關(guān)技術(shù)。書中使用Python3,盡量不依賴外部庫或工具,從基本的數(shù)學(xué)知識出發(fā),帶領(lǐng)讀者從零創(chuàng)建一個經(jīng)典的深度學(xué)習(xí)網(wǎng)絡(luò),使讀者在此過程中逐步理解深度學(xué)習(xí)。書中不僅介紹了深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的概念、特征等基礎(chǔ)知識,對誤差反向傳播法、卷積神經(jīng)網(wǎng)絡(luò)等也有深入講解,此外還介紹了深度學(xué)習(xí)相關(guān)的實用技巧,自動駕駛、圖像生成、強化學(xué)習(xí)等方面的應(yīng)用,以及為什么加深層可以提高識別精度等“為什么”的問題。
作者簡介:
齋藤康毅
東京工業(yè)*畢業(yè),并完成東京*研究生院課程?,F(xiàn)從事計算機視覺與機器學(xué)習(xí)相關(guān)的研究和開發(fā)工作。是 Python、Python in Practice、The Elements of Computing Systems、Building Machine Learning Systems with Python的日文版譯者。
譯者簡介:
陸宇杰
眾安科技NLP算法工程師。主要研究方向為自然語言處理及其應(yīng)用,對圖像識別、機器學(xué)習(xí)、深度學(xué)習(xí)等領(lǐng)域有密切關(guān)注。Python愛好者。
121 11 個案例掌握 Python 數(shù)據(jù)可視化--星際探索
星空是無數(shù)人夢寐以求想了解的一個領(lǐng)域,遠(yuǎn)古的人們通過肉眼觀察星空,并制定了太陰歷,指導(dǎo)農(nóng)業(yè)發(fā)展。隨著現(xiàn)代科技發(fā)展,有了更先進(jìn)的設(shè)備進(jìn)行星空的探索。本實驗獲取了美國*航空航天局(NASA)官網(wǎng)發(fā)布的地外行星數(shù)據(jù),研究及可視化了地外行星各參數(shù)、尋找到了一顆類地行星并研究了天體參數(shù)的相關(guān)關(guān)系。
輸入并執(zhí)行魔法命令 % inline, 設(shè)置全局字號,去除圖例邊框,去除右側(cè)和頂部坐標(biāo)軸。
本數(shù)據(jù)集來自 NASA,行星發(fā)現(xiàn)是 NASA 的重要工作之一,本數(shù)據(jù)集搜集了 NASA 官網(wǎng)發(fā)布的 4296 顆行星的數(shù)據(jù),本數(shù)據(jù)集字段包括:
導(dǎo)入數(shù)據(jù)并查看前 5 行。
截至 2021 年 10 月 22 日 全球共發(fā)現(xiàn) 4296 顆行星,按年聚合并繪制年度行星發(fā)現(xiàn)數(shù),并在左上角繪制 NASA 的官方 LOGO 。
從運行結(jié)果可以看出,2005 年以前全球行星發(fā)現(xiàn)數(shù)是非常少的,經(jīng)計算總計 173 顆,2014 和 2016 是行星發(fā)現(xiàn)成果最多的年份,2016 年度發(fā)現(xiàn)行星 1505 顆。
對不同機構(gòu)/項目/計劃進(jìn)行聚合并降序排列,繪制發(fā)現(xiàn)行星數(shù)目的前 20 。
2009 年至 2013 年,開普勒太空望遠(yuǎn)鏡成為有史以來最成功的系外行星發(fā)現(xiàn)者。在一片天空中至少找到了 1030 顆系外行星以及超過 4600 顆疑似行星。當(dāng)機械故障剝奪了該探測器對于恒星的精確定位功能后,地球上的工程師們于 2014 年對其進(jìn)行了徹底改造,并以 K2 計劃命名,后者將在更短的時間內(nèi)搜尋宇宙的另一片區(qū)域。
對發(fā)現(xiàn)行星的方式進(jìn)行聚合并降序排列,繪制各種方法發(fā)現(xiàn)行星的比例,由于排名靠后的幾種方式發(fā)現(xiàn)行星數(shù)較少,因此不顯示其標(biāo)簽。
行星在宇宙中并不會發(fā)光,因此無法直接觀察,行星發(fā)現(xiàn)的方式多為間接方式。從輸出結(jié)果可以看出,發(fā)現(xiàn)行星主要有以下 3 種方式,其原理如下:
針對不同的行星質(zhì)量,繪制比其質(zhì)量大(或者小)的行星比例,由于行星質(zhì)量量綱分布跨度較大,因此采用對數(shù)坐標(biāo)。
從輸出結(jié)果可以看出,在已發(fā)現(xiàn)的行星中,96.25% 行星的質(zhì)量大于地球。(圖中橫坐標(biāo)小于 e 的紅色面積非常?。?/p>
通過 sns.distplot 接口繪制全部行星的質(zhì)量分布圖。
從輸出結(jié)果可以看出,所有行星質(zhì)量分布呈雙峰分布,*個峰在 1.8 左右(此處用了對數(shù)單位,表示大約 6 個地球質(zhì)量),第二個峰在 6.2 左右(大概 493 個地球質(zhì)量)。
針對不同發(fā)現(xiàn)方式發(fā)現(xiàn)的行星,繪制各行星的公轉(zhuǎn)周期和質(zhì)量的關(guān)系。
從輸出結(jié)果可以看出:徑向速度(Radial Velocity)方法發(fā)現(xiàn)的行星在公轉(zhuǎn)周期和質(zhì)量上分布更寬,而凌日(Transit)似乎只能發(fā)現(xiàn)公轉(zhuǎn)周期相對較短的行星,這是因為兩種方法的原理差異造成的。對于公轉(zhuǎn)周期很長的行星,其運行到恒星和觀察者之間的時間也較長,因此凌日發(fā)現(xiàn)此類行星會相對較少。而徑向速度與其說是在發(fā)現(xiàn)行星,不如說是在觀察恒星,由于恒星自身發(fā)光,因此其觀察機會更多,發(fā)現(xiàn)各類行星的可能性更大。
針對不同發(fā)現(xiàn)方式發(fā)現(xiàn)的行星,繪制各行星的距離和質(zhì)量的關(guān)系。
從輸出結(jié)果可以看出,凌日和徑向速度對距離較為敏感,遠(yuǎn)距離的行星大多是通過凌日發(fā)現(xiàn)的,而近距離的行星大多數(shù)通過徑向速度發(fā)現(xiàn)的。原因是:近距離的行星其引力對恒星造成的擺動更為明顯,因此更容易觀察;當(dāng)距離較遠(yuǎn)時,引力作用變?nèi)?,擺動效應(yīng)減弱,因此很難借助此方法觀察到行星。同時,可以觀察到當(dāng)行星質(zhì)量更大時,其距離分布相對較寬,這是因為雖然相對恒星的距離變長了,但是由于行星質(zhì)量的增加,相對引力也同步增加,恒星擺動效應(yīng)會變得明顯。
將所有行星的質(zhì)量和半徑對數(shù)化處理,繪制其分布并擬合其分布。
由于:
因此,從原理上質(zhì)量對數(shù)與半徑對數(shù)應(yīng)該是線性關(guān)系,且斜率為定值 3 ,截距的大小與密度相關(guān)。
從輸出結(jié)果可以看出:行星質(zhì)量和行星半徑在對數(shù)變換下,具有較好的線性關(guān)系。輸出 fix_xy 數(shù)值可知,其關(guān)系可以擬合出如下公式:
擬合出曲線對應(yīng)的行星平均密度為:
同樣的方式繪制恒星質(zhì)量與半徑的關(guān)系。
從輸出結(jié)果可以看出,恒星與行星的規(guī)律不同,其質(zhì)量與半徑在對數(shù)下呈二次曲線關(guān)系,其關(guān)系符合以下公式:
同樣的方式研究恒星表面重力加速度與半徑的關(guān)系。
從輸出結(jié)果可以看出,恒星表面對數(shù)重力加速度與其對數(shù)半徑呈現(xiàn)較好的線性關(guān)系:
以上我們分別探索了各變量的分布和部分變量的相關(guān)關(guān)系,當(dāng)數(shù)據(jù)較多時,可以通過 pd.plotting.scatter_matrix 接口,直接繪制各變量的分布和任意兩個變量的散點圖分布,對于數(shù)據(jù)的初步探索,該接口可以讓我們迅速對數(shù)據(jù)全貌有較為清晰的認(rèn)識。
通過行星的半徑和質(zhì)量,恒星的半徑和質(zhì)量,以及行星的公轉(zhuǎn)周期等指標(biāo)與地球的相似性,尋找諸多行星中最類似地球的行星。
從輸出結(jié)果可以看出,在 0.6 附近的位置出現(xiàn)了一個*的圓圈,那就是我們找到的類地行星 Kepler - 452 b ,讓我們了解一下這顆行星:
數(shù)據(jù)顯示,Kepler - 452 b 行星公轉(zhuǎn)周期為 384.84 天,半徑為 1.63 地球半徑,質(zhì)量為 3.29 地球質(zhì)量;它的恒星為 Kepler - 452 半徑為太陽的 1.11 倍,質(zhì)量為 1.04 倍,恒星方面數(shù)據(jù)與太陽相似度極高。
以下內(nèi)容來自百度百科。 開普勒452b(Kepler 452b) ,是美國*航空航天局(NASA)發(fā)現(xiàn)的外行星, 直徑是地球的 1.6 倍,地球相似指數(shù)( ESI )為 0.83,距離地球1400光年,位于為天鵝座。
2015 年 7 月 24 日 0:00,美國*航空航天局 NASA 舉辦媒體電話會議宣稱,他們在天鵝座發(fā)現(xiàn)了一顆與地球相似指數(shù)達(dá)到 0.98 的類地行星開普勒 - 452 b。這個類地行星距離地球 1400 光年,繞著一顆與太陽非常相似的恒星運行。開普勒 452 b 到恒星的距離,跟地球到太陽的距離相同。NASA 稱,由于缺乏關(guān)鍵數(shù)據(jù),現(xiàn)在不能說 Kepler - 452 b 究竟是不是“另外一個地球”,只能說它是“迄今最接近另外一個地球”的系外行星。
在銀河系經(jīng)緯度坐標(biāo)下繪制所有行星,并標(biāo)記地球和 Kepler - 452 b 行星的位置。
類地行星,是人類寄希望移民的第二故鄉(xiāng),但即使最近的 Kepler-452 b ,也與地球相聚 1400 光年。
以下通過行星的公轉(zhuǎn)周期和質(zhì)量兩個特征將所有行星聚為兩類,即通過訓(xùn)練獲得兩個簇心。
定義函數(shù)-計算距離
聚類距離采用歐式距離:
定義函數(shù)-訓(xùn)練簇心
訓(xùn)練簇心的原理是:根據(jù)上一次的簇心計算所有點與所有簇心的距離,任一點的分類以其距離最近的簇心確定。依此原理計算出所有點的分類后,對每個分類計算新的簇心。
定義函數(shù)預(yù)測分類
根據(jù)訓(xùn)練得到的簇心,預(yù)測輸入新的數(shù)據(jù)特征的分類。
開始訓(xùn)練
隨機生成一個簇心,并訓(xùn)練 15 次。
繪制聚類結(jié)果
以*一次訓(xùn)練得到的簇心為基礎(chǔ),進(jìn)行行星的分類,并以等高面的形式繪制各類的邊界。
從運行結(jié)果可以看出,所有行星被分成了兩類。并通過上三角和下三角標(biāo)注了每個類別的簇心位置。
聚類前
以下輸出了聚類前原始數(shù)據(jù)繪制的圖像。