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