天天看點

python進階特性、函數式程式設計、面向對象

切片

list和tuple、字元串。

L[:]

L[1:4]

L[-1]

str[::2]

疊代

python的疊代:隻要是可疊代對象都可以,和下标沒關系。

判斷一個對象是否是可疊代的,通過collections子產品中的Iterable類型判斷。

<code>from</code> <code>collections </code><code>import</code> <code>Iterable</code>

<code>isinstance</code><code>(</code><code>'abc'</code><code>, Iterable)</code>

<code>isinstance</code><code>([</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>], Iterable)</code>

<code>isinstance</code><code>(</code><code>123</code><code>, Iterable) </code><code>-</code><code>-</code> <code>false</code>

對list實作下标循環,使用python的enumerate函數把list變成索引-元素對。

<code>for</code> <code>i, value </code><code>in</code> <code>enumerate</code><code>([</code><code>'a'</code><code>, </code><code>'b'</code><code>, </code><code>'c'</code><code>]):</code>

<code>    </code><code>print</code><code>(i, value)</code>

<code>    </code> 

<code>0</code> <code>a</code>

<code>1</code> <code>b</code>

<code>2</code> <code>c   </code>

<code># 同時引用兩個變量</code>

<code>for</code> <code>x, y </code><code>in</code> <code>[(</code><code>1</code><code>, </code><code>1</code><code>), (</code><code>2</code><code>, </code><code>4</code><code>), (</code><code>3</code><code>, </code><code>9</code><code>)]:</code>

<code>    </code><code>print</code><code>(x, y)</code>

<code>1</code> <code>1</code>

<code>2</code> <code>4</code>

<code>3</code> <code>9</code>

清單生成式 -- List Comprehensions

用來建立list的生成式

<code>list</code><code>(</code><code>range</code><code>(</code><code>1</code><code>,</code><code>11</code><code>))</code>

<code>[</code><code>1</code><code>,</code><code>2</code><code>,</code><code>3</code><code>,</code><code>4</code><code>,</code><code>5</code><code>,</code><code>6</code><code>,</code><code>7</code><code>,</code><code>8</code><code>,</code><code>9</code><code>,</code><code>10</code><code>]</code>

<code>[x </code><code>*</code> <code>x </code><code>for</code> <code>x </code><code>in</code> <code>range</code><code>(</code><code>1</code><code>, </code><code>11</code><code>)]</code>

<code>[</code><code>1</code><code>, </code><code>4</code><code>, </code><code>9</code><code>, ...]</code>

<code># 清單生成式中的if判斷,選出符合條件的</code>

<code>[x </code><code>*</code> <code>x </code><code>for</code> <code>x </code><code>in</code> <code>range</code><code>(</code><code>1</code><code>, </code><code>11</code><code>) </code><code>if</code> <code>x </code><code>%</code> <code>2</code> <code>=</code><code>=</code> <code>0</code> <code>]</code>

<code>[ </code><code>4</code><code>, </code><code>16</code><code>, </code><code>36</code><code>, </code><code>64</code><code>, </code><code>100</code><code>]</code>

<code>[m</code><code>+</code><code>n </code><code>for</code> <code>m </code><code>in</code> <code>'abc'</code> <code>for</code> <code>n </code><code>in</code> <code>'xyz'</code><code>]</code>

<code>[</code><code>'ax'</code><code>, </code><code>'ay'</code><code>, </code><code>'az'</code><code>, </code><code>'bx'</code><code>, </code><code>'by'</code><code>, </code><code>'bz'</code><code>, </code><code>'cx'</code><code>, </code><code>'cy'</code><code>, </code><code>'cz'</code><code>]</code>

<code># 使用清單生成式,列出目錄下的所有檔案和目錄</code>

<code>import</code> <code>os</code>

<code>[d </code><code>for</code> <code>d </code><code>in</code> <code>os.listdir(</code><code>'.'</code><code>)]</code>

<code># 清單生成式使用dict生成list</code>

<code>d </code><code>=</code> <code>{</code><code>'x'</code><code>:</code><code>'a'</code><code>, </code><code>'y'</code><code>:</code><code>'b'</code><code>, </code><code>'z'</code><code>:</code><code>'c'</code><code>}</code>

<code>[k </code><code>+</code> <code>'='</code> <code>+</code> <code>v </code><code>for</code> <code>k, v </code><code>in</code> <code>d.items()]</code>

<code>[</code><code>'y=b'</code><code>, </code><code>'x=a'</code><code>, </code><code>'z=c'</code><code>]</code>

生成器 -- 解決清單生成式的記憶體溢出問題。

在循環過程中不斷推算後續的元素,不必建立完整的list,節省記憶體。一邊循環一邊計算 -- 生成器 -- generator

正常的做法是:在建立了一個generator後,使用for來疊代。

定義generator的另一種方法:在函數定義中包含yield關鍵字。

<code>def</code> <code>fib(</code><code>max</code><code>):</code>

<code>    </code><code>n, a, b </code><code>=</code> <code>0</code><code>, </code><code>0</code><code>, </code><code>1</code>

<code>    </code><code>while</code> <code>n &lt; </code><code>max</code><code>:</code>

<code>        </code><code>yield</code> <code>b</code>

<code>        </code><code>a, b </code><code>=</code> <code>b, a</code><code>+</code><code>b</code>

<code>        </code><code>n </code><code>=</code> <code>n</code><code>+</code><code>1</code>

<code>    </code><code>return</code> <code>'done'</code>

該generator的函數,在每次調用next()的時候執行,遇到yield語句傳回,再次執行從上次傳回的yield語句繼續執行。

本文轉自ting2junshui51CTO部落格,原文連結:http://blog.51cto.com/ting2junshui/1755266 ,如需轉載請自行聯系原作者