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