色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何讓你的Python編程中不出現反模式?避免初學Python常見的錯誤

馬哥Linux運維 ? 來源:未知 ? 作者:易水寒 ? 2018-09-24 10:38 ? 次閱讀

這篇文章收集了我在Python新手開發者寫的代碼中所見到的不規范但偶爾又很微妙的問題。

本文的目的是為了幫助那些新手開發者渡過寫出丑陋的Python代碼的階段。

對于那些新手開發者,總有一些使用反模式的理由,我已經嘗試在可能的地方給出了這些理由。

但通常這些反模式會造成代碼缺乏可讀性、更容易出bug且不符合Python的代碼風格。

迭代

range的使用

Python編程新手喜歡使用range來實現簡單的迭代,在迭代器的長度范圍內來獲取迭代器中的每一個元素:

應該牢記:range并不是為了實現序列簡單的迭代。相比那些用數字定義的for循環,雖然用range實現的for循環顯得很自然,但是用在序列的迭代上卻容易出bug,而且不如直接構造迭代器看上去清晰:

range的濫用容易造成意外的大小差一(off-by-one)錯誤,這通常是由于編程新手忘記了range生成的對象包括range的第一個參數而不包括第二個,類似于java中的substring和其他眾多這種類型的函數。那些認為沒有超出序列結尾的編程新手將會制造出bug:

不恰當地使用range的常見理由:1.需要在循環中使用索引

這并不是一個合理的理由,可以用以下方式代替使用索引:

2.需要同時迭代兩個循環,用同一個索引來獲取兩個值。

這種情況下,可以用zip來實現:

3.需要迭代序列的一部分。在這種情況下,僅需要迭代序列切片就可以實現,注意添加必要的注釋注明用意:

有一個例外:

當你迭代一個很大的序列時,切片操作引起的開銷就比較大。

如果序列只有10個元素,就沒有什么問題;但是如果有1000萬個元素時,或者在一個性能敏感的內循環中進行切片操作時,開銷就變得非常重要了。

這種情況下可以考慮使用xrange代替range [1]。

在用來迭代序列之外,range的一個重要用法是當你真正想要生成一個數字序列而不是用來生成索引:

正確使用列表解析

如果你有像這樣的一個循環:

你可以使用列表解析來重寫:

為什么要這么做?

一方面你避免了正確初始化列表可能帶來的錯誤,另一方面,這樣寫代碼讓看起來很干凈,整潔。

對于那些有函數式編程背景的人來說,使用map函數可能感覺更熟悉,但是在我看來這種做法不太Python化。

其他的一些不使用列表解析的常見理由:

1. 需要循環嵌套。

這個時候你可以嵌套整個列表解析,或者在列表解析中多行使用循環:

使用列表解析:

注意:在有多個循環的列表解析中,循環有同樣的順序就像你并沒有使用列表解析一樣。

2. 你在循環內部需要一個條件判斷。

你只需要把這個條件判斷添加到列表解析中去:

一個不使用列表解析的合理的理由是你在列表解析里不能使用異常處理。

如果迭代中一些元素可能引起異常,你需要在列表解析中通過函數調用轉移可能的異常處理,或者干脆不使用列表解析。

性能缺陷

在線性時間內檢查內容

在語法上,檢查list或者set/dict中是否包含某個元素表面上看起來沒什么區別,但是表面之下卻是截然不同的。

如果你需要重復檢查某個數據結構里是否包含某個元素,最好使用set來代替list。(如果你想把一個值和要檢查的元素聯系起來,可以使用dict;這樣同樣可以實現常數檢查時間。)

Python中set的元素和dict的鍵值是可哈希的,因此查找起來時間復雜度為O(1)。

應該記住:

創建set引入的是一次性開銷,創建過程將花費線性時間即使成員檢查花費常數時間。

因此如果你需要在循環里檢查成員,最好先花時間創建set,因為你只需要創建一次。

變量泄露

循環

通常說來,在Python中,一個變量的作用域比你在其他語言里期望的要寬。

例如:在Java中下面的代碼將不能通過編譯:

然而在Python中,同樣的代碼總會順利執行且得到意料中的結果:

這段代碼將會正常運行,除非子y為空的情況下,此時,循環永遠不會執行,而且processList函數的調用將會拋出NameError異常,因為idx沒有定義。

如果你使用Pylint代碼檢查工具,將會警告:使用可能沒有定義的變量idx。

解決辦法永遠是顯然的,可以在循環之前設置idx為一些特殊的值,這樣你就知道如果循環永遠沒有執行的時候你將要尋找什么。

這種模式叫做哨兵模式。那么什么值可以用來作為哨兵呢?

C語言時代或者更早,當int統治編程世界的時候,對于需要返回一個期望的錯誤結果的函數來說為通用的模式為返回-1。

例如,當你想要返回列表中某一元素的索引值:

通常情況下,在Python里None是一個比較好的哨兵值,即使它不是一貫地被Python標準類型使用(例如:str.find [2])

外作用域

Python程序員新手經常喜歡把所有東西放到所謂的外作用域——python文件中不被代碼塊(例如函數或者類)包含的部分。

外作用域相當于全局命名空間;為了這部分的討論,你應該假設全局作用域的內容在單個Python文件的任何地方都是可以訪問的。

對于定義整個模塊都需要去訪問的在文件頂部聲明的常量,外作用域顯得非常強大。

給外作用域中的任何變量使用有特色的名字是明智的做法,例如,使用IN_ALL_CAPS 這個常量名。 這將不容易造成如下bug:

如果你看的近一點,你將看到print_file函數的定義中用filenam命名參數名,但是函數體卻引用的卻是filename。

然而,這個程序仍然可以運行得很好。

為什么呢?

在print_file函數里,當一個局部變量filename沒有被找到時,下一步是在全局作用域中去尋找。

由于print_file的調用在外作用域中(即使有縮進),這里聲明的filename對于print_file函數是可見的。

那么如何避免這樣的錯誤呢?

首先,在外作用域中不是IN_ALL_CAPS這樣的全局變量就不要設置任何值[3]。

參數解析最好交給main函數,因此函數中任何內部變量不在外作用域中存活。

這也提醒人們關注全局關鍵字global。如果你只是讀取全局變量的值,你就不需要全局關鍵字global。

你只有在想要改變全局變量名引用的對象時有使用global關鍵字的必要。

代碼風格

向PEP8致敬

PEP 8是Python代碼的通用風格指南,你應該牢記在心并且盡可能去遵循它,盡管一些人有充分的理由不同意其中一些細小的風格,例如縮進的空格個數或使用空行。

如果你不遵循PEP8,你應該有除“我只是不喜歡那樣的風格”之外更好的理由。下邊的風格指南都是從PEP8中摘取的,似乎是編程者經常需要牢記的。

測試是否為空

如果你要檢查一個容器類型(例如:列表,詞典,集合)是否為空,只需要簡單測試它而不是使用類似檢查len(x)>0這樣的方法:

如果你想在其他地方保存positive_numbers是否為空的結果,可以使用bool(positive_number)作為結果保存;bool用來判斷if條件判斷語句的真值。

測試是否為None

如前面所提到,None可以作為一個很好的哨兵值。那么如何檢查它呢?

如果你明確的想要測試None,而不只是測試其他一些值為False的項(如空容器或者0),可以使用:

如果你使用None作為哨兵,這也是Python風格所期望的模式,例如在你想要區分None和0的時候。

如果你只是測試變量是否為一些有用的值,一個簡單的if模式通常就夠用了:

例如:如果期望x是一個容器類型,但是x可能作另一個函數的返回結果值變為None,你應該立即考慮到這種情況。你需要留意是否改變了傳給x的值,否則可能你認為True或0. 0是個有用的值,程序卻不會按照你想要的方式執行。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3628

    瀏覽量

    93811
  • 代碼
    +關注

    關注

    30

    文章

    4802

    瀏覽量

    68742
  • Range
    +關注

    關注

    0

    文章

    9

    瀏覽量

    11243
  • python
    +關注

    關注

    56

    文章

    4799

    瀏覽量

    84817

原文標題:Python編程中的反模式

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    代碼又雙叕錯誤python17個常見失誤不僅新手會犯,也可能會

    初學者來說,想要弄懂Python的某些錯誤信息還是有困難的,下面羅列了一些常見的運行時錯誤
    的頭像 發表于 09-19 11:08 ?3495次閱讀

    python新手常見錯誤匯總

    對于新手,初學Python時,總會遇到這樣那樣的報錯,想要弄懂Python錯誤信息的含義可能還不知道怎么做,這里列出了一些比較常見
    發表于 01-26 16:41

    我沒學過編程,能否學會Python

    Python是一種計算機程序設計語言。可能已經聽說過很多種流行的編程語言,比如非常難學的C語言,非常流行的Java語言,適合初學者的Basic語言,適合網頁
    發表于 07-14 14:49

    我沒學過編程,能否學會Python

    Python是一種計算機程序設計語言。可能已經聽說過很多種流行的編程語言,比如非常難學的C語言,非常流行的Java語言,適合初學者的Basic語言,適合網頁
    發表于 07-25 10:21

    Python編程實用指南

    Python 是一種解釋型、面向對象、動態數據類型的高級程序設計語言。通過 Python 編程,我們能夠解決現實生活的很多任務。本書是一本面向實踐的
    發表于 09-27 06:21

    初學常見Python運行錯誤及其示例歸納

    初學者來說,想要弄懂Python的某些錯誤信息還是有困難的,下面羅列了一些常見的運行時錯誤: 1.忘記在if, elif, else, f
    發表于 11-15 13:35 ?2563次閱讀

    Python編程和機器學習編程示范代碼

    機器學習離不開Python。所以,全球第一的AI教科書作者、Google Research總監Peter Novig就專門為初學者做了一個關于Python編程示范操作的GitHub項目
    的頭像 發表于 12-21 16:49 ?5737次閱讀
    <b class='flag-5'>Python</b><b class='flag-5'>編程</b>和機器學習<b class='flag-5'>編程</b>示范代碼

    Python編程常見的3個錯誤

    以下列出了學習 Python 時犯的三種錯誤: 1.可變數據類型作為函數定義的默認參數 2.可變數據類型作為類變量 3. 可變的分配錯誤
    發表于 03-21 11:46 ?1189次閱讀

    Python編程犯的三種錯誤浪費一下午時間

    為了初學 Python 的程序員避免犯同樣的錯誤,以下列出了我學習 Python 時犯的三種
    發表于 07-07 08:55 ?5847次閱讀

    新手學習Python有哪些常見錯誤

    學習Python的過程中發現一些常見錯誤,或許大家也會 遇到,這里在此總結如下:
    發表于 10-30 19:45 ?4次下載

    Python入門應該避免什么樣的錯誤

    在分享每個Python新手應該知道的4個常見錯誤之前,請確保您熟悉以下文章的一些Python內置功能。
    的頭像 發表于 04-06 12:03 ?2071次閱讀

    初學者開發人員都會犯的7個Python錯誤

    這篇文章主要介紹了七個初學者常犯的Python調試錯誤,并告訴大家如何去避免這些錯誤
    的頭像 發表于 06-23 15:19 ?2496次閱讀
    <b class='flag-5'>初學</b>者開發人員都會犯的7個<b class='flag-5'>Python</b><b class='flag-5'>錯誤</b>

    Python新手經常會犯那些錯誤

    初學Python 時,想要弄懂Python錯誤信息的含義可能有點復雜。這里列出了常見的的一些
    發表于 03-12 16:20 ?16次下載
    <b class='flag-5'>Python</b>新手經常會犯那些<b class='flag-5'>錯誤</b>

    Python中有哪些常見錯誤和異常

    python常見異常類型 在程序運行過程,總會遇到各種各樣的問題和錯誤。 有些錯誤是我們編寫代碼時自己造成的,比如語法
    的頭像 發表于 03-04 16:58 ?4185次閱讀

    python運行程序出現紅色空白

    類型語言,它對代碼的語法非常嚴格。如果的代碼存在語法錯誤Python解釋器將無法正確解析代碼并運行。常見的語法錯誤包括拼寫
    的頭像 發表于 11-28 15:30 ?2033次閱讀
    主站蜘蛛池模板: 在线免费中文字幕| 亚洲 无码 制服 日韩| 短篇合集纯肉高H深陷骚| 又大又硬又爽免费视频| 天天久久狠狠色综合| 免费无码又爽又黄又刺激网站| 国产人妻人伦精品836700| 耻辱诊察室1一4集动漫在线观看| 在线欧美精品一区二区三区| 亚洲精品不卡视频| 午夜理伦大片一级| 色多多旧版污污破解版| 日本邪恶全彩工囗囗番海贼王| 美女xx00| 男同志vdieos免费| 蜜柚影院在线观看免费高清中文| 久久婷婷五月综合色丁香| 九九热视频 这里有精品| 寂寞夜晚视频高清观看免费| 好湿好滑好硬好爽好深视频| 国产一区二区内射最近更新| 含羞草最新版本| 久久精品热99看| 快播电影官方网站| 美女18黄| 日本美国群交P片内射捆绑| 日欧一片内射VA在线影院| 特级做A爰片毛片免费69| 色窝窝亚洲AV在线观看| 午夜影视不用充钱的免费| 亚洲AV久久无码精品九号| 亚洲精品在看在线观看| 亚洲一在线| 92精品国产成人观看免费| 把腿张开再深点好爽宝贝动态图| 成人网络电视破解版| 国产片MV在线观看| 久久精品天天中文字幕| 男插女高潮一区二区| 少妇久久久久久被弄高潮| 亚洲 日韩 国产 中文视频|