通過將數(shù)組與字典等數(shù)據(jù)結(jié)構(gòu)靈活組合鄙早,Python可以非常便捷的實現(xiàn)各種復雜的數(shù)據(jù)結(jié)構(gòu)汪茧,但是對于這些復雜數(shù)據(jù)結(jié)構(gòu)的操作代碼有時卻顯得非常的繁瑣和臃腫,對于Python這門如此簡潔高效的語言而言是不能接受的限番。
本文將與你一起學習Python的列表生成式語法舱污,拒絕臃腫代碼,提高執(zhí)行效率弥虐,讓你的代碼“騷”起來扩灯!也可以加小編交流群103456743我們一起學習進步
初探Python列表生成式
在Python開發(fā)過程中,我們經(jīng)常會遇到對數(shù)據(jù)進行一定的處理并生成一個列表的需求霜瘪。例如一個最簡單的需求:產(chǎn)生一個元素為0 – 9的列表珠插,這個需求可以說是再簡單不過了,一個for循環(huán)遍歷range(10)依次添加到列表中即可:
上述代碼的輸出結(jié)果就是一個我們需要的元素為0-9的列表了颖对。
代碼看起來還算比較簡單捻撑,結(jié)構(gòu)上也不復雜,但是還有沒有更簡便的寫法呢缤底?答案當然是有的了布讹!現(xiàn)在就讓我們來使用Python的列表生成式語法對上述代碼進行優(yōu)化:
核心代碼其實只有一行,借助列表生成式語法我們成功的將三行的代碼縮減到了一行训堆,這還是針對最簡單的情況描验,在復雜情況下代碼精簡的效果會更加直觀。
我們來看看輸出結(jié)果對不對坑鱼,上述使用列表生成式語法的輸出結(jié)果為:
輸出結(jié)果來看是我們需要的元素為0-9的列表膘流,我們來詳細分析一下這段使用列表生成式語法的代碼:
my_list就是我們定義的用來存儲0-9元素的列表絮缅,不同的是,一般定義列表變量的方法是my_list = []呼股。上述代碼卻在這對中括號里塞下了一長串代碼耕魄,仔細分析的話,會發(fā)現(xiàn)這是一串用來描述for循環(huán)的代碼彭谁。其中的for index in range(10)就是在我們之前的代碼中用來生成這樣一個列表所使用的for循壞吸奴,而在這個循環(huán)的前面,就是循環(huán)過程中迭代的變量index缠局。
這就是列表生成式語法最基本的樣子:需要生成的元素放在最前面则奥,后面跟for循環(huán),這樣程序就知道狭园,要在這個循環(huán)迭代的過程中读处,將所需的元素依次放入數(shù)組中,最后構(gòu)建出我們需要的數(shù)組唱矛。
列表生成式進階
我們上面的例子還是太過簡單了罚舱,在實際的開發(fā)中需求會復雜許多,那么如何用列表生成式語法來處理更為復雜的情況呢绎谦?實際上列表生成式在實際使用中的功能十分強大管闷,例如我們希望得到一個元素為0×2, 1×2, 2×2, …, 9×2的列表就可以這樣實現(xiàn):
將上述代碼生成的my_list打印出來可以得到下面的輸出:
只需要將生成的元素×2就可以得到我們需要的列表了。除了對所生成的元素進行數(shù)值處理外窃肠,我們還可以借助函數(shù)對其進行更為復雜的操作渐北,例如通過str的lower()函數(shù)我們可以將一個數(shù)組中所有的字符串都變成小寫:
將生成的lower_list打印出來,可以看到old_list里的四個單詞都被變成了小寫:
除了對生成的元素進行處理外铭拧,列表生成式還可以增加if判斷,用來篩選所需的元素恃锉。例如我們希望得到0-10中為偶數(shù)的元素組成的列表搀菩,那么只需要在for循環(huán)的后面增加上index % 2 == 0的判斷對迭代的元素進行過濾即可:
輸出經(jīng)過index % 2 == 0條件過濾得到的數(shù)組可以看到構(gòu)成元素都是我們期望的偶數(shù):
我們可以使用for循環(huán)來同時處理多個變量,同樣的使用列表生成式也可以一次性處理多個變量破托。例如我們有一個數(shù)組肪跋,內(nèi)部元素為一個個的元祖,每個元祖中存儲了一個學生的語數(shù)英三科的成績土砂,我們希望得到這一個新的列表州既,記錄每個學生的平均分,那么我們可以通過列表生成式這樣實現(xiàn):
輸出上述代碼計算得到的平均分列表aves萝映,驗證一下是不是我們要的結(jié)果:
對grades遍歷得到的是一個個的元祖吴叶,我們可以指定與元組長度相等的若干個變量來分別接收元祖內(nèi)的每一個元素,例如上例在for循環(huán)中使用cn序臂、math蚌卤、en三個變量來分別接收元組內(nèi)的語文实束、數(shù)學、英語成績逊彭。要得到三科的平均分咸灿,只需要將這三個變量相加,然后再除以3即可侮叮,其中round函數(shù)可以用來限定Python浮點型數(shù)值的小數(shù)點位數(shù)避矢。
至此我們已經(jīng)初步掌握了Python的列表生成式語法,可以使用它來精簡和優(yōu)化一些簡單的列表生成代碼囊榜。