国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

開發5分鐘,調試2小時 - 該如何debug?

Charles / 626人閱讀

摘要:但在開發時不要使用異常處理,否則阻止了報錯信息的發出,影響調試。的作用主要是確定程序的運行路徑。二分查找法是一個定位問題的技巧。

前言

幾年來我在答疑群、論壇、公眾號、知乎回答的各種問題,沒有一萬也有八千。其中有三分之二以上都是在幫人看報錯,幫人 debug(調試代碼)

可以說, 會不會 debug,有沒有 debug 的意識,懂不懂 debug 的技巧,是有沒有入門編程的重要標志 。然而絕大多數的編程書籍和課程都不會強調這點。教的人和學的人都只關注明面上的知識點,卻往往忽略了學習的本質在于“授之以漁”。

在我們的 碼上行動基礎課程 里,《 如何 debug 》是必須掌握的一個章節。后來發現不少有基礎的同學直接參與 爬蟲課程 ,但同樣缺失 debug 的基本功,于是我又把 debug 作為前序章節加入到爬蟲課程里。

為什么很多初學者會覺得編程論壇里的人都不大友好?我經常對提問者說:你這個問題我無法回答,因為你 缺少最基本的調試信息 。而如果你把調試信息提供到位了,基本也就不需要我回答了。歸根結底,是從來沒有人告訴過初學者, 你得先調試 。大部分人都是碰了很多次壁最后終于明白,啊多么痛的領悟!

今天我就從 debug 課程里挑選最關鍵的幾點講一下。不要光 mark,現在就看一遍, 嫌長就看加粗高亮部分 。以后開發中再遇到問題,按照以下要點自查。

debug 自查方法 1. 選一個好的 IDE

初學者一半以上的問題是 低級錯誤 ,比如 縮進錯誤(空格、tab混用)、變量前后命名不一致(拼寫錯誤)、函數調用時傳遞的參數不對、少引號括號、用了中文全角 等等。這些人眼很難一下發現的錯誤,代碼編輯器可以在寫代碼的時候就給你提示出來。

如圖中,分別有一個函數名寫錯了、一個變量名拼錯了,還有一個 if 前面的空格我用了 Tab 鍵而不是 4 個空格。Pycharm 在你寫代碼時就會給出高亮或者波浪線的提示,把鼠標移上去還可以看到錯誤的提示。否則這些錯誤是很難被發現的。

另外,IDE 的一個重要功能就是可以 自動補全代碼 ,省事而且不容易出錯。

Python 自帶的 IDLE 在這方面做得并不好,剛起步時可以用用,上手后盡快轉。 個人推薦用 Pycharm ,即使是功能相對較少的 免費社區版本 ,也足夠應付開發時需求。 VSCode 也是很好的選擇 。 之前有過兩篇介紹文章, 公眾號里回復 pycharm 可查看

2. 學會看報錯信息

絕大多數問題不是直接在代碼層面就出現的,而是 運行時才發生 。這時候正常都會導致 程序中斷并輸出報錯信息 。一般從報錯信息里就可以看出 報錯的位置和原因 。

很多初學者怕看報錯信息,這不行。即使英語不好,也嘗試著去看,套路就那么些,看幾次你就大概熟悉了,但對你調試的幫助非常大。

不過有時報錯顯示的位置是有問題的,這種情況通常的原因都是前面某一行的括號或者引號有問題,而導致后面的代碼錯亂。所以 如果報錯指出的位置看不出問題,試著往前看一看

在代碼中使用 try...except 可以避免程序因異常中斷。但在 開發時不要使用異常處理 ,否則阻止了報錯信息的發出,影響調試。

報錯信息還有個用處就是 直接復制到搜索引擎里進行搜索 ,而這方面 Google 的結果比百度要好,英文網站要比中文網站好。(怎樣用 Google 這個話題不便在此公開討論。)

3. 別舍不得用 print

這一點是最重要的!

在程序中輸出并分析 log(日志)是一種很基本但卻很靈活很有效的調試方式。使用 print 就是 log 的最常用方法。

log 的作用主要是:

a. 確定程序的運行路徑。 一個函數有沒有被調用,一個 if 塊有沒有被執行,一個 while 循環執行了幾次,到了哪一步中斷了,都可以通過 print 出相關信息來查看。

b. 查看變量的狀態。 程序自身的報錯會告訴你發生了什么錯誤,但你還需要找出為什么會發生錯誤。 通過 print 輸出出錯語句涉及到的相關變量的值和類型 ,可以幫助分析出錯原因。

c. 找出出錯位置。 往往錯誤的原因并不在報錯的位置,所以多輸出一些標記,多 print 不同位置的變量值, 查看變量在運行過程中值的變化情況 ,可以觀察是在哪里發生了問題。

幾個通過 log 調試的經驗技巧:

a. 多輸出一些輔助信息 ,方便自己查看,不然一堆數據看花眼。比如我一般輸出時會標注上 變量名,再輸出變量類型,以及變量的值 。比如:

b. 在出錯行之前輸出 。報錯行涉及的一些變量,他們的數值和類型,全都輸出出來,看看和預期是否一致。

c. 一行做一件事 。如果你出錯的一行里連續調用了多個函數或運算,請分開寫,分開輸出。

d. 對于字符串 ,直接 print 會被轉義和解碼,影響對變量實際值的觀察。可以用 print(repr(text)) 或 print([text]) 的方式查看。

e. 對于編碼問題,用好 type 方法和 chardet 庫輔助判斷 。這點之前編碼相關的文章里有說明, 公眾號里回復 pycharm 可查看 。

f. 為了方便記錄和回溯問題日志,通常也會 將 log 輸出到文件 。也有專門的 logging 模塊做這事。

記?。?print 不要錢,能用多少是多少! 確保你清楚程序運行的狀態細節。

4. 斷點調試

斷點調試看參考之前文章 如何在 Python 中使用斷點調試,這里不再復述。

debug 的思想和原則

前面這些基本是操作層面的具體 debug 方法,下面我再來談點 debug 的思想和原則

1. 縮小出錯的范圍

軟件開發中有一個“單元測試”的概念:如果你寫了一個函數,應該先運行下這個函數是不是正常,各種參數下會不會出現錯誤。這樣可以 把問題控制在較小的范圍內 解決。

2. 控制變量法 + 二分查找法

比如做爬蟲沒有抓到正確數據,那么到底是 (1)請求來的數值不對,還是 (2)文本處理方法不對?如果你認為是文本處理方法沒有問題,就手動給定一個正確格式的字符串文本,應該可以得到正確的結果。這就相當于 控制了因素(2),只改變因素(1),根據執行結果就可以確認或排除問題的所在 。

二分查找法是一個定位問題的技巧。如果你的代碼里有問題,那么問題要么在前半段,要么在后半段。你先把后半段代碼去掉執行,看看程序是否還報錯,就知道錯誤在哪部分。依次類推, 不斷折半,直到找到引發報錯的代碼

3. 先重現,再解決,最后驗證

有的錯誤不是每次出現。這時候最好別急著去改代碼,而是 想辦法可以穩定重現問題 。當你能順利重現問題的時候,通常離分析解決它也不遠了。解決了之后, 再按照之前重現的方式驗證修改 是否確實有效。

4. 想清楚再動手

不論是開發代碼,還是調試 debug,在做一個動作前要清楚自己的目的是什么,而不是盲目地進行改動。 不要猜! 我經常會看見一些新手遇到問題之后,反復執行代碼,或者不斷調整參數,妄想某次執行程序就能神奇地通過了。這是一個很不好的態度,請避免。 要恪守邏輯 ,知道現在要解決的問題是什么,需要得到那些信息,可能的假設是什么,如何通過修改代碼去驗證你的判斷,這樣才是合理的 debug 方式。

以上就是一些 debug 的基本思想和技巧。這里僅僅是概要精華,操作起來遠不止這么多,同時還需要實際的練習才能掌握。我能做的就是給你的編程技能樹下埋一顆種子,能不能生根發芽,就看各位自己的澆灌了。(我相信,即使我這里都說過了,還是會有很多人依舊犯上述提及的錯誤 ╮(╯_╰)╭ 隨緣吧,師傅領進門,修行在個人……)

想要深入了解更多編程的思想和技巧,歡迎來我們的 碼上行動知識星球 。

下課!

════

其他文章及回答:

如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺

歡迎搜索及關注: Crossin的編程教室

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42509.html

相關文章

  • 我們一直談論“寫代碼”,但你會“讀代碼”嗎?

    摘要:只有能看懂代碼,你才能快速準確地定位代碼中的問題。要寫出很的代碼,少不了閱讀優秀的源碼。我們的論壇和答疑群里,有一些同學會查看并解答其他人的代碼問題。實際上,我覺得就是沒看懂你只是看懂了每一行代碼的意思,但并沒有理解整個代碼的設計。 編程,又被稱作 寫代碼 。這個說法有可能會帶來一點點誤解,讓人覺得如何寫是學習編程要解決的主要問題。但事實并非如此。盡管最終代碼要在鍵盤上敲出來,但這個過...

    2i18ns 評論0 收藏0
  • 編程新手如何更好地提問

    摘要:如果你也曾遭遇這樣的問題,或今后打算在編程社區里成長,請務必看看我接下來要說的東西如何正確地在編程社區提問絕大部分得不到滿意回答甚至引來不滿的問題,都是問題本身的原因。對新手來說,的可能性更大。 學編程難免遇到問題,遇到問題難免要上網求助。然而有過不少同學向我訴苦,說 在網上提問沒有人回答,有的還收到一些不是很友好的回復 。我自己也在經常上的論壇上目睹過類似的帖子。以至于有人說,程序員...

    Salamander 評論0 收藏0
  • 我是如何在自學編程9個月后找到工作的

    摘要:昨天在我在國外網站上看到一篇文章,作者分享了他自學編程個月后找到工作的經歷。而本文中,我主要針對想要通過學習編程找工作的角度來談。我在年月犯了一個錯誤我認為首要任務是找到一份前端開發的工作。 昨天在我在國外網站 reddit 上看到一篇文章,作者分享了他 自學編程 9 個月后找到工作 的經歷。文章不到一天就得到3千多贊,2百條回復。我看了下內容,非常中肯,其中有不少建議也是我在編程教室...

    gaosboy 評論0 收藏0
  • Nginx location 配置踩坑過程分享

    摘要:所以到目前為止,基本可以肯定是的上出了一些問題。問題解決因篇幅有限,為了直面本次問題的核心,我不再貼出完整的配置,我簡化此次問題的模型。 這是五個小時與一個字符的戰斗 是的,作為一個程序員,你往往發現,有的時候你花費了數小時,數天,甚至數星期來查找問題,但最終可能只花費了數秒,改動了數行,甚至幾個字符就解決了問題。這次給大家分享一個困擾了我很久,我花了五個小時才查找出問題原因...

    alighters 評論0 收藏0
  • 本地測試沒問題,機器人測試錯誤的簡單規避辦法

    摘要:曲線救國既然只有機器人報錯,那么本地測試好后,可以考慮將機器人報錯的部分做排除。雖然好用,但卻不能自己定義具體的信息它的就那幾種,比如就一個打造自己的單元測試服務器迫在眉睫。接收到信息后,檢出相應的分支,執行單元測試,并將測試的結果推送給 本地環境可以跑通,但只要一上機器人環境,便會出現錯誤。一般這種情況都是由于本地與travis的JDK版本不一致造成的。然而,機器人又有日志大粘限制,...

    stefan 評論0 收藏0

發表評論

0條評論

Charles

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<