欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

新手入門Python編程的8個實用建議

系統 1969 0

前言

我們在用Python進行機器學習建模項目的時候,每個人都會有自己的一套項目文件管理的習慣,我自己也有一套方法,是自己曾經踩過的坑踩過的雷總結出來的,現在在這里分享一下給大家,因為很多伙伴是接觸Python編程入門不久,也希望大家少走彎路,多少有些地方可以給大家借鑒。

目錄先放出來

  • 項目文件事先做好歸檔
  • 永遠不要手動修改源數據并且做好備份
  • 做好路徑的正確配置
  • 代碼必要的地方做好備注與說明
  • 加速你的Python循環代碼
  • 可視化你的循環代碼進度
  • 使用高效的異常捕獲工具
  • 要多考慮代碼健壯性

1. 項目文件事先做好歸檔

每次開始一個新工作的時候,以前的我總是貪圖方便,Code、Data、文檔都集中放在一個文件夾內,看起來很亂,一度讓回溯過程十分痛苦,或者是換了部電腦,文件全都運行不行了,需要自行修改路徑,十分痛苦。

經過自己一番探索,大家可以大致將項目分成幾個子文件夾,code放在主文件夾里:

新手入門Python編程的8個實用建議_第1張圖片

2. 永遠不要手動修改源數據并且做好備份

我們需要對源數據進行好備份,方便我們下一次進行回溯,可以進行下一步的操作或者是對中間步驟的修改,而且,對代碼等其他文件也是需要做好備份的,以免出現意外丟失。

這里來自良許Linux 的一篇文章,推薦了4個工具:

  • Git版本控制系統
  • Rsync文件備份
  • Dropbox云存儲
  • Time Machine時光機器

更多的工具介紹和使用我這邊就不展開,大家可以去自行了解唄。

3. 做好路徑的正確配置

很多同學在寫路徑的時候都很喜歡直接用絕對路徑,雖然一般情況下不會有什么問題,但如果代碼共享給其他人學習或者運行的時候,問題就來了,很多情況下都不能直接跑通,

這里建議:

  • 使用相對路徑:腳本位于主目錄下,其他資源(如數據、第三方包等)在其同級或低級目錄下,如 ./data/processed/test1.csv
  • 全局路徑配置變量:
            
# 設置主目錄
HOME_PATH = r'E:ML90615- PROJECT1'
# 讀取數據
data = open(HOME_PATH+'/data/processed/test1.csv')
data = pd.read_csv(data)
data.head()
          

4. 代碼必要的地方做好備注與說明

這個我相信大多數人都感同身受了,不信?拿回一個月前自己寫的代碼看看吧,看一下能看懂多少(如果沒有做好備注說明的話)

5. 加速你的Python循環代碼

這里推薦 云哥(Python與算法之美)的一篇文章:24式加速你的python

收藏起來,多看多幾次,養成好習慣唄,這樣子你寫代碼才會越來越快~

6. 可視化你的循環代碼進度

這里介紹一個Python庫,tqdm,先安裝一下:pip install tqdm

這個是一個可以顯示循環進度的庫,有了它就可以更加運籌帷幄了。

大家可以看下面的例子:

新手入門Python編程的8個實用建議_第2張圖片

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,我們可以直接去看到底哪里出了問題。

新手入門Python編程的8個實用建議_第3張圖片

項目地址:https://github.com/cool-RR/pysnooper

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'
            ', 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({})
          

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一区二区在线不卡 | 亚洲欧美v国产一区二区 | 午夜日韩 | 免费一级做a爰片性色毛片 狠狠色欧美亚洲狠狠色www | 黄色精品视频 | 一级一级一级一级毛片 | 成人97在线观看免费高清 | 一区二区精品在线 | 午夜专区| 日韩第一区 | 日韩激情中文字幕一区二区 | 黄色小视频在线看 | 最新国产视频 | 久久精品免费视频观看 | 天天拍夜夜添久久精品中文 | 国产免费观看视频 | 国产亚洲精品综合在线网址 | 作爱视频免费观看 | 欧美日韩一区不卡 | 2021最新国产成人精品视频 | 免费精品 | 日韩美女一区二区三区在线观看 | 日本黄色大片免费看 | 久久久久国产精品 | 天天插天天操 | 国产精品久久久久久久久久久久 | 亚洲成人网页 | 国产精品综合视频 | 草草视频在线观看 | 久久精品中文 | 欧美精品一区二区三区蜜桃视频 | 久草视频在线资源 | 欧美精品18| 国产精品嫩草影视在线观看 | 色网站综合| 浮力影院最新网址 | 国产精品一区在线观看你懂的 | 嫩草影院免费 | 日韩欧美国产偷亚洲清高 | 欧美色综合网 | 我要看真正的免费毛片 |