一行只寫(xiě)一條語(yǔ)句 明確勝于隱晦 |> 判斷代碼寫(xiě)的是否優(yōu)雅的一個(gè)..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

【Python】《Python編程之美 最佳實(shí)踐指南》讀書(shū)筆記

發(fā)布時(shí)間:2020-06-11 17:44:24 來(lái)源:網(wǎng)絡(luò) 閱讀:866 作者:對(duì)唔住 欄目:編程語(yǔ)言

草草的看了一遍,有些設(shè)計(jì)代碼講解地方因?yàn)槲业膶哟尾患?,尚不能理解?/p>

基本

  • 留白勝于緊湊 |> 一行只寫(xiě)一條語(yǔ)句
  • 明確勝于隱晦 |> 判斷代碼寫(xiě)的是否優(yōu)雅的一個(gè)規(guī)則是:其他開(kāi)發(fā)者是否只閱讀函數(shù)的首行和末行就能理解程序的作用
  • 錯(cuò)誤不應(yīng)被默默的忽略,除非你明確地忽視 |> 沒(méi)有指定任何異常類(lèi)型的except語(yǔ)句將捕獲所有的異常,會(huì)屏蔽鍵盤(pán)發(fā)出的KeyboradInterrupt,使得ctrl +c無(wú)法被正確響應(yīng)
  • *args的理由類(lèi)似,kwargs這類(lèi)強(qiáng)大的技術(shù)應(yīng)該用在真正需要之處。如果函數(shù)的意圖可以通過(guò)更簡(jiǎn)單更清晰的結(jié)構(gòu)來(lái)充分表達(dá),那么不應(yīng)該使用這類(lèi)技術(shù)。
  • 相比較于運(yùn)行速度,Python更在意代碼的可讀性,Python把用戶友好看的比性能更重

    函數(shù)

  • Python函數(shù)應(yīng)具有如下特點(diǎn)
      • 易讀:函數(shù)名稱和參數(shù)都無(wú)需解釋
      • 易改: 添加新的關(guān)鍵字參數(shù)不會(huì)破壞代碼其他參數(shù)
      • 盡量在移除返回函數(shù)結(jié)果,函數(shù)體的返回點(diǎn)越少越好,當(dāng)函數(shù)不能正確執(zhí)行時(shí),最好返回FalseNone
      • 一個(gè)函數(shù)只做一件事

        類(lèi)

    • 使用@property的目的是將函數(shù)與數(shù)據(jù)相分離

      自覺(jué)的編程習(xí)慣

  • Python中沒(méi)有private關(guān)鍵字
  • 私有屬性和實(shí)現(xiàn)細(xì)節(jié)的主要約定是為所有的內(nèi)部變量增加“_”前綴
  • 任何不開(kāi)放給外部使用的方法或者屬性,都應(yīng)帶下劃線前綴
  • 隨時(shí)都可以講私有屬性公有化,但是把公有化屬性私有化會(huì)困難很多
  • 訪問(wèn)字典時(shí),使用key in dict的判斷語(yǔ)法而不是dict.has_keys(),還可以使用dict.get()處理鍵值為空時(shí)的默認(rèn)值
  • 訪問(wèn)列表或者數(shù)組時(shí),使用enumerate()來(lái)生成元素位置,比手動(dòng)維護(hù)一個(gè) i += 1 in for 更pythonic
  • 如果解包是需要賦值,單又不需要其中的某個(gè)值,可以使用雙下劃線(__)來(lái)代替此位置的值。雙下劃線比單下劃線 更優(yōu)

  • 集合set比列表list的速度更快
  • 無(wú)法使用with結(jié)構(gòu)時(shí),可以使用try: do xx \nfinnally: do yy來(lái)代替

    模塊與包

  • 使用import *的代碼更難閱讀,依賴也難以區(qū)分
  • 如果包內(nèi)的模塊和子包不需要共享任何代碼,那么init.py文件留空是最佳實(shí)踐。
  • 依賴引入的兼容性處理
# 處理不同版本的包名不同,或者使用兼容包模擬另一個(gè)包
try:
    import functionXX
except ImportError:
    import python2_functionXX as functionXX

# 處理2和3不同包引入,設(shè)置可以預(yù)設(shè)2to3的兼容方案
import sys
if sys.version < "3":
    import python2_functionXX as functionXX
else:
  import functionXX

變量與類(lèi)型

  • Python是動(dòng)態(tài)類(lèi)型的語(yǔ)言,變量沒(méi)有一個(gè)固定的類(lèi)型。變量被實(shí)現(xiàn)為對(duì)象的指針
  • 復(fù)用變量名對(duì)代碼效率提升沒(méi)有任何幫助
  • 一個(gè)變量只賦值一次是良好的實(shí)踐
  • 變量命名示例:item_string = "sb" \n item_list= [250,520]
  • 可變類(lèi)型:允許in-place改變對(duì)象的內(nèi)容,例如列表和字典,都提供了append()或者pop()等變更自身的方法
  • 可變類(lèi)型不能用作字典的鍵,因?yàn)樽值湓阪I存儲(chǔ)時(shí)使用了哈希方式,不允許鍵發(fā)生變化
  • 字符串是不可變類(lèi)型
  • 字符拼接:

    sb = "me"
    sb2 = "you"
    string = "%s %s " %(sb,sb2) # 官方廢棄
    string = "{},{}".format(sb,sb2)
    string = "{0},{1}".format(sb,sb2) # 與C#的方式略有類(lèi)似
    string = "{people1},{people2}".format(people1=sb,people2=sb2) # 最佳風(fēng)格

    文檔

    • sphinx是最流行的Python文檔工具

內(nèi)部

  • Python調(diào)用棧包含當(dāng)前Python解釋器正在執(zhí)行的指令。如果函數(shù)f()調(diào)用了函數(shù)g(),那么函數(shù)f()會(huì)先入棧。待g()被調(diào)用時(shí)則會(huì)入棧壓到f()的上面。當(dāng)g()返回時(shí),它從棧中被彈出,f()會(huì)從原來(lái)中斷的位置繼續(xù)執(zhí)行。

代碼發(fā)布

  • 一般會(huì)使用PyInstaller去打包程序,PyInstaller會(huì)將程序用到的所有Python庫(kù)都放入dist文件夾,所以在分發(fā)可執(zhí)行文件時(shí),需要分發(fā)整個(gè)dist文件夾

    命令行應(yīng)用

  • argparse替代了已經(jīng)廢棄的optparse模塊,是Python標(biāo)準(zhǔn)庫(kù)內(nèi)置的包。最優(yōu)使用
  • docopt使用函數(shù)或者文件的doc位置設(shè)置命令行交互。
  • click使用注釋器的方式來(lái)實(shí)現(xiàn)命令交互編寫(xiě)
  • clint可以著色和便利的處理縮進(jìn)問(wèn)題

    GUI應(yīng)用

  • tkinter庫(kù)所有依賴已經(jīng)捆綁進(jìn)Python發(fā)行版
  • PyObjC可以提供OC接口,制作MacOS的專(zhuān)用程序

    WSGI服務(wù)器

  • 相比較于傳統(tǒng)的Web服務(wù)器(nginx,apache),wsgi服務(wù)器性能好,資源少。
  • 比較流行的的服務(wù)器有g(shù)unicorn,其使用配置比較簡(jiǎn)單

    代碼管理和改進(jìn)

  • 持續(xù)集成,tox |> 打包,測(cè)試,部署,Travis-CI |> 分布式持續(xù)集成,可與GitHub無(wú)縫集成并評(píng)論P(yáng)ull Request
  • 與Jenkins API進(jìn)行交互最常用的Python工具是python-jenkins
  • 服務(wù)器自動(dòng)化:ssh |> Ansible |> 最大的優(yōu)勢(shì)是不要求在客戶端上安裝Python以外的任何東西
  • 系統(tǒng)監(jiān)控: RawSystemInfo |> psutil > glances (擴(kuò)展版的top,比較綜合,信息全)
  • 系統(tǒng)任務(wù)管理:ssh |> Fabric

    速度優(yōu)化

  • threading 多線程,使用多線程,當(dāng)Python內(nèi)核發(fā)現(xiàn)某個(gè)線程正阻塞在I/O讀寫(xiě)上時(shí),會(huì)切換到另一個(gè)線程來(lái)使用處理器,直到這個(gè)線程也被阻塞和結(jié)束
  • mutliprocessing 多進(jìn)程,但是不同進(jìn)程之間的通信需要注意數(shù)據(jù)的共享安全
  • subprocess用于發(fā)起系統(tǒng)調(diào)用,推薦Python2用戶使用subprocess32版本,該版本修復(fù)了若干bug
  • PyPy 是Python的一個(gè)純Python實(shí)現(xiàn)。使用PyPy代碼不需要任何改動(dòng),就能運(yùn)行得更快。
  • future.concurrent 這個(gè)包裝了threading和mutliprocessing,用起來(lái)方便,但是性能略差。(個(gè)人看法)

    數(shù)據(jù)序列化

  • 將結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)化為能夠被共享或者存儲(chǔ)的格式,保留必要的信息傳輸數(shù)據(jù)的接收端(或者從存儲(chǔ)中讀取數(shù)據(jù)時(shí))能夠在內(nèi)存中重建對(duì)象
  • 可以讓被序化的數(shù)據(jù)占用最小化,便于最小化磁盤(pán)需求或者網(wǎng)絡(luò)帶寬需求
  • pickle模塊在遇到錯(cuò)誤和惡意結(jié)構(gòu)的數(shù)據(jù)時(shí)是不安全的,不要使用pickle對(duì)來(lái)源不明的數(shù)據(jù)進(jìn)行反序列化
  • 跨語(yǔ)言序列化可以使用谷歌的protobuf

    網(wǎng)絡(luò)編程

  • asyncio 提供異步事件循環(huán)來(lái)管理與非阻塞套接字或者隊(duì)列通信,以及任意用戶定義的協(xié)程。asyncio目前仍不成熟。臨時(shí)性的存在于標(biāo)準(zhǔn)庫(kù)中
  • gevent 因輕量,與底層C庫(kù)libev緊耦合,性能很高,而被廣泛使用
  • pika 提供一個(gè)清涼的AMQP客戶端,用于連接RabbitMQ或者其他消息代理
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI