最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

新手入門Python編程的8個(gè)實(shí)用建議

 更新時(shí)間:2019年07月12日 10:38:51   作者:千鋒Python唐唐君  
這篇文章主要介紹了Python編程的8個(gè)實(shí)用建議,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

我們?cè)谟肞ython進(jìn)行機(jī)器學(xué)習(xí)建模項(xiàng)目的時(shí)候,每個(gè)人都會(huì)有自己的一套項(xiàng)目文件管理的習(xí)慣,我自己也有一套方法,是自己曾經(jīng)踩過(guò)的坑踩過(guò)的雷總結(jié)出來(lái)的,現(xiàn)在在這里分享一下給大家,因?yàn)楹芏嗷锇槭墙佑|Python編程入門不久,也希望大家少走彎路,多少有些地方可以給大家借鑒。

目錄先放出來(lái)

  • 項(xiàng)目文件事先做好歸檔
  • 永遠(yuǎn)不要手動(dòng)修改源數(shù)據(jù)并且做好備份
  • 做好路徑的正確配置
  • 代碼必要的地方做好備注與說(shuō)明
  • 加速你的Python循環(huán)代碼
  • 可視化你的循環(huán)代碼進(jìn)度
  • 使用高效的異常捕獲工具
  • 要多考慮代碼健壯性

1. 項(xiàng)目文件事先做好歸檔

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

經(jīng)過(guò)自己一番探索,大家可以大致將項(xiàng)目分成幾個(gè)子文件夾,code放在主文件夾里:


2. 永遠(yuǎn)不要手動(dòng)修改源數(shù)據(jù)并且做好備份

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

這里來(lái)自良許Linux 的一篇文章,推薦了4個(gè)工具:

  • Git版本控制系統(tǒng)
  • Rsync文件備份
  • Dropbox云存儲(chǔ)
  • Time Machine時(shí)光機(jī)器

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

3. 做好路徑的正確配置

很多同學(xué)在寫路徑的時(shí)候都很喜歡直接用絕對(duì)路徑,雖然一般情況下不會(huì)有什么問題,但如果代碼共享給其他人學(xué)習(xí)或者運(yùn)行的時(shí)候,問題就來(lái)了,很多情況下都不能直接跑通,

這里建議:

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

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

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

5. 加速你的Python循環(huán)代碼

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

收藏起來(lái),多看多幾次,養(yǎng)成好習(xí)慣唄,這樣子你寫代碼才會(huì)越來(lái)越快~

6. 可視化你的循環(huán)代碼進(jìn)度

這里介紹一個(gè)Python庫(kù),tqdm,先安裝一下:pip install tqdm

這個(gè)是一個(gè)可以顯示循環(huán)進(jìn)度的庫(kù),有了它就可以更加運(yùn)籌帷幄了。

大家可以看下面的例子:


7. 使用高效的異常捕獲工具

異常bug定位,以前的我經(jīng)常也是一條print()函數(shù)走到底,雖然說(shuō)也沒什么問題,但效率上還是會(huì)比較慢,后來(lái)發(fā)現(xiàn)了一個(gè)叫PySnooper的裝飾器,仿佛發(fā)現(xiàn)了新大陸。

我們一般debug,都是在我們可能覺得會(huì)有問題的地方,去打印輸出,看下實(shí)際輸出了什么,然后思考問題所在,這需要我們?nèi)ジ腸ode,非常細(xì)致地改,相比較直接加個(gè)裝飾器,是十分麻煩的。

大家可以看看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)

我們把函數(shù)每一步的輸出都保存為file.log,我們可以直接去看到底哪里出了問題。


項(xiàng)目地址:https://github.com/cool-RR/pysnooper

8. 要多考慮代碼健壯性

何為代碼的健壯性,顧名思義,就是可以抵擋得住各種異常場(chǎng)景的測(cè)試,異常處理工作由“捕獲”和“拋出”兩部分組成?!安东@”指的是使用 try ... except 包裹特定語(yǔ)句,妥當(dāng)?shù)耐瓿慑e(cuò)誤流程處理。而恰當(dāng)?shù)氖褂?raise 主動(dòng)“拋出”異常,更是優(yōu)雅代碼里必不可少的組成部分,下面總結(jié)幾點(diǎn)供大家參考:

1)知道要傳入的參數(shù)是什么,類型,個(gè)數(shù) (異常處理,邏輯判斷)

def add(a, b):
 if isinstance(a, int) and isinstance(b, int):
 return a+b
 else:
 return '參數(shù)類型錯(cuò)誤'
print(add(1, 2))
print(add(1, 'a'))

2)只做最精準(zhǔn)的異常捕獲

我們有的時(shí)候想著讓腳本work才是王道,所以不管三七二十一就搞一個(gè)大大的try...except把整塊代碼包裹起來(lái),但這樣很容易把原本該被拋出的 AttibuteError 吞噬了。從而給我們的 debug 過(guò)程增加了不必要的麻煩。

所以,我們永遠(yuǎn)只捕獲那些可能會(huì)拋出異常的語(yǔ)句塊,而且盡量只捕獲精確的異常類型,而不是模糊的 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
# 這段正則操作本身就是不應(yīng)該拋出異常的,所以我們沒必要使用 try 語(yǔ)句塊
# 假如 group 被誤打成了 grop 也沒關(guān)系,程序馬上就會(huì)通過(guò) AttributeError 來(lái)
# 告訴我們。
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)異常處理不應(yīng)該喧賓奪主

像上一條說(shuō)到的異常捕獲要精準(zhǔn),但如果每一個(gè)都很精準(zhǔn)的話,其實(shí)我們的代碼里就會(huì)有很多try...except語(yǔ)句塊,以至于擾亂核心代碼,代碼整體閱讀性。

這里,我們可以利用上下文管理器來(lái)改善我們的異常處理流程,簡(jiǎn)化重復(fù)的異常處理邏輯。

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):
 # 該方法將在進(jìn)入上下文時(shí)調(diào)用
 return self
def __exit__(self, exc_type, exc_val, exc_tb):
 # 該方法將在退出上下文時(shí)調(diào)用
 # exc_type, exc_val, exc_tb 分別表示該上下文內(nèi)拋出的
 # 異常類型、異常值、錯(cuò)誤棧
 if exc_type is None:
 return False
 if exc_type == self.captures:
 raise self.code from exc_val
 return False

在上面的代碼里,我們定義了一個(gè)名為 raise_api_error 的上下文管理器,它在進(jìn)入上下文時(shí)什么也不做。但是在退出上下文時(shí),會(huì)判斷當(dāng)前上下文中是否拋出了類型為 self.captures 的異常,如果有,就用 APIErrorCode 異常類替代它。

使用上下文管理器后,簡(jiǎn)潔的代碼如下:

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python淺談一下線程間通信之隊(duì)列

    python淺談一下線程間通信之隊(duì)列

    本篇文章介紹了為什么需要線程間通信,以及通信方式有哪些,最后每種通信方式都舉了一個(gè)例子,最常用的還是共享變量的方式來(lái)進(jìn)行線程間通信。感興趣的朋友可以閱讀本文
    2023-04-04
  • 利用python模擬實(shí)現(xiàn)POST請(qǐng)求提交圖片的方法

    利用python模擬實(shí)現(xiàn)POST請(qǐng)求提交圖片的方法

    最近在利用python做接口測(cè)試,其中有個(gè)上傳圖片的接口,在網(wǎng)上各種搜索,各種嘗試。下面這篇文章主要給大家介紹了關(guān)于利用python模擬實(shí)現(xiàn)POST請(qǐng)求提交圖片的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-07-07
  • Python中不可錯(cuò)過(guò)的五個(gè)超有用函數(shù)

    Python中不可錯(cuò)過(guò)的五個(gè)超有用函數(shù)

    在本文中,我們用代碼詳細(xì)說(shuō)明了Python中超實(shí)用的5個(gè)函數(shù)的重要作用,這些函數(shù)雖然簡(jiǎn)單,但卻是Python中功能最強(qiáng)大的函數(shù),下面一起來(lái)看看文章的詳細(xì)介紹吧,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-01-01
  • Python跑循環(huán)時(shí)內(nèi)存泄露的解決方法

    Python跑循環(huán)時(shí)內(nèi)存泄露的解決方法

    這篇文章主要介紹了Python跑循環(huán)時(shí)內(nèi)存泄露的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • pandas中DataFrame排序及分組排序的實(shí)現(xiàn)示例

    pandas中DataFrame排序及分組排序的實(shí)現(xiàn)示例

    本文主要介紹了pandas中DataFrame排序及分組排序,pandas中的sort_values()函數(shù)原理類似于SQL中的order by,可以將數(shù)據(jù)集依照某個(gè)字段中的數(shù)據(jù)進(jìn)行排序,下面就來(lái)具體介紹一下,感興趣的可以了解一下
    2024-04-04
  • Python如何將大TXT文件分割成4KB小文件

    Python如何將大TXT文件分割成4KB小文件

    處理大文本文件是程序員經(jīng)常遇到的挑戰(zhàn),特別是當(dāng)我們需要把一個(gè)幾百M(fèi)B甚至幾個(gè)GB的TXT文件分割成小塊時(shí),下面我們來(lái)聊聊如何用Python自動(dòng)完成這個(gè)任務(wù)吧
    2025-04-04
  • 初學(xué)Python函數(shù)的筆記整理

    初學(xué)Python函數(shù)的筆記整理

    這篇文章主要介紹了初學(xué)Python函數(shù)的整理筆記,包括一些基礎(chǔ)的參數(shù)使用方法以及匿名函數(shù)等特性的使用,需要的朋友可以參考下
    2015-04-04
  • python判斷字符串以什么結(jié)尾的實(shí)例方法

    python判斷字符串以什么結(jié)尾的實(shí)例方法

    在本篇文章里小編給大家整理了關(guān)于python判斷字符串以什么結(jié)尾的實(shí)例方法 ,需要的朋友們可以學(xué)習(xí)參考下。
    2020-09-09
  • python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))

    python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù))

    這篇文章主要介紹了python 如何用urllib與服務(wù)端交互(發(fā)送和接收數(shù)據(jù)),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • python神經(jīng)網(wǎng)絡(luò)ShuffleNetV2模型復(fù)現(xiàn)詳解

    python神經(jīng)網(wǎng)絡(luò)ShuffleNetV2模型復(fù)現(xiàn)詳解

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)ShuffleNetV2模型復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

秭归县| 宜宾县| 科技| 冀州市| 伊吾县| 峨眉山市| 嘉禾县| 邓州市| 淮北市| 施甸县| 海原县| 浙江省| 拉萨市| 红河县| 广河县| 双鸭山市| 邳州市| 奉节县| 甘南县| 长丰县| 如东县| 洪泽县| 自治县| 濮阳市| 当雄县| 饶平县| 察隅县| 南漳县| 泰顺县| 收藏| 博白县| 平乐县| 张家川| 贺兰县| 崇信县| 鄄城县| 密云县| 团风县| 中西区| 都匀市| 建宁县|