正文:
本文展示一些高級的Python設計結(jié)構和它們的使用方法。在日常工作中,你可以根據(jù)需要選擇合適的數(shù)據(jù)結(jié)構,例如對快速查找性的要求、對數(shù)據(jù)一致性的要求或是對索引的要求等,同時也可以將各種數(shù)據(jù)結(jié)構合適地結(jié)合在一起,從而生成具有邏輯性并易于理解的數(shù)據(jù)模型。Python的數(shù)據(jù)結(jié)構從句法上來看非常直觀,并且提供了大量的可選操作。這篇指南嘗試將大部分常用的數(shù)據(jù)結(jié)構知識放到一起,并且提供對其最佳用法的探討。
推導式(Comprehensions)
如果你已經(jīng)使用了很長時間的Python,那么你至少應該聽說過列表推導(list comprehensions)。這是一種將for循環(huán)、if表達式以及賦值語句放到單一語句中的一種方法。換句話說,你能夠通過一個表達式對一個列表做映射或過濾操作。
一個列表推導式包含以下幾個部分:
一個輸入序列 一個表示輸入序列成員的變量 一個可選的斷言表達式 一個將輸入序列中滿足斷言表達式的成員變換成輸出列表成員的輸出表達式舉個例子,我們需要從一個輸入列表中將所有大于0的整數(shù)平方生成一個新的序列,你也許會這么寫:
num = [1, 4, -5, 10, -7, 2, 3, -1]filtered_and_squared = [] for number in num: if number > 0: filtered_and_squared.append(number ** 2)print filtered_and_squared # [1, 16, 100, 4, 9]
很簡單是吧?但是這就會有4行代碼,兩層嵌套外加一個完全不必要的append操作。而如果使用filter、lambda和map函數(shù),則能夠?qū)⒋a大大簡化:
num = [1, 4, -5, 10, -7, 2, 3, -1]filtered_and_squared = map(lambda x: x ** 2, filter(lambda x: x > 0, num))print filtered_and_squared # [1, 16, 100, 4, 9]
嗯,這么一來代碼就會在水平方向上展開。那么是否能夠繼續(xù)簡化代碼呢?列表推導能夠給我們答案:
num = [1, 4, -5, 10, -7, 2, 3, -1]filtered_and_squared = [ x**2 for x in num if x > 0]print filtered_and_squared # [1, 16, 100, 4, 9]迭代器(iterator)遍歷輸入序列num的每個成員x 斷言式判斷每個成員是否大于零 如果成員大于零,則被交給輸出表達式,平方之后成為輸出列表的成員。
列表推導式被封裝在一個列表中,所以很明顯它能夠立即生成一個新列表。這里只有一個type函數(shù)調(diào)用而沒有隱式調(diào)用lambda函數(shù),列表推導式正是使用了一個常規(guī)的迭代器、一個表達式和一個if表達式來控制可選的參數(shù)。
另一方面,列表推導也可能會有一些負面效應,那就是整個列表必須一次性加載于內(nèi)存之中,這對上面舉的例子而言不是問題,甚至擴大若干倍之后也都不是問題。但是總會達到極限,內(nèi)存總會被用完。
新聞熱點
疑難解答
圖片精選