这样的奇技淫巧不可取,切记切记
之前我們介紹過Python有一個模塊可以用來檢查代碼風格,并且u1s1,檢查得還挺嚴的,搞得阿醬還挺怕怕的
就像讀書時候有一個嚴厲的老大哥、啊不對,老師,一直始終盯著你,一旦犯錯就會對你提出嚴厲的批評,羞得你無地自容。
上次就是這個老師,又把阿醬給訓了一頓。不過講心里話,老師訓得還是有道理的,阿醬雖然口頭上不爽嘟囔兩句,但物理上也還是從善如流的——這肯定不是怕了老師手上的戒尺。下面我就給大家好好兒講講我是怎么被訓的——
問題呈現
作為Python的語法糖之一,想必大家對于列表生成式都已經熟悉得不能再熟悉了,甚至現在立馬走出門去,不懂列表生成式都不敢理直氣壯地說自己是個Pythonista——到了這種程度。
但是上次坑了阿醬的恰好就是這個列表生成式,這里也跟大家share一下阿醬的辛酸故事。(類似的話我前兩句是不是才說過來著
話說那是一個月黑風高的夜晚(程序猿加班很正常對伐?所以這個描述很合理且應景),阿醬當時辛辛苦苦耕耘,碼出了好長一段代碼,然后喜滋滋地例行pylint掃了一下……
02啊咧?什么鬼?
R1721:?Unnecessary?use?of?a?comprehension不需要用列表生成式?
寫的啥?
l?=?[n?for?n?in?range(10)]有毛病嗎?這有毛病嗎?這***有啥毛病啊?你倒是說啊?我這代碼有什么問題?咋就不該用列表生成式了?那你讓我用啥?用愛嗎?
03冤有頭債有主
好了到這里卡住了,接下來有請我們永遠滴神——Google老大爺蹣跚登場
輸入,搜索,到手!
04讓我們點開看起來更正規的第二個鏈接——至于我為什么說第二個更正規呢?阿醬當然不會告訴你我已經都點開看過了
翻譯一下,第二個鏈接標題“Enhancement: Add a [unnecessary-comprehension]-checker”,大概是“改進點:添加[unnecessary-comprehension]檢查器”這么個意思——
什么什么?你給我等下。
感情剛剛困擾我的那個規范問題還是打你這兒出來的啊,冤有頭債有主,別怪我不客……咳,讀書人的事,終歸還是講點道理的,咱們還是先把這鏈接的內容看完,再不客氣也不遲。
這位老哥說了啥來著?
...
we could implement a checker that detects list/dict/set-comprehensions that can be replaced by the corresponding list/dict/set-constructors, which is faster and more readable. For example:
list(iterable) instead of [x for x in iterable]
dict(some_dict) instead of {k: v for k, v in some_dict}
set(iterable) instead of {e for e in iterable}
Although these cases seem trivial/obvious, I think having such a checker would help in cases where longer/more complex variable-names are used.
...
老哥說,他要實現這么一個檢查器,檢查出那些可以被list/set/dict構造器替換的list/set/dict生成式,使代碼性能更佳、可讀性更好。具體來說有這么些blabla的示例。
再仔細一看,嗨,真有道理
你看看這個列表生成式,[x for x in iterable],這不是脫了屁股放……啊錯了,脫了褲子放屁嗎?一個個迭代出來可迭代對象中的元素,然后原封不動地組裝成一個列表;這種弱智活,直接交給內置的list不香嗎?還會有傻*蠢到用列表生成式?哈哈哈哈哈哈,????——
淦!我TM就是那個傻*?
奇技淫巧要慎用
u1s1,在此之前,我從來沒有想過,一個簡單的列表生成式還有這么多的講究,壓根兒就沒有考慮過怎么樣才能有效地使用Python的語法糖。
然而實際上,事實證明語法糖畢竟是語法糖,有其適用的場景,當然也有其不適用的場景。
沒有什么東西是萬金油銀彈(這個修改是阿醬為了顯得與國際接軌),只有用在了對的地方,它才能被稱之為“語法糖”;否則更像是“語法毒藥”,污染好大一片數字江山。
包括阿醬在內的不少同學,可能學了一陣兒Python,就沉浸于其中的各種奇技淫巧,每次遇到任何場景,都是不管三七二十一,直接套上一個trick。
你以為你是四兩撥千斤,其實不過是大力出奇跡。
pylint增加的這個檢查器能夠檢查的項不止于列表生成式這么一小塊門類,繼續閱讀之前那個鏈接我們可以發現一套很有意義的范例,其中注釋為[unnecessary-comprehension]的代碼行,都是相關生成式的“壞的實踐”,值得我們引以為鑒。
相關內容作為附錄附在本文之后。
總結
本文我們再次(阿醬要哭了)從阿醬遇到的實際問題說開去,警醒了一些有點飄的同學:我們一定要腳踏實地,仰望星空;艱苦奮斗,持續搬磚。
奇技淫巧可以用,但是一定要分清場景。
參考資料
Enhancement: Add a [unnecessary-comprehension]-checker #2905
附錄
#?For?name-reference?see?https://docs.python.org/3/reference/expressions.html#displays-for-lists-sets-and-dictionaries#?List?comprehensions [x?for?x?in?iterable]??#?[unnecessary-comprehension] [y?for?x?in?iterable]??#?expression?!=?target_list [x?for?x,y,z?in?iterable]??#?expression?!=?target_list [(x,y,z)?for?x,y,z?in?iterable]??#?[unnecessary-comprehension] [(x,y,z)?for?(x,y,z)?in?iterable]??#?[unnecessary-comprehension] [x?for?x,?*y?in?iterable]??#?expression?!=?target_list [x?for?x?in?iterable?if?condition]??#?exclude?comp_if [y?for?x?in?iterable?for?y?in?x]??#?exclude?nested?comprehensions#?Set?comprehensions {x?for?x?in?iterable}??#?[unnecessary-comprehension] {y?for?x?in?iterable}??#?expression?!=?target_list {x?for?x,y,z?in?iterable}??#?expression?!=?target_list {(x,y,z)?for?x,y,z?in?iterable}??#?[unnecessary-comprehension] {(x,y,z)?for?(x,?y,?z)?in?iterable}??#?[unnecessary-comprehension] {x?for?x,?*y?in?iterable}??#?expression?!=?target_list {x?for?x?in?iterable?if?condition}??#?exclude?comp_if {y?for?x?in?iterable?for?y?in?x}??#?exclude?nested?comprehensions#?Dictionary?comprehensions {k:?v?for?k,?v?in?iterable}??#?[unnecessary-comprehension] {v:?k?for?k,?v?in?iterable}??#?key?value?wrong?order {k:?v?for?(k,?v)?in?iterable}??#?[unnecessary-comprehension] {x:?y?for?x,y,z?in?iterable}??#?expression?!=?target_list {x[0]:?x[1]?for?*x?in?iterable}??#?[unnecessary-comprehension] {x:?y?for?x,?y?in?iterable?if?condition}??#?exclude?comp_if {y:?z?for?x?in?iterable?for?y,?z?in?x}??#?exclude?nested?comprehensions 由于微信平臺算法改版,公號內容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強烈建議星標我們和給我們多點點【在看】。星標具體步驟為:(1)點擊頁面最上方“小詹學Python”,進入公眾號主頁。 (2)點擊右上角的小點點,在彈出頁面點擊“設為星標”,就可以啦。 感謝支持,比心。總結
以上是生活随笔為你收集整理的这样的奇技淫巧不可取,切记切记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WOC?老板让我从Word中复制出100
- 下一篇: Python中浅拷贝与深拷贝的骚操作