這樣的奇技淫巧不可取,切記切記

之前我們介紹過Python有一個(gè)模塊可以用來檢查代碼風(fēng)格,并且u1s1,檢查得還挺嚴(yán)的,搞得阿醬還挺怕怕的
就像讀書時(shí)候有一個(gè)嚴(yán)厲的老大哥、啊不對,老師,一直始終盯著你,一旦犯錯(cuò)就會(huì)對你提出嚴(yán)厲的批評,羞得你無地自容。
下面我就給大家好好兒講講我是怎么被訓(xùn)的——
問題呈現(xiàn)
作為Python的語法糖之一,想必大家對于列表生成式都已經(jīng)熟悉得不能再熟悉了,甚至現(xiàn)在立馬走出門去,不懂列表生成式都不敢理直氣壯地說自己是個(gè)Pythonista——到了這種程度。
但是上次坑了阿醬的恰好就是這個(gè)列表生成式,這里也跟大家share一下阿醬的辛酸故事。(類似的話我前兩句是不是才說過來著
話說那是一個(gè)月黑風(fēng)高的夜晚(程序猿加班很正常對伐?所以這個(gè)描述很合理且應(yīng)景),阿醬當(dāng)時(shí)辛辛苦苦耕耘,碼出了好長一段代碼,然后喜滋滋地例行pylint掃了一下……

啊咧?什么鬼?
R1721:?Unnecessary?use?of?a?comprehension
不需要用列表生成式?
寫的啥?
l?=?[n?for?n?in?range(10)]
有毛病嗎?這有毛病嗎?這***有啥毛病啊?你倒是說啊?我這代碼有什么問題?咋就不該用列表生成式了?那你讓我用啥?用愛嗎?

冤有頭債有主
好了到這里卡住了,接下來有請我們永遠(yuǎn)滴神——Google老大爺蹣跚登場
輸入,搜索,到手!

讓我們點(diǎn)開看起來更正規(guī)的第二個(gè)鏈接——至于我為什么說第二個(gè)更正規(guī)呢?阿醬當(dāng)然不會(huì)告訴你我已經(jīng)都點(diǎn)開看過了
翻譯一下,第二個(gè)鏈接標(biāo)題“Enhancement: Add a [unnecessary-comprehension]-checker”,大概是“改進(jìn)點(diǎn):添加[unnecessary-comprehension]檢查器”這么個(gè)意思——
什么什么?你給我等下。
感情剛剛困擾我的那個(gè)規(guī)范問題還是打你這兒出來的啊,冤有頭債有主,別怪我不客……咳,讀書人的事,終歸還是講點(diǎn)道理的,咱們還是先把這鏈接的內(nèi)容看完,再不客氣也不遲。
這位老哥說了啥來著?
...
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.
...
老哥說,他要實(shí)現(xiàn)這么一個(gè)檢查器,檢查出那些可以被list/set/dict構(gòu)造器替換的list/set/dict生成式,使代碼性能更佳、可讀性更好。具體來說有這么些blabla的示例。
再仔細(xì)一看,嗨,真有道理
你看看這個(gè)列表生成式,[x for x in iterable],這不是脫了屁股放……啊錯(cuò)了,脫了褲子放屁嗎?一個(gè)個(gè)迭代出來可迭代對象中的元素,然后原封不動(dòng)地組裝成一個(gè)列表;這種弱智活,直接交給內(nèi)置的list不香嗎?還會(huì)有傻*蠢到用列表生成式?哈哈哈哈哈哈,?——
淦!我TM就是那個(gè)傻*?
奇技淫巧要慎用
u1s1,在此之前,我從來沒有想過,一個(gè)簡單的列表生成式還有這么多的講究,壓根兒就沒有考慮過怎么樣才能有效地使用Python的語法糖。
然而實(shí)際上,事實(shí)證明語法糖畢竟是語法糖,有其適用的場景,當(dāng)然也有其不適用的場景。
沒有什么東西是萬金油銀彈(這個(gè)修改是阿醬為了顯得與國際接軌),只有用在了對的地方,它才能被稱之為“語法糖”;否則更像是“語法毒藥”,污染好大一片數(shù)字江山。
包括阿醬在內(nèi)的不少同學(xué),可能學(xué)了一陣兒Python,就沉浸于其中的各種奇技淫巧,每次遇到任何場景,都是不管三七二十一,直接套上一個(gè)trick。
你以為你是四兩撥千斤,其實(shí)不過是大力出奇跡。
pylint增加的這個(gè)檢查器能夠檢查的項(xiàng)不止于列表生成式這么一小塊門類,繼續(xù)閱讀之前那個(gè)鏈接我們可以發(fā)現(xiàn)一套很有意義的范例,其中注釋為[unnecessary-comprehension]的代碼行,都是相關(guān)生成式的“壞的實(shí)踐”,值得我們引以為鑒。
相關(guān)內(nèi)容作為附錄附在本文之后。
總結(jié)
本文我們再次(阿醬要哭了)從阿醬遇到的實(shí)際問題說開去,警醒了一些有點(diǎn)飄的同學(xué):我們一定要腳踏實(shí)地,仰望星空;艱苦奮斗,持續(xù)搬磚。
奇技淫巧可以用,但是一定要分清場景。
參考資料
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
由于微信平臺(tái)算法改版,公號內(nèi)容將不再以時(shí)間排序展示,如果大家想第一時(shí)間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
(1)點(diǎn)擊頁面最上方“小詹學(xué)Python”,進(jìn)入公眾號主頁。
(2)點(diǎn)擊右上角的小點(diǎn)點(diǎn),在彈出頁面點(diǎn)擊“設(shè)為星標(biāo)”,就可以啦。
感謝支持,比心。

