成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

開(kāi)發(fā)5分鐘,調(diào)試2小時(shí) - 該如何debug?

Charles / 692人閱讀

摘要:但在開(kāi)發(fā)時(shí)不要使用異常處理,否則阻止了報(bào)錯(cuò)信息的發(fā)出,影響調(diào)試。的作用主要是確定程序的運(yùn)行路徑。二分查找法是一個(gè)定位問(wèn)題的技巧。

前言

幾年來(lái)我在答疑群、論壇、公眾號(hào)、知乎回答的各種問(wèn)題,沒(méi)有一萬(wàn)也有八千。其中有三分之二以上都是在幫人看報(bào)錯(cuò),幫人 debug(調(diào)試代碼) 。

可以說(shuō), 會(huì)不會(huì) debug,有沒(méi)有 debug 的意識(shí),懂不懂 debug 的技巧,是有沒(méi)有入門(mén)編程的重要標(biāo)志 。然而絕大多數(shù)的編程書(shū)籍和課程都不會(huì)強(qiáng)調(diào)這點(diǎn)。教的人和學(xué)的人都只關(guān)注明面上的知識(shí)點(diǎn),卻往往忽略了學(xué)習(xí)的本質(zhì)在于“授之以漁”。

在我們的 碼上行動(dòng)基礎(chǔ)課程 里,《 如何 debug 》是必須掌握的一個(gè)章節(jié)。后來(lái)發(fā)現(xiàn)不少有基礎(chǔ)的同學(xué)直接參與 爬蟲(chóng)課程 ,但同樣缺失 debug 的基本功,于是我又把 debug 作為前序章節(jié)加入到爬蟲(chóng)課程里。

為什么很多初學(xué)者會(huì)覺(jué)得編程論壇里的人都不大友好?我經(jīng)常對(duì)提問(wèn)者說(shuō):你這個(gè)問(wèn)題我無(wú)法回答,因?yàn)槟?缺少最基本的調(diào)試信息 。而如果你把調(diào)試信息提供到位了,基本也就不需要我回答了。歸根結(jié)底,是從來(lái)沒(méi)有人告訴過(guò)初學(xué)者, 你得先調(diào)試 。大部分人都是碰了很多次壁最后終于明白,啊多么痛的領(lǐng)悟!

今天我就從 debug 課程里挑選最關(guān)鍵的幾點(diǎn)講一下。不要光 mark,現(xiàn)在就看一遍, 嫌長(zhǎng)就看加粗高亮部分 。以后開(kāi)發(fā)中再遇到問(wèn)題,按照以下要點(diǎn)自查。

debug 自查方法 1. 選一個(gè)好的 IDE

初學(xué)者一半以上的問(wèn)題是 低級(jí)錯(cuò)誤 ,比如 縮進(jìn)錯(cuò)誤(空格、tab混用)、變量前后命名不一致(拼寫(xiě)錯(cuò)誤)、函數(shù)調(diào)用時(shí)傳遞的參數(shù)不對(duì)、少引號(hào)括號(hào)、用了中文全角 等等。這些人眼很難一下發(fā)現(xiàn)的錯(cuò)誤,代碼編輯器可以在寫(xiě)代碼的時(shí)候就給你提示出來(lái)。

如圖中,分別有一個(gè)函數(shù)名寫(xiě)錯(cuò)了、一個(gè)變量名拼錯(cuò)了,還有一個(gè) if 前面的空格我用了 Tab 鍵而不是 4 個(gè)空格。Pycharm 在你寫(xiě)代碼時(shí)就會(huì)給出高亮或者波浪線(xiàn)的提示,把鼠標(biāo)移上去還可以看到錯(cuò)誤的提示。否則這些錯(cuò)誤是很難被發(fā)現(xiàn)的。

另外,IDE 的一個(gè)重要功能就是可以 自動(dòng)補(bǔ)全代碼 ,省事而且不容易出錯(cuò)。

Python 自帶的 IDLE 在這方面做得并不好,剛起步時(shí)可以用用,上手后盡快轉(zhuǎn)。 個(gè)人推薦用 Pycharm ,即使是功能相對(duì)較少的 免費(fèi)社區(qū)版本 ,也足夠應(yīng)付開(kāi)發(fā)時(shí)需求。 VSCode 也是很好的選擇 。 之前有過(guò)兩篇介紹文章, 公眾號(hào)里回復(fù) pycharm 可查看

2. 學(xué)會(huì)看報(bào)錯(cuò)信息

絕大多數(shù)問(wèn)題不是直接在代碼層面就出現(xiàn)的,而是 運(yùn)行時(shí)才發(fā)生 。這時(shí)候正常都會(huì)導(dǎo)致 程序中斷并輸出報(bào)錯(cuò)信息 。一般從報(bào)錯(cuò)信息里就可以看出 報(bào)錯(cuò)的位置和原因 。

很多初學(xué)者怕看報(bào)錯(cuò)信息,這不行。即使英語(yǔ)不好,也嘗試著去看,套路就那么些,看幾次你就大概熟悉了,但對(duì)你調(diào)試的幫助非常大。

不過(guò)有時(shí)報(bào)錯(cuò)顯示的位置是有問(wèn)題的,這種情況通常的原因都是前面某一行的括號(hào)或者引號(hào)有問(wèn)題,而導(dǎo)致后面的代碼錯(cuò)亂。所以 如果報(bào)錯(cuò)指出的位置看不出問(wèn)題,試著往前看一看 。

在代碼中使用 try...except 可以避免程序因異常中斷。但在 開(kāi)發(fā)時(shí)不要使用異常處理 ,否則阻止了報(bào)錯(cuò)信息的發(fā)出,影響調(diào)試。

報(bào)錯(cuò)信息還有個(gè)用處就是 直接復(fù)制到搜索引擎里進(jìn)行搜索 ,而這方面 Google 的結(jié)果比百度要好,英文網(wǎng)站要比中文網(wǎng)站好。(怎樣用 Google 這個(gè)話(huà)題不便在此公開(kāi)討論。)

3. 別舍不得用 print

這一點(diǎn)是最重要的!

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

log 的作用主要是:

a. 確定程序的運(yùn)行路徑。 一個(gè)函數(shù)有沒(méi)有被調(diào)用,一個(gè) if 塊有沒(méi)有被執(zhí)行,一個(gè) while 循環(huán)執(zhí)行了幾次,到了哪一步中斷了,都可以通過(guò) print 出相關(guān)信息來(lái)查看。

b. 查看變量的狀態(tài)。 程序自身的報(bào)錯(cuò)會(huì)告訴你發(fā)生了什么錯(cuò)誤,但你還需要找出為什么會(huì)發(fā)生錯(cuò)誤。 通過(guò) print 輸出出錯(cuò)語(yǔ)句涉及到的相關(guān)變量的值和類(lèi)型 ,可以幫助分析出錯(cuò)原因。

c. 找出出錯(cuò)位置。 往往錯(cuò)誤的原因并不在報(bào)錯(cuò)的位置,所以多輸出一些標(biāo)記,多 print 不同位置的變量值, 查看變量在運(yùn)行過(guò)程中值的變化情況 ,可以觀(guān)察是在哪里發(fā)生了問(wèn)題。

幾個(gè)通過(guò) log 調(diào)試的經(jīng)驗(yàn)技巧:

a. 多輸出一些輔助信息 ,方便自己查看,不然一堆數(shù)據(jù)看花眼。比如我一般輸出時(shí)會(huì)標(biāo)注上 變量名,再輸出變量類(lèi)型,以及變量的值 。比如:

b. 在出錯(cuò)行之前輸出 。報(bào)錯(cuò)行涉及的一些變量,他們的數(shù)值和類(lèi)型,全都輸出出來(lái),看看和預(yù)期是否一致。

c. 一行做一件事 。如果你出錯(cuò)的一行里連續(xù)調(diào)用了多個(gè)函數(shù)或運(yùn)算,請(qǐng)分開(kāi)寫(xiě),分開(kāi)輸出。

d. 對(duì)于字符串 ,直接 print 會(huì)被轉(zhuǎn)義和解碼,影響對(duì)變量實(shí)際值的觀(guān)察??梢杂?print(repr(text)) 或 print([text]) 的方式查看。

e. 對(duì)于編碼問(wèn)題,用好 type 方法和 chardet 庫(kù)輔助判斷 。這點(diǎn)之前編碼相關(guān)的文章里有說(shuō)明, 公眾號(hào)里回復(fù) pycharm 可查看 。

f. 為了方便記錄和回溯問(wèn)題日志,通常也會(huì) 將 log 輸出到文件 。也有專(zhuān)門(mén)的 logging 模塊做這事。

記?。?print 不要錢(qián),能用多少是多少! 確保你清楚程序運(yùn)行的狀態(tài)細(xì)節(jié)。

4. 斷點(diǎn)調(diào)試

斷點(diǎn)調(diào)試看參考之前文章 如何在 Python 中使用斷點(diǎn)調(diào)試,這里不再?gòu)?fù)述。

debug 的思想和原則

前面這些基本是操作層面的具體 debug 方法,下面我再來(lái)談點(diǎn) debug 的思想和原則

1. 縮小出錯(cuò)的范圍

軟件開(kāi)發(fā)中有一個(gè)“單元測(cè)試”的概念:如果你寫(xiě)了一個(gè)函數(shù),應(yīng)該先運(yùn)行下這個(gè)函數(shù)是不是正常,各種參數(shù)下會(huì)不會(huì)出現(xiàn)錯(cuò)誤。這樣可以 把問(wèn)題控制在較小的范圍內(nèi) 解決。

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

比如做爬蟲(chóng)沒(méi)有抓到正確數(shù)據(jù),那么到底是 (1)請(qǐng)求來(lái)的數(shù)值不對(duì),還是 (2)文本處理方法不對(duì)?如果你認(rèn)為是文本處理方法沒(méi)有問(wèn)題,就手動(dòng)給定一個(gè)正確格式的字符串文本,應(yīng)該可以得到正確的結(jié)果。這就相當(dāng)于 控制了因素(2),只改變因素(1),根據(jù)執(zhí)行結(jié)果就可以確認(rèn)或排除問(wèn)題的所在 。

二分查找法是一個(gè)定位問(wèn)題的技巧。如果你的代碼里有問(wèn)題,那么問(wèn)題要么在前半段,要么在后半段。你先把后半段代碼去掉執(zhí)行,看看程序是否還報(bào)錯(cuò),就知道錯(cuò)誤在哪部分。依次類(lèi)推, 不斷折半,直到找到引發(fā)報(bào)錯(cuò)的代碼 。

3. 先重現(xiàn),再解決,最后驗(yàn)證

有的錯(cuò)誤不是每次出現(xiàn)。這時(shí)候最好別急著去改代碼,而是 想辦法可以穩(wěn)定重現(xiàn)問(wèn)題 。當(dāng)你能順利重現(xiàn)問(wèn)題的時(shí)候,通常離分析解決它也不遠(yuǎn)了。解決了之后, 再按照之前重現(xiàn)的方式驗(yàn)證修改 是否確實(shí)有效。

4. 想清楚再動(dòng)手

不論是開(kāi)發(fā)代碼,還是調(diào)試 debug,在做一個(gè)動(dòng)作前要清楚自己的目的是什么,而不是盲目地進(jìn)行改動(dòng)。 不要猜! 我經(jīng)常會(huì)看見(jiàn)一些新手遇到問(wèn)題之后,反復(fù)執(zhí)行代碼,或者不斷調(diào)整參數(shù),妄想某次執(zhí)行程序就能神奇地通過(guò)了。這是一個(gè)很不好的態(tài)度,請(qǐng)避免。 要恪守邏輯 ,知道現(xiàn)在要解決的問(wèn)題是什么,需要得到那些信息,可能的假設(shè)是什么,如何通過(guò)修改代碼去驗(yàn)證你的判斷,這樣才是合理的 debug 方式。

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

想要深入了解更多編程的思想和技巧,歡迎來(lái)我們的 碼上行動(dòng)知識(shí)星球 。

下課!

════

其他文章及回答:

如何自學(xué)Python | 新手引導(dǎo) | 精選Python問(wèn)答 | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲(chóng) | 我用Python | 高考 | requests | AI平臺(tái)

歡迎搜索及關(guān)注: Crossin的編程教室

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/42509.html

相關(guān)文章

  • 我們一直談?wù)摗皩?xiě)代碼”,但你會(huì)“讀代碼”嗎?

    摘要:只有能看懂代碼,你才能快速準(zhǔn)確地定位代碼中的問(wèn)題。要寫(xiě)出很的代碼,少不了閱讀優(yōu)秀的源碼。我們的論壇和答疑群里,有一些同學(xué)會(huì)查看并解答其他人的代碼問(wèn)題。實(shí)際上,我覺(jué)得就是沒(méi)看懂你只是看懂了每一行代碼的意思,但并沒(méi)有理解整個(gè)代碼的設(shè)計(jì)。 編程,又被稱(chēng)作 寫(xiě)代碼 。這個(gè)說(shuō)法有可能會(huì)帶來(lái)一點(diǎn)點(diǎn)誤解,讓人覺(jué)得如何寫(xiě)是學(xué)習(xí)編程要解決的主要問(wèn)題。但事實(shí)并非如此。盡管最終代碼要在鍵盤(pán)上敲出來(lái),但這個(gè)過(guò)...

    2i18ns 評(píng)論0 收藏0
  • 編程新手如何更好地提問(wèn)

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

    Salamander 評(píng)論0 收藏0
  • 我是如何在自學(xué)編程9個(gè)月后找到工作的

    摘要:昨天在我在國(guó)外網(wǎng)站上看到一篇文章,作者分享了他自學(xué)編程個(gè)月后找到工作的經(jīng)歷。而本文中,我主要針對(duì)想要通過(guò)學(xué)習(xí)編程找工作的角度來(lái)談。我在年月犯了一個(gè)錯(cuò)誤我認(rèn)為首要任務(wù)是找到一份前端開(kāi)發(fā)的工作。 昨天在我在國(guó)外網(wǎng)站 reddit 上看到一篇文章,作者分享了他 自學(xué)編程 9 個(gè)月后找到工作 的經(jīng)歷。文章不到一天就得到3千多贊,2百條回復(fù)。我看了下內(nèi)容,非常中肯,其中有不少建議也是我在編程教室...

    gaosboy 評(píng)論0 收藏0
  • Nginx location 配置踩坑過(guò)程分享

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

    alighters 評(píng)論0 收藏0
  • 本地測(cè)試沒(méi)問(wèn)題,機(jī)器人測(cè)試錯(cuò)誤的簡(jiǎn)單規(guī)避辦法

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

    stefan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<