1、zip的坑python
zip()函數接收多個可迭代數列,將數列中的元素從新組合,在3.0中返回迭代器指向函數
數列首地址,在3.0如下版本返回List類型的列表數列。我用的是3.5版本python,spa
因此zip返回的是指向地址。3d
先看幾個例子指針
結果:code
可見,在3.0以上版本,對zip函數返回的結果採用list函數能夠轉化爲列表。orm
經過列表生成式一樣能夠將zip結果化爲列表。對象
結果:blog
當zip操做的對象爲一個列表,那麼生成的列表中每一個元素(元祖)中遊戲
爲(n,)形式。
當zip操做的多個列表長度不同,那麼zip返回生成的列表中元素個數
爲最短列表長度。
結果爲:
list函數能夠將一個元祖轉化爲列表。下面能夠將zip返回的數據轉化爲
咱們方便操做的列表元素.
結果:
這樣將zip函數返回的數據經過list和迭代,生成了二維List,方便之後操做。
下邊這段代碼在3.0版本以上和3.0版本如下會有不一樣結果。
2.7版本結果:
3.0版本結果
以前提起過zip在3.0以上版本返回迭代器指向內存地址。3.0如下
版本返回的爲列表,因此在3.0版本一下輸出是符合最初目的。
可是3.0版本python最後一行輸出卻爲空列表[]。
這個緣由主要是迭代器在被循環迭代或者訪問後,會自動
移動指針,指向下一個要迭代的元素。這和C++是不一樣的,
C++/C語言須要用戶本身控制迭代器移位。
那麼確定有人會說第一句和第三句打印的list1的值相同,
是否是list1迭代器指向的空間沒有移動呢?
不是的,只要list1被循環迭代,內部指向空間的地址就會變化,
只是調用print打印list1時,python只返回迭代器指向空間的首地址,
而不會告訴具體指向的地址空間。
修改下代碼,看看是否是上文所述那樣:
結果:
可見,輸出list1指向地址內容的時候出現StopIteration異常,
這個異常前幾篇介紹過,是由於迭代器已經指向空間的末尾了,
再調用就會出現該異常,因此對於迭代器當遍歷迭代後必定要注意
迭代器指向地址變化的問題。
2、迭代器的坑
迭代器的問題就在於被迭代使用後,內部指向的地址空間變化了,
可是打印迭代器,返回的認爲迭代器最初指向的內存空間首地址。
結果:
每次打印g返回結果都同樣,可是g指向的位置確實變了。
說實話,這種隱藏性的問題應該讓別人知道。
三、矩陣的轉置和左右逆置
經過zip函數能夠實現矩陣的轉置和逆置,
將矩陣按照每一行存儲在一個list中,這些list再組合成一個大的list,構成二維list表示矩陣。
矩陣的轉置:
下邊的例子能夠看效果:
結果:
一樣的道理,矩陣的左右逆置
結果:
四、format函數介紹
format函數經過{}替代%,實現字符串的動態匹配。
結果:
五、defaultdict函數介紹
實現一個統計字符串個數的功能。
strings = ('puppy', 'kitten', 'puppy', 'puppy', 'weasel', 'puppy', 'kitten', 'puppy')
若是用下邊的代碼實現統計功能
當counts中不存在某個單詞,第一次調用counts[kw]+=1會提示報錯。
因此有幾種方式實現該功能。
這種方式先判斷counts中是否含有關鍵字,沒有就先賦值。
這種方式經過設置counts中關鍵字對應的默認值,當counts中不存在某個關鍵字,
那麼該關鍵字對應的value爲0,而後該值+1,表示第一次統計。
若是counts中存在該關鍵字,那麼就不執行setdefault函數,關鍵字對應的value值加1。
這種方式引用了collections的defaultdict,difaultdict接收一個函數,該函數
返回dict中元素的默認值。
六、any函數介紹
any函數接收一個可迭代對象,通常爲list或者tuple,list或者tuple中有一個
元素知足條件any函數就返回true,當全部元素都不知足條件,any返回false
結果:
這是後一篇製做2048遊戲的準備,下一篇製做2048小遊戲
謝謝關注個人公衆號