Soft_Job 板


LINE

※ 引述《ohmylove347 (米特巴爾)》之銘言: : https://reurl.cc/8yzA24 : 上面說2006年 PEP 3103就建議實施switch-case語句。 : 但是,在PyCon 2007上的一項民意調查未獲得對該功能的支持後, : Python開發人員將其刪除。 : : 沒有使用Python不知道生態系如何 : Google App上看到的文章 : 不知道各位大大對Switch加入有什麼看法 : : 推 Muscovy: for/while 比 if-else 常出現無誤, 大概 10:1 的比例. XD : 推 TAMSHUI: 不知M大能否舉例完全不用if-else呢?Google了一下還是沒 : → TAMSHUI: 什麼想法@@ : 推 Muscovy: 不會到完全不寫 if 的程度啦,等一下我來整理一篇 我的工作環境很雜, 從 matlab 到 C 與他的親朋好友(java 也算. :D) 反正猴子用 C, 有錢的猴子用 matlab, 沒錢的猴子像我就用 python. 但是大概都會雙棲... 我來舉個例子... 譬如你有一組數字, 數量不多不少, 大約 10,000 個左右. 然後要處理它, 先叫他 eigen_spectrum, 或者簡稱 eig 好了. 當 eigen_spectrum >= 100,000,000 的時候要做一堆事. 介於 [10, 100,000,000) 的時候又一堆事. 介於 (0, 10) 的時候又一堆. 剛好等於 0 的時候需要處理特殊事件. 然後小於 0 的話要檢查有沒有奇怪的現象, 標注一些警示. 這些事情的執行細節通通都不太一樣, 然後要怎麼做? 用 C 的話, 大概 if-else/if-else/if-...-else 之外就沒招了. 所以 python by C programmer 會變這樣: for s in eigen_spectrum: if s >= 1e8: pass # 這裡寫一大坨, 頂多寫個函數處理. elif s >= 10 and s < 1e8: pass # 這裡再一坨, 或者寫個跟上面不一樣函數. elif s > 0 and s < 10: pass # 再一坨, 或者再一個跟上面都不同的函數. elif s == 0: pass # 嗯, 你知道的, 繼續. elif s < 0: pass # 嗯......寫就對了. else: raise ValueError("Should not happen.") 最後你會得到一堆只用一次的函數, 或者一大串超長程式碼. 但是 python programmer 呢, 會這樣寫: for s in eig[eig > 1e8]: pass # 寫寫寫, 也是一大坨. for s in eig[np.logical_and(eig > 10, eig < 1e8)]: pass # 繼續寫寫寫, 也是一坨. for s in eig[np.logical_and(eig > 0, eig < 10)]: pass # 再寫, 繼續就對了. if np.any(eig == 0): pass # 驚醒! 想一下遇上 0 的時候要做什麼. for s in eig[eig < 0]: pass # 再寫再寫, 反正就是接龍. 很有趣的結構吧? 你還是會變出一段超長程式碼. 再加上明明一個迴圈可以搞定的事, 硬要拆成四個. 還補了一個莫名其妙, 不太對稱的 if. 但事實上這種寫法比較好維護, 因為這個結構更近似數學的模型. 可以往前翻到我上面的文字敘述, 比看看兩種寫法就知道了. 這個數學模型很簡單, 然而不同的寫法就已經有風格上的區分. 稍微複雜一點的數學模型, 用 if-elif-else 就更難重建. 譬如這個 eigen_spectrum 會有一組伴隨的 eigen_states 要處理. 用 if-else 硬爬會爬出一堆腦袋打結的程式碼, 因為很不像數學. 然後結構裡面的 if 其實是用來做 s == 0, exception handle. 而且這也是我最常遭遇的情境: 用 if + raise 來表示異常狀況. 其他時候, 我一下子想不太到寫 if statement 的情況. 因為翻到的程式碼幾乎都是: if np.count_nonzero(np.abs(s) < 1e-8) > 2: raise ValueError('Too many singularities.') 這一類的東西, 它就是有個 raise. : → as30385438: 不用if就是用loop、dict的key放condition或一些DP手法 : → as30385438: 寫python的常常追求所謂的pythonic,不過我自己是覺得 : → as30385438: simple is best,最直覺的寫法通常就是最好的 從 stackoverflow 容易學到的毛病就是把 one-liner 當成 pythonian. 養成這種習慣的程式員有夠難矯正. -- 新詩練習:新鮮。踩破初春裡的狗大便;不經意的滄桑,滿溢著嫩黃的喜悅。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.248.47.50 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1616832576.A.DCB.html
1F:→ bazoo: 請問這是使用 numpy 嗎? 03/27 16:19
2F:→ bazoo: for 迴圈的範例那邊 03/27 16:19
3F:→ Muscovy: 是. python 內建的也有類似的寫法, 但 numpy 比較簡潔. 03/27 16:21
4F:推 neo5277: 好像是滿好玩的 關心值 不知道會不會比較有效果 03/27 18:24
5F:→ Murasaki0110: 變成5次for好在哪裡 03/27 18:33
6F:→ alihue: 第二種其實 eig 會被 scan 五次?效能不是比較差嗎 03/27 18:51
7F:→ handsomeLin: 我是python progammer但是我用if else 不會用5n迴圈 03/27 18:54
8F:推 jack82822005: 看起來似乎比較好懂,但效能比較差的樣子 03/27 19:11
9F:推 alihue: 其實第二個可讀性沒比第一個好 後人還會覺得幹嘛不用一個 03/27 19:29
10F:→ alihue: 迴圈 03/27 19:29
11F:→ alihue: 你若要raise ex,第二種更難讀出何時會 raise ex 03/27 19:32
12F:→ alihue: 然後如果你 pass 裡面資料是不能被重複處理的,在第二種 03/27 19:39
13F:→ alihue: case 若條件有 overlap 會出 bug 03/27 19:39
14F:推 Celinealone: 不太懂為什麼第二個會比較好維護? Python也可以用第 03/27 20:31
15F:→ Celinealone: 一種寫法不是嗎? 03/27 20:31
16F:→ WunoW: 明明就if-else比較好維護吧... 03/27 20:35
17F:推 drajan: “pythonic” 03/27 20:40
18F:推 mirror0227: 我也選 if else 03/27 20:46
19F:→ geniusturtle: 覺得第二種不好讀 03/27 20:48
20F:推 noahleft: 第二種以維護角度比較容易, 第一種當條件混入各種可能後 03/27 21:04
21F:→ noahleft: 會很難知道甚麼時候會跑到哪個條件 03/27 21:05
22F:→ noahleft: 只要考慮到有情形是多個條件都能成立時,第一種寫法就是 03/27 21:06
23F:→ noahleft: 看執行順序,而第二種寫法會變成餵進來的資料都是符合條 03/27 21:07
24F:→ noahleft: 見的 03/27 21:07
25F:→ WunoW: 多條件你就用多個if就好不用else了 = = 03/27 21:10
26F:→ noahleft: 補充一下 多條件指可能你的condition並非完全互斥 03/27 21:22
27F:→ hsnuyi: 又是一個不考慮CPU如何branch的人 03/27 21:51
28F:→ WunoW: NO 你先if排除不符合的條件更直觀也有更好的效能 03/27 21:53
29F:→ WunoW: 我知道你是想遵循單一職責原則,但這不是定律 03/27 21:58
30F:→ WunoW: 一個迴圈做多個判斷沒有不行 你判斷式提取為函式就好 03/27 22:00
31F:推 alihue: 樓上說到一個重點...if的位置在某些情況可以大幅改善效能 03/27 22:02
32F:→ WunoW: 你去看pandas的源碼吧 一個for loop裡面包山包海的code一堆 03/27 22:03
33F:→ alihue: 例如在迴圈的一開始就篩掉大部分 case 並 continue 03/27 22:04
34F:推 MoonCode: 先寫的簡單好懂比效能重要 推推 03/27 22:09
35F:推 jack0204: 樓上說的這叫early return,寫可讀性高的程式常用到 03/27 22:22
37F:→ shooter555: for in 後面的條件不會先被展開嗎 這樣不是比較慢? 03/29 12:38
38F:→ shooter555: 然後第二種寫寫一大長串不是很難看嗎 第一種雖然一堆 03/29 12:41
39F:→ shooter555: 一次性的func 但拿來命名可以清楚看出他是要幹麼的 03/29 12:41
40F:推 s0914714: 以這個例子而言 的確1的寫法不會比較差 就是分區而已 03/30 17:14
41F:→ s0914714: 但複雜情況2的維護性會高不少 03/30 17:14
42F:→ red0210: in 後面計算量通常不大(跟裡面那堆比),拿去profiling 04/04 15:42
43F:→ red0210: 就知道了 04/04 15:42







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP