python學習筆記(四) 思考和準備

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小遊戲

謝謝關注個人公衆號

相關文章
相關標籤/搜索