標籤:

學Python很久但是一直無法提升!你有思考過究竟是為什麼嗎?

進階的路上一定少不了刷題,少不了實戰,少不了日日夜夜的練習!很多人抱怨自己的功力始終沒有提高,有一種書到用數方恨少的感覺,其實還是練少了,而且要精練,單題海戰術也不行,提高單位時間的利用率。

看我主頁 獲取Python的進階教程與資料!

剛入門的人你去刷Leetcode合適嗎,你連基本的演算法都不懂,輕者吐血,刷了一天沒有頭緒,重者從入門到放棄,選擇合適的循序漸進最為重要。年前我們在小密圈選了一部分的題目,進行精刷,這些題目都是我過濾出來的,精選出來的,結合趣味和知識,淡妝濃抹總相宜。

下面我拿出其中的一道題,這一道題有5種解法,非常適合進階提高的同學仔細推敲,一起來看一下。

01

檢查信用卡

給定一個信用卡號碼,我們可以通過一些基本知識來確定發行人/供應商是誰。

完成get_issuer()將使用下面顯示的值的功能來確定給定卡號的發卡機構。如果數字不匹配,則該函數應返回該字元串Unknown。

測試用例:

get_issuer(4111111111111111) == "VISA"
get_issuer(4111111111111) == "VISA"
get_issuer(4012888888881881) == "VISA"
get_issuer(378282246310005) == "AMEX"
get_issuer(6011111111111117) == "Discover"
get_issuer(5105105105105100) == "Mastercard"
get_issuer(5105105105105106) == "Mastercard"
get_issuer(9111111111111111) == "Unknown"

先不要看答案,自己動手思考幾分鐘...

解法一:

菜鳥解法就是比較平鋪直敘,數據結構上直接就用列表和字典構建,然後遍歷列表進行匹配即可!

解法二:

點評這種解法非常巧妙,函數體內一行搞定,數據結構設計的時候就很妙,跟上面的不太一樣。

第一,利用字典數據結構,字典是hash結構,遍歷速度快,比列表要快n倍,性能上高。

第二,字典的Key設計很講究,整體的思路也是遍歷字典,但是字典的Key使用元組包裹,想到用元組作為key,這樣的寫法都是老手所為!

也就是信用卡的開頭數組,但是字元串匹配的開頭的時候如果用startswith函數,一定要是字元串類型,所以又有的map函數把數字轉換為字元。

第三,利用next函數,一般next函數都是跟生成器相關的,就是不斷的循環可迭代的對象。這裡用next來迭代整個字典,如果遍歷之後找不到,顯示Unknow. 這樣的寫法極其老道,可能寫成下面的做法,更適合理解:

解法三:

點評,這return裡面大作文章這樣的用法也是比較老道的,而且用了5層的if else if else ,算是5目運算了!

大部分return裡面用這樣的寫法:

return [{
aa:student.name
bb:student.age
} for student in students]

解法四:

點評,利用namedtuple這樣的輕量級類完成是最好的,直觀而且簡潔!這種數據結構的設計非常不錯。

把搜索的結果放在一個列表裡面,結果是True/False ,巧妙的用了any來快速處理!省去了再次遍歷的麻煩。

解法五:

用正則去匹配非常簡潔,上面的匹配需要2個條件一個是startswith和len(num) in length,而正則只需要用[47].{13}這樣幾個字元串就描述了上面複雜的表達式,確實厲害!

02

實戰訓練

上面只是我們刷題的其中一小部分,裡面還有很多精妙的招式,我都總結成pdf,並且每一道題目都詳細的點評,如果靜下心來好好吸收一波,一定功力大漲,收益匪淺。

現在我們要把良好的學習氛圍繼續下去,我們下一輪的實戰一起學又要開始啦,一起實戰練習,然後提問,思考,最後吸收!


推薦閱讀:

TAG:Python |