Python核心編程:《8個實踐性建議》

前言
咱們在用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 = open(HOME_PATH+'/data/processed/test1.csv')
data = 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
return HttpResponse({
 
推薦咱們的 python學習基地,看老程序是如何學習的!從基礎的python腳本、爬蟲、django、數據挖掘等編程技術,工做經驗,還有前輩精心爲學習python的小夥伴整理零基礎到項目實戰的資料,!天天都有程序員定時講解Python技術,分享一些學習的方法和須要留意的小細節,要資料加 624440745
相關文章
相關標籤/搜索