Python學習周總結(18.03.12 - 03.16)

    本周是培訓的第三周褒搔,新知識點逐漸多了起來夷磕,程序的代碼量和復雜度遠勝之前,不過也能明顯的感覺到個人邏輯思維的提升亏拉、代碼編寫愈發(fā)的熟練扣蜻,本周涉及的知識點主要如下所示:
  1. 函數(shù)
  • 名字(同變量命名)

  • 參數(shù)、默認值及塘、可變參數(shù)(args, 組裝成元組)莽使、關鍵字參數(shù)(kwargs,組裝成字典)笙僚、命名關鍵字參數(shù)(號后的參數(shù)在傳參的時候必須有參數(shù)名)

  • 返回值(單個芳肌、多個亦可)

  • 嵌套定義(與C、C++等高級編程語言不同肋层,可以在一個函數(shù)里定義另一個函數(shù))

  • 高階函數(shù) f(g(x))

  • lambda函數(shù)(匿名函數(shù))亿笤、【閉包、偏函數(shù)槽驶、柯里化】

  • decorator - 裝飾器 / 包裝器(通過裝飾器修飾函數(shù)责嚷,讓函數(shù)在執(zhí)行過程中可以做更多額外的操作)

  1. 類和對象

面向對象三大特性:封裝,繼承掂铐,多態(tài)

靜態(tài)方法與類方法(以判斷三角形三條邊設置是否合理為例)

  • 靜態(tài)方法
    @staticmethod
    def is_valid(a, b, c):
    return a + b > c and a + c > b and b + c > a
  • 類方法(消息依舊是發(fā)給類 可以用cls做更多的事)
    @classmethod
    def is_valid(cls, a, b, c):
    print(cls)
    print(type(cls))
    return a + b > c and a + c > b and b + c > a

抽象類的定義
from abc import ABCMeta, abstractclassmethod
class GameObject(object, metaclass=ABCMeta):
def init(self, pos=(0,0), color=BLACK_COLOR):
self._pos = pos
self._color = color

@abstractclassmethod
def draw(self, screen):  # 抽象方法罕拂,規(guī)范子類行為
    pass

屬性訪問器與修改器(以奧特曼打小怪獸中的屬性hp為例)

  • 屬性訪問器
    @property
    def hp(self):
    return self._hp
    -屬性修改器
    @hp.setter
    def hp(self, hp):
    self._hp = hp if hp > 0 else 0

類與類、對象與對象之間的關系

  • has-a --> 普通關聯(lián) - 聚合(強關聯(lián)) - 合成(不可分割)(從左到右由弱到強)
  • use-a --> 依賴關系
  • is-a --> 繼承關系

程序設計原則

  • 高內聚:函數(shù)(類)只做一件事件(單一職責原則)
  • 低耦合:代碼塊之間不能產生強關聯(lián)關系全陨,不要和特定的運行環(huán)境緊密耦合在一起
    爆班,迪米特法則(最少知識原則)

面向對象原則

  • 單一職責原則(Single Responsibility Principle, SRP)
  • 開閉原則(Open Close Principle, OCP)(對擴展開放,對修改關閉)
  • 依賴倒置原則(Dependence Inversion Principle, DIP)(模塊間的依賴通過抽象發(fā)生辱姨,實現(xiàn)類之間不發(fā)生直接的依賴關系柿菩,其依賴關系是通過接口或抽象類產生的)
  • 里氏替換原則(Liskov Substitution Principle, LSP)(子類替換父類)
  • 接口隔離原則(Interface Segregation Principles, ISP)(接口隔離原則的目的是系統(tǒng)解開耦合,從而容易重構雨涛、更改和重新部署 客戶端不應該依賴它不需要的接口)
  • 合成聚合復用原則(能使用強關聯(lián)的地方就不要使用繼承)
  • 迪米特法則(Law of Demeter, LOD)(最少知識原則)
  1. 異常機制
  • 即處理程序在運行過程中出現(xiàn)的意外狀況的手段枢舶,因為不是所有的問題都能夠在寫程序調試程序的時候就能發(fā)現(xiàn),代碼如下所示:
    try:
    # 把可能出狀況(在執(zhí)行時有風險)的代碼放到try代碼塊保護起來
    pass
    except IOError:
    # 如果try中出現(xiàn)了狀況就通過except來捕獲錯誤(異常)進行對應的處理
    print("讀寫文件發(fā)生錯誤替久!")
    except FileNotFoundError:
    # except可以寫多個分別用于處理不同的異常狀況
    pass
    else:
    # 如果沒有出狀況那么可以把無風險的代碼放到else中執(zhí)行
    pass
    finally:
    # 不管程序正常還是異常最后這里的代碼一定會實現(xiàn)
    # 此處是最好的釋放外部資源的位置凉泄,因為這里的代碼總是會執(zhí)行
    pass
  1. Json
  • 即 javascript object notation (js對象表達式 有格式,半結構化的純文本)蚯根,用于傳輸字典后众、列表數(shù)據

json寫操作(字典-->字符串)
try:
with open("data.json","w",encoding="utf-8") as fs:
json.dump(mydict, fs) # mydict 為一字典
except IOError as e:
print(e)

json讀操作(字符串-->字典)
try:
with open("data.json","r",encoding="utf-8") as fs:
thy_dict = json.load(fs) # 讀字典
print(type(thy_dict))
print(thy_dict)
print(thy_dict["name"])
except IOError as e:
print(e)
print("處理結束!")

   除了基礎知識的講解,本周側重運用面向對象的思想來解決實際問題蒂誉,筆者也在緊跟課堂講解進度的同時教藻,對練習項目中待解決的問題進行了獨立思考,并給出了自己的實現(xiàn)右锨,下面就實現(xiàn)要點簡要的做一分享:

  1. 21點
  要點:
  1)玩家先摸牌括堤,計算機后摸牌(計算機分穩(wěn)健性(超過16分不再摸牌)和魯莽型(超過18分不再摸牌))
  2)每次摸牌前提示是否摸牌,摸牌后自動記錄點數(shù)并顯示牌面
  3)最終的結果分為:a. 玩家和計算機的點數(shù)和均超過21點绍移,兩方均爆痊臭,平局
                                     b. 玩家爆了,計算機未爆登夫,計算機勝
                                     c. 計算機爆了,玩家未爆允趟,玩家勝
                                     d. 計算機和玩家都未爆恼策,且玩家的點數(shù)和大于計算機,
                                     玩家勝
                                     e. 計算機和玩家都未爆潮剪,且玩家的點數(shù)和小于計算機涣楷,
                                     計算機勝
                                     f. 計算機和玩家都未爆,且玩家的點數(shù)和等于計算機抗碰,
                                     平局
                                     
  2. 五子棋
  要點:
  1)勝負裁決:以最后下的一顆棋子的坐標為基準狮斗,通過判斷垂直,水平,主對角線,斜對角線四個方向來判斷輸贏,每個方向讀取10顆棋的信息弧蝇,若有連續(xù)5顆及以上為同色棋碳褒,則判定為贏。 以水平方向為例看疗,倘若當前的棋子為黑棋沙峻,先從右至左依次掃描該棋左邊的五顆棋,被掃描的棋子為黑棋两芳,則計數(shù)器加一摔寨,否則停止掃描。然后從左至右掃描該棋右邊的五顆棋怖辆,處理方式同上是复。最終計數(shù)器的累計計數(shù)大于等于五,則可判定為贏
  2)若勝負已分竖螃,在屏幕上顯示結果淑廊,除非開啟新局,否則不允許再次下棋:
        a) 顯示結果:判定為贏后斑鼻,加入文字顯示語句即可蒋纬,具體如下:
          ZiTiDuiXiang = pygame.font.SysFont('SimHei', 32)
          WenBenKuangDuiXiang = ZiTiDuiXiang.render("Black win! once        again(y/n)" if is_black else  "White win! once again(y/n)", True, [0,0,0])
          KuangDuiXiang = WenBenKuangDuiXiang.get_rect()
          KuangDuiXiang.center = (300, 300)
          screen.blit(WenBenKuangDuiXiang, KuangDuiXiang)
          pygame.display.update()
        b) 開啟新局前停止下棋:增加標記flag=1, 置于鼠標單擊判斷語句處,若勝負已分,則修改flag=0,此時單擊鼠標便失效
        c) 開啟新局或結束游戲:增加按鍵事件判斷蜀备,若按下y鍵关摇,表明重新開局,修改flag = 1,同時重置棋面碾阁,如果按下其他鍵输虱,則修改running = False,停止處理事件庫中的事件脂凶,并執(zhí)行到pygame.quit()語句宪睹,關閉游戲界面

  3. 大球吃小球
  要點:
  1)吃球操作:增加方法eat(self, other) self代表指定球自身,而other代表球列表蚕钦,注意亭病,只有列表中的元素個數(shù)大于等于2時才可進行吃球操作。順序掃描球列表中的元素嘶居,如果被掃描的球的半徑小于指定球罪帖,且兩個球的球心距離小于半徑之和,則執(zhí)行指定球吃被掃描球的操作邮屁,具體來說整袁,先將兩球的面積相加,以此為基準計算出一個新半徑并賦給指定球佑吝,最后從球列表中移除被掃描球坐昙,結束本次吃球操作。如果被掃描球的半徑大于指定球芋忿,且兩個球的球心距離小于半徑之和炸客,則操作與上述相反
  2)防止產生球的橫向或縱向速度為0:執(zhí)行下列代碼即可:
  while sy == 0 or sx == 0:
        sx, sy = randint(-10,10), randint(-10,10)

  4. 貪吃蛇
  要點:
  1)判斷蛇是否吃到了自己:若吃到自己,也只能吃第四個節(jié)點以后的節(jié)點盗飒,所以從第五個節(jié)點開始遍歷嚷量,若被遍歷到的節(jié)點與頭節(jié)點的坐標相同,則表明蛇吃到了自己逆趣,修改蛇的_is_alive屬性為False即可
  2)吃食物計數(shù):設置一個專門計數(shù)的變量即可蝶溶,至于計數(shù)的顯示,具體可參照五子棋的文字顯示方法宣渗。注意每局結束后計數(shù)要清零
  3)食物的產生位置不能位于蛇身上:產生一個食物坐標抖所,循環(huán)與蛇節(jié)點的每一個坐標進行比較,沒有相同的則成功痕囱,否則重新產生一個食物坐標

  下周將迎來網絡編程的學習及前一階段的考核田轧,感覺并不慌,因為最終想做一個涉及機器學習鞍恢、數(shù)據分析的大項目用作畢設傻粘,希望老師在后期課程的講解過程中穿插推薦一些機器學習的自學方法及目前該領域的一些切實可行的創(chuàng)新點每窖,筆者希望能提早為畢設做準備,以免到時手足無措
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末弦悉,一起剝皮案震驚了整個濱河市窒典,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稽莉,老刑警劉巖瀑志,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異污秆,居然都是意外死亡劈猪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門良拼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來战得,“玉大人,你說我怎么就攤上這事庸推」北埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵予弧,是天一觀的道長。 經常有香客問我湖饱,道長掖蛤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任井厌,我火速辦了婚禮蚓庭,結果婚禮上,老公的妹妹穿的比我還像新娘仅仆。我一直安慰自己器赞,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布墓拜。 她就那樣靜靜地躺著港柜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咳榜。 梳的紋絲不亂的頭發(fā)上夏醉,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音涌韩,去河邊找鬼畔柔。 笑死,一個胖子當著我的面吹牛臣樱,可吹牛的內容都是我干的靶擦。 我是一名探鬼主播腮考,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼玄捕!你這毒婦竟也來了踩蔚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤桩盲,失蹤者是張志新(化名)和其女友劉穎寂纪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赌结,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捞蛋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柬姚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拟杉。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖量承,靈堂內的尸體忽然破棺而出搬设,到底是詐尸還是另有隱情,我是刑警寧澤撕捍,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布拿穴,位于F島的核電站,受9級特大地震影響忧风,放射性物質發(fā)生泄漏默色。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一狮腿、第九天 我趴在偏房一處隱蔽的房頂上張望腿宰。 院中可真熱鬧,春花似錦缘厢、人聲如沸吃度。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椿每。三九已至,卻和暖如春英遭,著一層夾襖步出監(jiān)牢的瞬間拖刃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工贪绘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留兑牡,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓税灌,卻偏偏與公主長得像均函,于是被迫代替她去往敵國和親亿虽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容

  • Python 面向對象Python從設計之初就已經是一門面向對象的語言苞也,正因為如此洛勉,在Python中創(chuàng)建一個類和對...
    順毛閱讀 4,218評論 4 16
  • 1、某一天你我暮年玲销,靜坐庭前输拇,賞花落,笑談浮生流年贤斜。 年輕的時候策吠,我們一起做點有意思的事業(yè),賺點錢瘩绒,活得瀟灑點猴抹。 ...
    陳如飛閱讀 2,227評論 0 1
  • 分享幾套bootstrap后臺模板【TP5版】,模板來源于網絡锁荔,需要的拿走洽糟。1、AdminLTE 2堕战、Bootst...
    Stilwell閱讀 330評論 0 2
  • 章節(jié)目錄 第六章:獨孤九劍 劍神回道:“喬島主誤會了,在下與這位獨孤小兄弟也是頭次見面拍霜≈龆” 獨孤求敗接道:“你這老...
    南語上閱讀 716評論 6 11