通過將數組與字典等數據結構靈活組合,Python可以非常便捷的實現各種復雜的數據結構,但是對于這些復雜數據結構的操作代碼有時卻顯得非常的繁瑣和臃腫,對于Python這門如此簡潔高效的語言而言是不能接受的。
本文將與你一起學習Python的列表生成式語法,拒絕臃腫代碼,提高執行效率,讓你的代碼“騷”起來!也可以加小編交流群103456743我們一起學習進步
初探Python列表生成式
在Python開發過程中,我們經常會遇到對數據進行一定的處理并生成一個列表的需求。例如一個最簡單的需求:產生一個元素為0 – 9的列表,這個需求可以說是再簡單不過了,一個for循環遍歷range(10)依次添加到列表中即可:
上述代碼的輸出結果就是一個我們需要的元素為0-9的列表了。
代碼看起來還算比較簡單,結構上也不復雜,但是還有沒有更簡便的寫法呢?答案當然是有的了!現在就讓我們來使用Python的列表生成式語法對上述代碼進行優化:
核心代碼其實只有一行,借助列表生成式語法我們成功的將三行的代碼縮減到了一行,這還是針對最簡單的情況,在復雜情況下代碼精簡的效果會更加直觀。
我們來看看輸出結果對不對,上述使用列表生成式語法的輸出結果為:
輸出結果來看是我們需要的元素為0-9的列表,我們來詳細分析一下這段使用列表生成式語法的代碼:
my_list就是我們定義的用來存儲0-9元素的列表,不同的是,一般定義列表變量的方法是my_list = []。上述代碼卻在這對中括號里塞下了一長串代碼,仔細分析的話,會發現這是一串用來描述for循環的代碼。其中的for index in range(10)就是在我們之前的代碼中用來生成這樣一個列表所使用的for循壞,而在這個循環的前面,就是循環過程中迭代的變量index。
這就是列表生成式語法最基本的樣子:需要生成的元素放在最前面,后面跟for循環,這樣程序就知道,要在這個循環迭代的過程中,將所需的元素依次放入數組中,最后構建出我們需要的數組。
列表生成式進階
我們上面的例子還是太過簡單了,在實際的開發中需求會復雜許多,那么如何用列表生成式語法來處理更為復雜的情況呢?實際上列表生成式在實際使用中的功能十分強大,例如我們希望得到一個元素為0×2, 1×2, 2×2, …, 9×2的列表就可以這樣實現:
將上述代碼生成的my_list打印出來可以得到下面的輸出:
只需要將生成的元素×2就可以得到我們需要的列表了。除了對所生成的元素進行數值處理外,我們還可以借助函數對其進行更為復雜的操作,例如通過str的lower()函數我們可以將一個數組中所有的字符串都變成小寫:
將生成的lower_list打印出來,可以看到old_list里的四個單詞都被變成了小寫:
除了對生成的元素進行處理外,列表生成式還可以增加if判斷,用來篩選所需的元素。例如我們希望得到0-10中為偶數的元素組成的列表,那么只需要在for循環的后面增加上index % 2 == 0的判斷對迭代的元素進行過濾即可:
輸出經過index % 2 == 0條件過濾得到的數組可以看到構成元素都是我們期望的偶數:
我們可以使用for循環來同時處理多個變量,同樣的使用列表生成式也可以一次性處理多個變量。例如我們有一個數組,內部元素為一個個的元祖,每個元祖中存儲了一個學生的語數英三科的成績,我們希望得到這一個新的列表,記錄每個學生的平均分,那么我們可以通過列表生成式這樣實現:
輸出上述代碼計算得到的平均分列表aves,驗證一下是不是我們要的結果:
對grades遍歷得到的是一個個的元祖,我們可以指定與元組長度相等的若干個變量來分別接收元祖內的每一個元素,例如上例在for循環中使用cn、math、en三個變量來分別接收元組內的語文、數學、英語成績。要得到三科的平均分,只需要將這三個變量相加,然后再除以3即可,其中round函數可以用來限定Python浮點型數值的小數點位數。
至此我們已經初步掌握了Python的列表生成式語法,可以使用它來精簡和優化一些簡單的列表生成代碼。