前言 我們在用Python進行機器學習建模專案的時候,每個人都會有自己的一套專案檔案管理的習慣,我自己也有一套方法,是自己曾經踩過的坑踩過的雷總結出來的,現在在這里分享一下給大家,因為很多伙伴是接觸Python編程入門不久,也希望大家少走彎路,多少有些地方可以給大家借鑒, 每天都有程式員定時講解Python技術,分享一些學習的方法和需要留意的小細節,要資料加 624440745 文章目錄 1. 專案檔案事先做好歸檔 2. 永遠不要手動修改源資料并且做好備份 3. 做好路徑的正確配置 4. 代碼必要的地方做好備注與說明 5. 加速你的Python回圈代碼 6. 可視化你的回圈代碼進度 7. 使用高效的例外捕獲工具 8. 要多考慮代碼健壯性 1. 專案檔案事先做好歸檔 每次開始一個新作業的時候,以前的我總是貪圖方便,Code、Data、檔案都集中放在一個檔案夾內,看起來很亂,一度讓回溯程序十分痛苦,或者是換了部電腦,檔案全都運行不行了,需要自行修改路徑,十分痛苦, 經過自己一番探索,大家可以大致將專案分成幾個子檔案夾,code放在主檔案夾里: 2. 永遠不要手動修改源資料并且做好備份 我們需要對源資料進行好備份,方便我們下一次進行回溯,可以進行下一步的操作或者是對中間步驟的修改,而且,對代碼等其他檔案也是需要做好備份的,以免出現意外丟失, 這里來自良許Linux 的一篇文章,推薦了4個工具: Git版本控制系統 Rsync檔案備份 Dropbox云存盤 Time Machine時光機器 更多的工具介紹和使用我這邊就不展開,大家可以去自行了解唄, 3. 做好路徑的正確配置 很多同學在寫路徑的時候都很喜歡直接用絕對路徑,雖然一般情況下不會有什么問題,但如果代碼共享給其他人學習或者運行的時候,問題就來了,很多情況下都不能直接跑通, 建議: 使用相對路徑:腳本位于主目錄下,其他資源(如資料、第三方包等)在其同級或低級目錄下,如 ./data/processed/test1.csv 全域路徑配置變數: # 設定主目錄 HOME_PATH = r'E:ML90615- PROJECT1' # 讀取資料 data = https://www.cnblogs.com/shabge/p/open(HOME_PATH+'/data/processed/test1.csv') data = https://www.cnblogs.com/shabge/p/pd.read_csv(data) data.head() 4. 代必要的地方做好備注與說明 這個我相信大多數人都感同身受了,不信?拿回一個月前自己寫的代碼看看吧,看一下能看懂多少(如果沒有做好備注說明的話) 5. 加速你的Python回圈代碼 Ps:很多人在學習Python的程序中,往往因為遇問題解決不了或者沒好的教程從而導致自己放棄,為此我整理啦從基礎的python腳本到web開發、爬蟲、django、資料挖掘等【PDF等】需要的可以進Python全堆疊開發交流.裙 :一久武其而而流一思(數字的諧音)轉換下可以找到了,里面有最新Python教程專案可拿,不懂的問題有老司機解決哦,一起相互監督共同進步 6. 可視化你的回圈代碼進度 這里介紹一個Python庫,tqdm,先安裝一下:pip install tqdm 這個是一個可以顯示回圈進度的庫,有了它就可以更加運籌帷幄了, 大家可以看下面的例子: 7. 使用高效的例外捕獲工具 例外bug定位,以前的我經常也是一條print()函式走到底,雖然說也沒什么問題,但效率上還是會比較慢,后來發現了一個叫PySnooper的裝飾器,仿佛發現了新大陸, 我們一般debug,都是在我們可能覺得會有問題的地方,去列印輸出,看下實際輸出了什么,然后思考問題所在,這需要我們去改code,非常細致地改,相比較直接加個裝飾器,是十分麻煩的, 大家可以看看Example: import pysnooper @pysnooper.snoop('./file.log') def number_to_bits(number): if number: bits = [] while number: number, remainder = divmod(number, 2) bits.insert(0, remainder) return bits else: return [0] number_to_bits(6) 我們把函式每一步的輸出都保存為file.log,我們可以直接去看到底哪里出了問題, 8. 要多考慮代碼健壯性 何為代碼的健壯性,顧名思義,就是可以抵擋得住各種例外場景的測驗,例外處理作業由“捕獲”和“拋出”兩部分組成,“捕獲”指的是使用 try … except 包裹特定陳述句,妥當的完成錯誤流程處理,而恰當的使用 raise 主動“拋出”例外,更是優雅代碼里必不可少的組成部分,下面總結幾點供大家參考: 1知道要傳入的引數是什么,型別,個數 (例外處理,邏輯判斷) def add(a, b): if isinstance(a, int) and isinstance(b, int): return a+b else: return '引數型別錯誤' print(add(1, 2)) print(add(1, 'a')) 2)只做最精準的例外捕獲 我們有的時候想著讓腳本work才是王道,所以不管三七二十一就搞一個大大的try…except把整塊代碼包裹起來,但這樣很容易把原本該被拋出的 AttibuteError 吞噬了,從而給我們的 debug 程序增加了不必要的麻煩, 所以,我們永遠只捕獲那些可能會拋出例外的陳述句塊,而且盡量只捕獲精確的例外型別,而不是模糊的 Exception, from requests.exceptions import RequestException def save_website_title(url, filename): try: resp = requests.get(url) except RequestException as e: print(f'save failed: unable to get page content: {e}') return False # 這段正則操作本身就是不應該拋出例外的,所以我們沒必要使用 try 陳述句塊 # 假如 group 被誤打成了 grop 也沒關系,程式馬上就會通過 AttributeError 來 # 告訴我們, obj = re.search(r'<title>(.*)</title>', resp.text) if not obj: print('save failed: title tag not found in page content') return False title = obj.group(1) try: with open(filename, 'w') as fp: fp.write(title) except IOError as e: print(f'save failed: unable to write to file {filename}: {e}') return False else: return True 3)例外處理不應該喧賓奪主 像上一條說到的例外捕獲要精準,但如果每一個都很精準的話,其實我們的代碼里就會有很多try…except陳述句塊,以至于擾亂核心代碼,代碼整體閱讀性, 這里,我們可以利用背景關系管理器來改善我們的例外處理流程,簡化重復的例外處理邏輯, class raise_api_error: """captures specified exception and raise ApiErrorCode instead :raises: AttributeError if code_name is not valid """ def __init__(self, captures, code_name): self.captures = captures self.code = getattr(error_codes, code_name) def __enter__(self): # 該方法將在進入背景關系時呼叫 return self def __exit__(self, exc_type, exc_val, exc_tb): # 該方法將在退出背景關系時呼叫 # exc_type, exc_val, exc_tb 分別表示該背景關系內拋出的 # 例外型別、例外值、錯誤堆疊 if exc_type is None: return False if exc_type == self.captures: raise self.code from exc_val return False 在上面的代碼里,我們定義了一個名為 raise_api_error 的背景關系管理器,它在進入背景關系時什么也不做,但是在退出背景關系時,會判斷當前背景關系中是否拋出了型別為 self.captures 的例外,如果有,就用 APIErrorCode 例外類替代它, 使用背景關系管理器后,簡潔的代碼如下 def upload_avatar(request): """用戶上傳新頭像""" with raise_api_error(KeyError, 'AVATAR_FILE_NOT_PROVIDED'): avatar_file = request.FILES['avatar'] with raise_api_error(ResizeAvatarError, 'AVATAR_FILE_INVALID'), raise_api_error(FileTooLargeError, 'AVATAR_FILE_TOO_LARGE'): resized_avatar_file = resize_avatar(avatar_file) with raise_api_error(Exception, 'INTERNAL_SERVER_ERROR'): request.user.avatar = resized_avatar_file request.user.save() return HttpResponse({ 推薦我們的python學習基地,看老程式是如何學習的!從基礎的python腳本、爬蟲、django、資料挖掘等編程技術,作業經驗,還有前輩精心為學習python的小伙伴整理零基礎到專案實戰的資料,!每天都有程式員定時講解Python技術,分享一些學習的方法和需要留意的小細節,要資料加 624440745
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190813.html
標籤:Python
