目錄
[譯]The Python Tutorial#Data Structures
5.1 Data Structures
5.1 More on Lists
sorted()
5.1.4 Nested List Comprehensions
5.2 The del statement
5.3 Tuples and Sequences
5.4 Set
5.5 Dictionaries
5.6 Looping Techniques
5.7 More on Conditions
5.8 Comparing Sequences and Other Types
Footnotes
首頁 後端開發 Python教學 [原文]Python教程#資料結構

[原文]Python教程#資料結構

Jul 05, 2017 pm 06:13 PM
python

<h2 id="譯-The-Python-Tutorial-Data-Structures">[譯]The Python Tutorial#Data Structures</h2> <h2 id="Data-Structures">5.1 Data Structures</h2> <p>本章節詳細介紹之前介紹過的一些內容,也會介紹一些新的內容。 </p> <h3 id="More-on-Lists">5.1 More on Lists</h3> <p>列表資料型別擁有更多方法,以下是列表物件的所有方法:</p> <ul> <li><p><code>list.append(x)</code><br># 在列表末尾新增項,等同於<code>a[len(a):] = [x]</code></p></li> <li><p><code>#list.extend(iterable)</code><br># 加入可迭代物件中所有的項目來擴充列表,等同於<code>a[len(a):] = iterable</code></p></li> <li><p><code>list.insert(i, x)</code><br># 在指定位置插入項。第一個參數為元素索引,新的項目會在這個索引之前插入,因此<code>a.insert(0, x)</code>會在列表最前面插入,<code>a.insert(len(a ), x)</code>等同於<code>a.append(x)</code>。 </p></li> <li><p><code>list.remove(x)</code><br># 從清單中移除值為<code>x</code>的第一個項,若<code>x</code>不存在,方法拋出例外(<code>ValueError</code>異常)</p></li> <li><p><code>list.pop([i])</code><br># 從清單中移除指定位置的項目並返回。如果沒有指定索引,<code>a.pop()</code>移除並傳回清單中最後一項。 (方法簽名中包裹<code>i</code>的方括號表示參數是可選的,而不是在這個位置寫一個方括號。這種記號法在Python Library Reference中經常用到)</p></li> <li><p><code></code><br><code></code></p></li> <li><p><code></code><br><code></code><code></code><code></code><br><em></em><em></em><em></em></p></li> <li><p><code></code><br><em> </em></p></li>list.clear()<li><p> 移除清單中的所有項,等同於<code>del a[:]</code><br><code> </code></p></li>list.index(x[, start[, end]])<li> <p># 傳回第一個值為<code>x</code>的項的基於0的索引,如果<br>x</p>不存在拋出</li>ValueError<li>異常。 <p> 可選參數<code>start</code>和<br>end<code>被解釋為切片記號法,用來將搜尋限制在列表特定的子列表內。傳回的索引是相對於完整的清單索引,而不是相對於</code>start</p>參數。 </li> </ul> <p></p> <div class="sourceCode">list.count(x)</div> <p> 傳回清單中<code>x</code>出現的次數<code></code> <code></code><sup>list.sort(key=None, reverse=False)</sup></p># 將清單的所有項目進行排序(參數以來自訂排序,請參閱<h4 id="sorted">sorted()</h4>取得更多資訊)<p><code> </code><code></code>list.reverse()</p> <div class="sourceCode"> 反轉列表元素</div> <h4 id="using-lists-as-queues"> </h4> <p></p>list.copy()<p><code> 傳回清單的淺拷貝,等同於</code>a[:]</p> <div class="sourceCode"></div> <h4 id="list-comprehensions"> </h4>以下是示範清單方法的範例:<p> </p><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> fruits <span class="op">=</span> [<span class="st">'orange'</span>, <span class="st">'apple'</span>, <span class="st">'pear'</span>, <span class="st">'banana'</span>, <span class="st">'kiwi'</span>, <span class="st">'apple'</span>, <span class="st">'banana'</span>] <span class="op">>>></span> fruits.count(<span class="st">'apple'</span>) <span class="dv">2</span> <span class="op">>>></span> fruits.count(<span class="st">'tangerine'</span>) <span class="dv">0</span> <span class="op">>>></span> fruits.index(<span class="st">'banana'</span>) <span class="dv">3</span> <span class="op">>>></span> fruits.index(<span class="st">'banana'</span>, <span class="dv">4</span>) <span class="co"># Find next banana starting a position 4</span> <span class="dv">6</span> <span class="op">>>></span> fruits.reverse() <span class="op">>>></span> fruits [<span class="st">'banana'</span>, <span class="st">'apple'</span>, <span class="st">'kiwi'</span>, <span class="st">'banana'</span>, <span class="st">'pear'</span>, <span class="st">'apple'</span>, <span class="st">'orange'</span>] <span class="op">>>></span> fruits.append(<span class="st">'grape'</span>) <span class="op">>>></span> fruits [<span class="st">'banana'</span>, <span class="st">'apple'</span>, <span class="st">'kiwi'</span>, <span class="st">'banana'</span>, <span class="st">'pear'</span>, <span class="st">'apple'</span>, <span class="st">'orange'</span>, <span class="st">'grape'</span>] <span class="op">>>></span> fruits.sort() <span class="op">>>></span> fruits [<span class="st">'apple'</span>, <span class="st">'apple'</span>, <span class="st">'banana'</span>, <span class="st">'banana'</span>, <span class="st">'grape'</span>, <span class="st">'kiwi'</span>, <span class="st">'orange'</span>, <span class="st">'pear'</span>] <span class="op">>>></span> fruits.pop() <span class="co">'pear'</span></code></pre><div class="contentsignin">登入後複製</div></div><p> </p>諸如<div class="sourceCode">insert, reverse</div>或<p>sort<code>的這樣,只改變了列表但是沒有回傳值列印,它們傳回預設的</code>None</p><div class="sourceCode">[1 ]</div>。這是Python可變資料結構適用的設計原則。 <p> </p>5.1.1 Using Lists as Stacks<div class="sourceCode"> </div>列表方法使得將其用作堆疊非常容易,堆疊中最後一個加入的元素第一個被釋放(後進先出)。使用<p>append()</p>方法加入元素到堆疊頂,使用不含參數的<p>pop()<code>將堆疊頂元素出棧。範例:</code> <code><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>&lt;code class=&quot;sourceCode python&quot;&gt;&lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack &lt;span class=&quot;op&quot;&gt;=&lt;/span&gt; [&lt;span class=&quot;dv&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;5&lt;/span&gt;] &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack.append(&lt;span class=&quot;dv&quot;&gt;6&lt;/span&gt;) &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack.append(&lt;span class=&quot;dv&quot;&gt;7&lt;/span&gt;) &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack [&lt;span class=&quot;dv&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;5&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;6&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;7&lt;/span&gt;] &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack.pop() &lt;span class=&quot;dv&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack [&lt;span class=&quot;dv&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;4&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;5&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;6&lt;/span&gt;] &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack.pop() &lt;span class=&quot;dv&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack.pop() &lt;span class=&quot;dv&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;op&quot;&gt;&gt;&gt;&gt;&lt;/span&gt; stack [&lt;span class=&quot;dv&quot;&gt;3&lt;/span&gt;, &lt;span class=&quot;dv&quot;&gt;4&lt;/span&gt;]&lt;/code&gt;</pre><div class="contentsignin">登入後複製</div></div></code> <code>5.1.2 Using Lists as Queues</code> <code>將清單用作佇列也是可能的,佇列中先加入的元素先釋放(先進先出);然而,這樣用清單效率就非常不高。因為在清單末端新增和取出元素很快,但是在清單開頭插入或刪除元素很慢(因為必須將其他所有元素位移一位)。 </code> <code>經過特殊設計的</code>collections.deque</p>在首尾兩端新增和刪除元素都很快,可以使用它來實作佇列。範例:<div class="sourceCode"> </div><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="im">from</span> collections <span class="im">import</span> deque <span class="op">>>></span> queue <span class="op">=</span> deque([<span class="st">"Eric"</span>, <span class="st">"John"</span>, <span class="st">"Michael"</span>]) <span class="op">>>></span> queue.append(<span class="st">"Terry"</span>) <span class="co"># Terry arrives</span> <span class="op">>>></span> queue.append(<span class="st">"Graham"</span>) <span class="co"># Graham arrives</span> <span class="op">>>></span> queue.popleft() <span class="co"># The first to arrive now leaves</span> <span class="co">'Eric'</span> <span class="op">>>></span> queue.popleft() <span class="co"># The second to arrive now leaves</span> <span class="co">'John'</span> <span class="op">>>></span> queue <span class="co"># Remaining queue in order of arrival</span> deque([<span class="st">'Michael'</span>, <span class="st">'Terry'</span>, <span class="st">'Graham'</span>])</code></pre><div class="contentsignin">登入後複製</div></div><p> </p>5.1.3 List Comprehensions<div class="sourceCode"> </div>列表推導式為建立清單提供了簡潔方式。一般的應用方式是:建立新列表,列表元素是對其他序列或可迭代物件操作的結果;或建立元素滿足特定條件的子序列。 ### ###假如希望建立平方列表:### ###<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> squares <span class="op">=</span> [] <span class="op">>>></span> <span class="cf">for</span> x <span class="op">in</span> <span class="bu">range</span>(<span class="dv">10</span>): ... squares.append(x<span class="op">**</span><span class="dv">2</span>) ... <span class="op">>>></span> squares [<span class="dv">0</span>, <span class="dv">1</span>, <span class="dv">4</span>, <span class="dv">9</span>, <span class="dv">16</span>, <span class="dv">25</span>, <span class="dv">36</span>, <span class="dv">49</span>, <span class="dv">64</span>, <span class="dv">81</span>]</code></pre><div class="contentsignin">登入後複製</div></div>### ###注意以上創建(或重寫)了名為###x###的變量,在循環結束之後仍然存在。使用下列方法可建立沒有任何副作用的平方列表:### ###<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python">squares <span class="op">=</span> <span class="bu">list</span>(<span class="bu">map</span>(<span class="kw">lambda</span> x: x<span class="op">**</span><span class="dv">2</span>, <span class="bu">range</span>(<span class="dv">10</span>)))</code></pre><div class="contentsignin">登入後複製</div></div>### ###或者,等用於:### ###<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python">squares <span class="op">=</span> [x<span class="op">**</span><span class="dv">2</span> <span class="cf">for</span> x <span class="op">in</span> <span class="bu">range</span>(<span class="dv">10</span>)]</code></pre><div class="contentsignin">登入後複製</div></div>### ###這種方式比較簡潔易讀。 ### ###跟著###for###子句,緊接著零個或多個###for###子句或###if###子句的表達式再加上中括號,構成了列表推導式。其傳回結果是一個新的列表,列表的元素是表達式中###for###和###if###子句的計算結果。例如,以下列表推導式組合兩個列表中不相等的元素:### ###<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> [(x, y) <span class="cf">for</span> x <span class="op">in</span> [<span class="dv">1</span>,<span class="dv">2</span>,<span class="dv">3</span>] <span class="cf">for</span> y <span class="op">in</span> [<span class="dv">3</span>,<span class="dv">1</span>,<span class="dv">4</span>] <span class="cf">if</span> x <span class="op">!=</span> y] [(<span class="dv">1</span>, <span class="dv">3</span>), (<span class="dv">1</span>, <span class="dv">4</span>), (<span class="dv">2</span>, <span class="dv">3</span>), (<span class="dv">2</span>, <span class="dv">1</span>), (<span class="dv">2</span>, <span class="dv">4</span>), (<span class="dv">3</span>, <span class="dv">1</span>), (<span class="dv">3</span>, <span class="dv">4</span>)]</code></pre><div class="contentsignin">登入後複製</div></div>### ###等價於:### ###<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> combs <span class="op">=</span> [] <span class="op">>>></span> <span class="cf">for</span> x <span class="op">in</span> [<span class="dv">1</span>,<span class="dv">2</span>,<span class="dv">3</span>]: ... <span class="cf">for</span> y <span class="op">in</span> [<span class="dv">3</span>,<span class="dv">1</span>,<span class="dv">4</span>]: ... <span class="cf">if</span> x <span class="op">!=</span> y: ... combs.append((x, y)) ... <span class="op">>>></span> combs [(<span class="dv">1</span>, <span class="dv">3</span>), (<span class="dv">1</span>, <span class="dv">4</span>), (<span class="dv">2</span>, <span class="dv">3</span>), (<span class="dv">2</span>, <span class="dv">1</span>), (<span class="dv">2</span>, <span class="dv">4</span>), (<span class="dv">3</span>, <span class="dv">1</span>), (<span class="dv">3</span>, <span class="dv">4</span>)]</code></pre><div class="contentsignin">登入後複製</div></div>### <p>注意上面两个代码段中<code>for</code>和<code>if</code>语句的顺序是相同的。</p> <p>如果表达式是一个元组(如上所示的(x, y)),必须将其加上括号。</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> vec <span class="op">=</span> [<span class="op">-</span><span class="dv">4</span>, <span class="op">-</span><span class="dv">2</span>, <span class="dv">0</span>, <span class="dv">2</span>, <span class="dv">4</span>] <span class="op">>>></span> <span class="co"># create a new list with the values doubled</span> <span class="op">>>></span> [x<span class="op">*</span><span class="dv">2</span> <span class="cf">for</span> x <span class="op">in</span> vec] [<span class="op">-</span><span class="dv">8</span>, <span class="op">-</span><span class="dv">4</span>, <span class="dv">0</span>, <span class="dv">4</span>, <span class="dv">8</span>] <span class="op">>>></span> <span class="co"># filter the list to exclude negative numbers</span> <span class="op">>>></span> [x <span class="cf">for</span> x <span class="op">in</span> vec <span class="cf">if</span> x <span class="op">>=</span> <span class="dv">0</span>] [<span class="dv">0</span>, <span class="dv">2</span>, <span class="dv">4</span>] <span class="op">>>></span> <span class="co"># apply a function to all the elements</span> <span class="op">>>></span> [<span class="bu">abs</span>(x) <span class="cf">for</span> x <span class="op">in</span> vec] [<span class="dv">4</span>, <span class="dv">2</span>, <span class="dv">0</span>, <span class="dv">2</span>, <span class="dv">4</span>] <span class="op">>>></span> <span class="co"># call a method on each element</span> <span class="op">>>></span> freshfruit <span class="op">=</span> [<span class="st">' banana'</span>, <span class="st">' loganberry '</span>, <span class="st">'passion fruit '</span>] <span class="op">>>></span> [weapon.strip() <span class="cf">for</span> weapon <span class="op">in</span> freshfruit] [<span class="st">'banana'</span>, <span class="st">'loganberry'</span>, <span class="st">'passion fruit'</span>] <span class="op">>>></span> <span class="co"># create a list of 2-tuples like (number, square)</span> <span class="op">>>></span> [(x, x<span class="op">**</span><span class="dv">2</span>) <span class="cf">for</span> x <span class="op">in</span> <span class="bu">range</span>(<span class="dv">6</span>)] [(<span class="dv">0</span>, <span class="dv">0</span>), (<span class="dv">1</span>, <span class="dv">1</span>), (<span class="dv">2</span>, <span class="dv">4</span>), (<span class="dv">3</span>, <span class="dv">9</span>), (<span class="dv">4</span>, <span class="dv">16</span>), (<span class="dv">5</span>, <span class="dv">25</span>)] <span class="op">>>></span> <span class="co"># the tuple must be parenthesized, otherwise an error is raised</span> <span class="op">>>></span> [x, x<span class="op">**</span><span class="dv">2</span> <span class="cf">for</span> x <span class="op">in</span> <span class="bu">range</span>(<span class="dv">6</span>)] File <span class="st">"<stdin>"</span>, line <span class="dv">1</span>, <span class="op">in</span> <span class="op"><</span>module<span class="op">></span> [x, x<span class="op">**</span><span class="dv">2</span> <span class="cf">for</span> x <span class="op">in</span> <span class="bu">range</span>(<span class="dv">6</span>)] <span class="op">^</span> <span class="pp">SyntaxError</span>: invalid syntax <span class="op">>>></span> <span class="co"># flatten a list using a listcomp with two 'for'</span> <span class="op">>>></span> vec <span class="op">=</span> [[<span class="dv">1</span>,<span class="dv">2</span>,<span class="dv">3</span>], [<span class="dv">4</span>,<span class="dv">5</span>,<span class="dv">6</span>], [<span class="dv">7</span>,<span class="dv">8</span>,<span class="dv">9</span>]] <span class="op">>>></span> [num <span class="cf">for</span> elem <span class="op">in</span> vec <span class="cf">for</span> num <span class="op">in</span> elem] [<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span>, <span class="dv">6</span>, <span class="dv">7</span>, <span class="dv">8</span>, <span class="dv">9</span>]</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>列表推导式可以包含复杂的表达式甚至嵌套函数:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="im">from</span> math <span class="im">import</span> pi <span class="op">>>></span> [<span class="bu">str</span>(<span class="bu">round</span>(pi, i)) <span class="cf">for</span> i <span class="op">in</span> <span class="bu">range</span>(<span class="dv">1</span>, <span class="dv">6</span>)] [<span class="st">'3.1'</span>, <span class="st">'3.14'</span>, <span class="st">'3.142'</span>, <span class="st">'3.1416'</span>, <span class="st">'3.14159'</span>]</code></pre><div class="contentsignin">登入後複製</div></div></div> <h4 id="Nested-List-Comprehensions">5.1.4 Nested List Comprehensions</h4> <p>列表推导式开头的表达式可以是任意表达式,包括另一个列表推导式。</p> <p>考虑以下示例,一个包含3个长度为4的列表的列表实现了3x4的矩阵:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python">matrix <span class="op">=</span> [ [<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>], [<span class="dv">5</span>, <span class="dv">6</span>, <span class="dv">7</span>, <span class="dv">8</span>], [<span class="dv">9</span>, <span class="dv">10</span>, <span class="dv">11</span>, <span class="dv">12</span>], ]</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>以下列表推导式反转行列:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> [[row[i] <span class="cf">for</span> row <span class="op">in</span> matrix] <span class="cf">for</span> i <span class="op">in</span> <span class="bu">range</span>(<span class="dv">4</span>)] [[<span class="dv">1</span>, <span class="dv">5</span>, <span class="dv">9</span>], [<span class="dv">2</span>, <span class="dv">6</span>, <span class="dv">10</span>], [<span class="dv">3</span>, <span class="dv">7</span>, <span class="dv">11</span>], [<span class="dv">4</span>, <span class="dv">8</span>, <span class="dv">12</span>]]</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>前面的章节提到,嵌套的列表推导式是在其后跟随的<code>for</code>的上下文中求值的,因此这个示例等同于:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> transposed <span class="op">=</span> [] <span class="op">>>></span> <span class="cf">for</span> i <span class="op">in</span> <span class="bu">range</span>(<span class="dv">4</span>): ... transposed.append([row[i] <span class="cf">for</span> row <span class="op">in</span> matrix]) ... <span class="op">>>></span> transposed [[<span class="dv">1</span>, <span class="dv">5</span>, <span class="dv">9</span>], [<span class="dv">2</span>, <span class="dv">6</span>, <span class="dv">10</span>], [<span class="dv">3</span>, <span class="dv">7</span>, <span class="dv">11</span>], [<span class="dv">4</span>, <span class="dv">8</span>, <span class="dv">12</span>]]</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>依次等同于:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> transposed <span class="op">=</span> [] <span class="op">>>></span> <span class="cf">for</span> i <span class="op">in</span> <span class="bu">range</span>(<span class="dv">4</span>): ... <span class="co"># the following 3 lines implement the nested listcomp</span> ... transposed_row <span class="op">=</span> [] ... <span class="cf">for</span> row <span class="op">in</span> matrix: ... transposed_row.append(row[i]) ... transposed.append(transposed_row) <span class="op">>>></span> transposed [[<span class="dv">1</span>, <span class="dv">5</span>, <span class="dv">9</span>], [<span class="dv">2</span>, <span class="dv">6</span>, <span class="dv">10</span>], [<span class="dv">3</span>, <span class="dv">7</span>, <span class="dv">11</span>], [<span class="dv">4</span>, <span class="dv">8</span>, <span class="dv">12</span>]]</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>在实践中,应该选择built-in函数来复合流程语句。在以上的用例中<code>zip()</code>函数更有用:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="bu">list</span>(<span class="bu">zip</span>(<span class="op">*</span>matrix)) [(<span class="dv">1</span>, <span class="dv">5</span>, <span class="dv">9</span>), (<span class="dv">2</span>, <span class="dv">6</span>, <span class="dv">10</span>), (<span class="dv">3</span>, <span class="dv">7</span>, <span class="dv">11</span>), (<span class="dv">4</span>, <span class="dv">8</span>, <span class="dv">12</span>)]</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>参见 Unpacking Argument Lists了解关于上面<code>*</code>使用的更多详细信息。</p> <h3 id="The-del-statement">5.2 The del statement</h3> <p>在提供列表索引而不是值的情况下,有一种方法可以移除列表中的元素:<code>del</code>语句。这种方式与返回值的<code>pop()</code>方法不同。<code>del</code>语句也可以用来移除部分列表或者清除整个列表(之前使用将空的列表赋值给列表片段的方式实现)。示例:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> a <span class="op">=</span> [<span class="op">-</span><span class="dv">1</span>, <span class="dv">1</span>, <span class="fl">66.25</span>, <span class="dv">333</span>, <span class="dv">333</span>, <span class="fl">1234.5</span>] <span class="op">>>></span> <span class="kw">del</span> a[<span class="dv">0</span>] <span class="op">>>></span> a [<span class="dv">1</span>, <span class="fl">66.25</span>, <span class="dv">333</span>, <span class="dv">333</span>, <span class="fl">1234.5</span>] <span class="op">>>></span> <span class="kw">del</span> a[<span class="dv">2</span>:<span class="dv">4</span>] <span class="op">>>></span> a [<span class="dv">1</span>, <span class="fl">66.25</span>, <span class="fl">1234.5</span>] <span class="op">>>></span> <span class="kw">del</span> a[:] <span class="op">>>></span> a []</code></pre><div class="contentsignin">登入後複製</div></div></div> <p><code>del</code>也可以用来删除整个变量:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="kw">del</span> a</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>此后引用名字<code>a</code>会抛出异常(至少在其他值赋值给名字<code>a</code>之前)。接下来会有更多<code>del</code>的使用</p> <h3 id="Tuples-and-Sequences">5.3 Tuples and Sequences</h3> <p>列表和字符串有很多常用属性,比如索引和切片操作。它们是<em>序列</em>数据类型(参见 Sequence Types - list, tuple, range)的两种。Python是一种不断进化的语言,其他的序列类型也可以加入。<em>元组</em>是另一种标准的序列数据类型。</p> <p>元组包含若干由逗号分隔的值,示例:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> t <span class="op">=</span> <span class="dv">12345</span>, <span class="dv">54321</span>, <span class="st">'hello!'</span> <span class="op">>>></span> t[<span class="dv">0</span>] <span class="dv">12345</span> <span class="op">>>></span> t (<span class="dv">12345</span>, <span class="dv">54321</span>, <span class="st">'hello!'</span>) <span class="op">>>></span> <span class="co"># Tuples may be nested:</span> ... u <span class="op">=</span> t, (<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span>) <span class="op">>>></span> u ((<span class="dv">12345</span>, <span class="dv">54321</span>, <span class="st">'hello!'</span>), (<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>, <span class="dv">5</span>)) <span class="op">>>></span> <span class="co"># Tuples are immutable:</span> ... t[<span class="dv">0</span>] <span class="op">=</span> <span class="dv">88888</span> Traceback (most recent call last): File <span class="st">"<stdin>"</span>, line <span class="dv">1</span>, <span class="op">in</span> <span class="op"><</span>module<span class="op">></span> <span class="pp">TypeError</span>: <span class="st">'tuple'</span> <span class="bu">object</span> does <span class="op">not</span> support item assignment <span class="op">>>></span> <span class="co"># but they can contain mutable objects:</span> ... v <span class="op">=</span> ([<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>], [<span class="dv">3</span>, <span class="dv">2</span>, <span class="dv">1</span>]) <span class="op">>>></span> v ([<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>], [<span class="dv">3</span>, <span class="dv">2</span>, <span class="dv">1</span>])</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>可见,输出的元组总是放在圆括号中,以便于嵌套的元组可以被正确解析;虽然圆括号总是必须的(如果元组是其他更大表达式的一部分),但是在输入元组的时候可以选择使用圆括号。不能对元组的单个项赋值,但是可以创建包含如列表的可变对象的元组。</p> <p>虽然元组和列表有些相似,但是他们通常以不同的目的,用于不同的场景。元组是不可变的,通常包含不同类型的元素,可以通过拆包操作(参见后续章节)或者索引(或者当元组是命名元组时,甚至可以通过属性来访问)来访问。列表是可变的,通常其元素也是不同类型的,可以通过对列表的迭代访问元素。</p> <p>构建包含零个或者1个项的元组比较特殊:一种额外的奇怪语法可以适用于这种情况。空元组由一对空的圆括号创建;一个元素的元组由一个跟着逗号的值创建(在圆括号中放入单个值是不够的。译注:这种情况:(1)表示整数而不是元组,使用(1, )表示元组也是可行的)。丑陋但是有效。示例:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> empty <span class="op">=</span> () <span class="op">>>></span> singleton <span class="op">=</span> <span class="st">'hello'</span>, <span class="co"># <-- note trailing comma</span> <span class="op">>>></span> <span class="bu">len</span>(empty) <span class="dv">0</span> <span class="op">>>></span> <span class="bu">len</span>(singleton) <span class="dv">1</span> <span class="op">>>></span> singleton (<span class="st">'hello'</span>,)</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>语句<code>t = 12345, 54321, 'hello!'</code>是封装元组的一个示例:值<code>12345, 54321</code>和<code>hello!</code>被封装到了一个元组中。逆向操作也是可行的:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> x, y, z <span class="op">=</span> t</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>非常恰当地称之为<em>序列解包</em>,适用于任何在等号右边的序列(译注:等号右操作数)。序列解包要求等号左边待赋值的变量数量与序列包含元素数目相同。注意多重赋值只是封装元组和序列解包的结合(译注:多重赋值:<code>i, j = 1, 2</code>)</p> <h3 id="Set">5.4 Set</h3> <p>Python也包含实现了<em>集合</em>的数据类型。集合是无序不重复的元素集。基本功能包括成员关系测试和重复实体消除。集合对象也支持并集,交集,差集以及对称差集等数学操作。</p> <p>可以使用花括号和<code>set()</code>函数创建集合。谨记:创建空集合必须使用<code>set</code>函数,不能使用<code>{}</code>,后者用于创建空字典。</p> <p>以下是简单示范:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> basket <span class="op">=</span> {<span class="st">'apple'</span>, <span class="st">'orange'</span>, <span class="st">'apple'</span>, <span class="st">'pear'</span>, <span class="st">'orange'</span>, <span class="st">'banana'</span>} <span class="op">>>></span> <span class="bu">print</span>(basket) <span class="co"># show that duplicates have been removed</span> {<span class="st">'orange'</span>, <span class="st">'banana'</span>, <span class="st">'pear'</span>, <span class="st">'apple'</span>} <span class="op">>>></span> <span class="st">'orange'</span> <span class="op">in</span> basket <span class="co"># fast membership testing</span> <span class="va">True</span> <span class="op">>>></span> <span class="st">'crabgrass'</span> <span class="op">in</span> basket <span class="va">False</span> <span class="op">>>></span> <span class="co"># Demonstrate set operations on unique letters from two words</span> ... <span class="op">>>></span> a <span class="op">=</span> <span class="bu">set</span>(<span class="st">'abracadabra'</span>) <span class="op">>>></span> b <span class="op">=</span> <span class="bu">set</span>(<span class="st">'alacazam'</span>) <span class="op">>>></span> a <span class="co"># unique letters in a</span> {<span class="st">'a'</span>, <span class="st">'r'</span>, <span class="st">'b'</span>, <span class="st">'c'</span>, <span class="st">'d'</span>} <span class="op">>>></span> a <span class="op">-</span> b <span class="co"># letters in a but not in b</span> {<span class="st">'r'</span>, <span class="st">'d'</span>, <span class="st">'b'</span>} <span class="op">>>></span> a <span class="op">|</span> b <span class="co"># letters in a or b or both</span> {<span class="st">'a'</span>, <span class="st">'c'</span>, <span class="st">'r'</span>, <span class="st">'d'</span>, <span class="st">'b'</span>, <span class="st">'m'</span>, <span class="st">'z'</span>, <span class="st">'l'</span>} <span class="op">>>></span> a <span class="op">&</span> b <span class="co"># letters in both a and b</span> {<span class="st">'a'</span>, <span class="st">'c'</span>} <span class="op">>>></span> a <span class="op">^</span> b <span class="co"># letters in a or b but not both</span> {<span class="st">'r'</span>, <span class="st">'d'</span>, <span class="st">'b'</span>, <span class="st">'m'</span>, <span class="st">'z'</span>, <span class="st">'l'</span>}</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>与列表推导式相同,Python也支持集合推导式:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> a <span class="op">=</span> {x <span class="cf">for</span> x <span class="op">in</span> <span class="st">'abracadabra'</span> <span class="cf">if</span> x <span class="op">not</span> <span class="op">in</span> <span class="st">'abc'</span>} <span class="op">>>></span> a {<span class="st">'r'</span>, <span class="st">'d'</span>}</code></pre><div class="contentsignin">登入後複製</div></div></div> <h3 id="Dictionaries">5.5 Dictionaries</h3> <p>另一个内嵌入Python中的数据结构是<em>字典</em>(参见 Mapping Types - dict)。字典在其他一些语言中被称为<em>“联合存储”</em>或者<em>“联合数组”</em>。与序列不同,序列以一系列数字作索引,字典以<em>键</em>作索引,键可以是任何不可变类型;通常使用字符串和数字作为键。只包含字符串,数字或者其他元组的元组也可以作为键;直接或者间接包含可变对象的元组不能作为键。因为列表可以使用索引赋值,切片赋值或者<code>append()</code>以及<code>extend()</code>等方法改变自身,所以列表不能作为键。</p> <p>最好的理解字典的方式是将其认为是键值对的无序集合,同一集合中键唯一。一对花括号创建空字典:<code>{}</code>。在花括号中放置由逗号分隔键值对列表可以为字典添加初始键值对;这也是字典输出的格式。</p> <p>字典提供的主要操作是:使用键存储值以及取值。可以使用<code>del</code>删除一个键值对。如果使用已经存在的键来存储值,那么与键关联的旧值会被重写。使用不存在的键来取值会抛出异常。</p> <p>在字典上执行<code>list(d.keys())</code>返回字典所有键的无序列表(使用<code>sorted(d.keys())</code>使其有序)<sup>[2]</sup>。使用关键字<code>in</code>检查键在字典中是否存在。</p> <p>以下是使用字典的示例:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> tel <span class="op">=</span> {<span class="st">'jack'</span>: <span class="dv">4098</span>, <span class="st">'sape'</span>: <span class="dv">4139</span>} <span class="op">>>></span> tel[<span class="st">'guido'</span>] <span class="op">=</span> <span class="dv">4127</span> <span class="op">>>></span> tel {<span class="st">'sape'</span>: <span class="dv">4139</span>, <span class="st">'guido'</span>: <span class="dv">4127</span>, <span class="st">'jack'</span>: <span class="dv">4098</span>} <span class="op">>>></span> tel[<span class="st">'jack'</span>] <span class="dv">4098</span> <span class="op">>>></span> <span class="kw">del</span> tel[<span class="st">'sape'</span>] <span class="op">>>></span> tel[<span class="st">'irv'</span>] <span class="op">=</span> <span class="dv">4127</span> <span class="op">>>></span> tel {<span class="st">'guido'</span>: <span class="dv">4127</span>, <span class="st">'irv'</span>: <span class="dv">4127</span>, <span class="st">'jack'</span>: <span class="dv">4098</span>} <span class="op">>>></span> <span class="bu">list</span>(tel.keys()) [<span class="st">'irv'</span>, <span class="st">'guido'</span>, <span class="st">'jack'</span>] <span class="op">>>></span> <span class="bu">sorted</span>(tel.keys()) [<span class="st">'guido'</span>, <span class="st">'irv'</span>, <span class="st">'jack'</span>] <span class="op">>>></span> <span class="st">'guido'</span> <span class="op">in</span> tel <span class="va">True</span> <span class="op">>>></span> <span class="st">'jack'</span> <span class="op">not</span> <span class="op">in</span> tel <span class="va">False</span></code></pre><div class="contentsignin">登入後複製</div></div></div> <p><code>dict()</code>构造器直接使用键值对序列构造字典:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="bu">dict</span>([(<span class="st">'sape'</span>, <span class="dv">4139</span>), (<span class="st">'guido'</span>, <span class="dv">4127</span>), (<span class="st">'jack'</span>, <span class="dv">4098</span>)]) {<span class="st">'sape'</span>: <span class="dv">4139</span>, <span class="st">'jack'</span>: <span class="dv">4098</span>, <span class="st">'guido'</span>: <span class="dv">4127</span>}</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>此外,字典推导式可以从任意键值表达式中创建字典:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> {x: x<span class="op">**</span><span class="dv">2</span> <span class="cf">for</span> x <span class="op">in</span> (<span class="dv">2</span>, <span class="dv">4</span>, <span class="dv">6</span>)} {<span class="dv">2</span>: <span class="dv">4</span>, <span class="dv">4</span>: <span class="dv">16</span>, <span class="dv">6</span>: <span class="dv">36</span>}</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>当键是简单的字符串时,可以使用关键字参数来指定键值对:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="bu">dict</span>(sape<span class="op">=</span><span class="dv">4139</span>, guido<span class="op">=</span><span class="dv">4127</span>, jack<span class="op">=</span><span class="dv">4098</span>) {<span class="st">'sape'</span>: <span class="dv">4139</span>, <span class="st">'jack'</span>: <span class="dv">4098</span>, <span class="st">'guido'</span>: <span class="dv">4127</span>}</code></pre><div class="contentsignin">登入後複製</div></div></div> <h3 id="Looping-Techniques">5.6 Looping Techniques</h3> <p>遍历字典时,使用<code>items()</code>方法可以同时检索键及其对应的值。</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> knights <span class="op">=</span> {<span class="st">'gallahad'</span>: <span class="st">'the pure'</span>, <span class="st">'robin'</span>: <span class="st">'the brave'</span>} <span class="op">>>></span> <span class="cf">for</span> k, v <span class="op">in</span> knights.items(): ... <span class="bu">print</span>(k, v) ... gallahad the pure robin the brave</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>遍历序列时,使用<code>enumerate()</code>函数可以同时检索位置索引及其对应的值:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="cf">for</span> i, v <span class="op">in</span> <span class="bu">enumerate</span>([<span class="st">'tic'</span>, <span class="st">'tac'</span>, <span class="st">'toe'</span>]): ... <span class="bu">print</span>(i, v) ... <span class="dv">0</span> tic <span class="dv">1</span> tac <span class="dv">2</span> toe</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>同时遍历两个或者更多序列时,使用<code>zip()</code>函数可以将元素组成对:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> questions <span class="op">=</span> [<span class="st">'name'</span>, <span class="st">'quest'</span>, <span class="st">'favorite color'</span>] <span class="op">>>></span> answers <span class="op">=</span> [<span class="st">'lancelot'</span>, <span class="st">'the holy grail'</span>, <span class="st">'blue'</span>] <span class="op">>>></span> <span class="cf">for</span> q, a <span class="op">in</span> <span class="bu">zip</span>(questions, answers): ... <span class="bu">print</span>(<span class="st">'What is your </span><span class="sc">{0}</span><span class="st">? It is </span><span class="sc">{1}</span><span class="st">.'</span>.<span class="bu">format</span>(q, a)) ... What <span class="op">is</span> your name? It <span class="op">is</span> lancelot. What <span class="op">is</span> your quest? It <span class="op">is</span> the holy grail. What <span class="op">is</span> your favorite color? It <span class="op">is</span> blue.</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>需要逆序遍历序列时,首先指定一个正向的序列,然后调用<code>reversed()</code>函数:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="cf">for</span> i <span class="op">in</span> <span class="bu">reversed</span>(<span class="bu">range</span>(<span class="dv">1</span>, <span class="dv">10</span>, <span class="dv">2</span>)): ... <span class="bu">print</span>(i) ... <span class="dv">9</span> <span class="dv">7</span> <span class="dv">5</span> <span class="dv">3</span> <span class="dv">1</span></code></pre><div class="contentsignin">登入後複製</div></div></div> <p>需要以特定顺序遍历序列时,使用<code>sorted()</code>函数返回新的有序序列,原序列不会改动:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> basket <span class="op">=</span> [<span class="st">'apple'</span>, <span class="st">'orange'</span>, <span class="st">'apple'</span>, <span class="st">'pear'</span>, <span class="st">'orange'</span>, <span class="st">'banana'</span>] <span class="op">>>></span> <span class="cf">for</span> f <span class="op">in</span> <span class="bu">sorted</span>(<span class="bu">set</span>(basket)): ... <span class="bu">print</span>(f) ... apple banana orange pear</code></pre><div class="contentsignin">登入後複製</div></div></div> <p>有时需要在遍历序列的同时修改序列,创建新的替代序列更加简单并且安全:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> <span class="im">import</span> math <span class="op">>>></span> raw_data <span class="op">=</span> [<span class="fl">56.2</span>, <span class="bu">float</span>(<span class="st">'NaN'</span>), <span class="fl">51.7</span>, <span class="fl">55.3</span>, <span class="fl">52.5</span>, <span class="bu">float</span>(<span class="st">'NaN'</span>), <span class="fl">47.8</span>] <span class="op">>>></span> filtered_data <span class="op">=</span> [] <span class="op">>>></span> <span class="cf">for</span> value <span class="op">in</span> raw_data: ... <span class="cf">if</span> <span class="op">not</span> math.isnan(value): ... filtered_data.append(value) ... <span class="op">>>></span> filtered_data [<span class="fl">56.2</span>, <span class="fl">51.7</span>, <span class="fl">55.3</span>, <span class="fl">52.5</span>, <span class="fl">47.8</span>]</code></pre><div class="contentsignin">登入後複製</div></div></div> <h3 id="More-on-Conditions">5.7 More on Conditions</h3> <p><code>while</code>和<code>if</code>语句中使用的条件可以包含任意操作符,不仅仅是比较运算符。</p> <p>比较运算符<code>in</code>和<code>not in</code>检查指定值在序列中是否存在(不存在)。操作符<code>is</code>和<code>is not</code>比较两个对象是否真正相同(内存地址比较);这两个操作符只对像列表那样的可变对象重要。所有的比较运算符拥有相同的优先级,并且都低于数字运算符。</p> <p>比较运算符可以链接起来。例如<code>a < b == c</code>测试<code>b</code>是否大于<code>a</code>同时<code>b</code>等于<code>c</code>(译注:同其他高级语言的:<code>a < b and b == c</code>)</p> <p>比较运算符可以结合布尔运算符<code>and</code>和<code>or</code>使用,比较的结果(或者其他任何布尔表达式)可以使用<code>not</code>来作否定。<code>and</code>,<code>or</code>和<code>not</code>优先级比比较运算符低;其中<code>not</code>的优先级最高而<code>or</code>优先级最低,因此<code>A and not B or C</code>等同于<code>(A and (not B)) or C</code>。一如既往,可以使用圆括号表述想要的优先级顺序。</p> <p>布尔运算符<code>and</code>和<code>or</code>号称<em>短路</em>运算符:它们的参数从左向右求值,一旦结果确定,求值过程就会停止。例如,如果<code>A</code>和<code>C</code>是真,<code>B</code>是假,<code>A and B and C</code>不会对表达式<code>C</code>求值(译注:<code>A and B</code>为假,已经确定了整个表达式<code>A and B and C</code>的值为假,表达式<code>C</code>的值对结果不会造成影响,因此不会对其求值)。当用作一般值而不是布尔值时,短路操作的返回值是最后一个求值的参数。</p> <p>可以将比较运算或者布尔表达式赋值给变量:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python"><span class="op">>>></span> string1, string2, string3 <span class="op">=</span> <span class="st">''</span>, <span class="st">'Trondheim'</span>, <span class="st">'Hammer Dance'</span> <span class="op">>>></span> non_null <span class="op">=</span> string1 <span class="op">or</span> string2 <span class="op">or</span> string3 <span class="op">>>></span> non_null <span class="co">'Trondheim'</span></code></pre><div class="contentsignin">登入後複製</div></div></div> <p>注意在Python中,赋值操作不能像C语言一样在表达式内发生。C程序员也许会抱怨,但是这避免了C程序中遇到的一个普遍问题:当想要表示<code>==</code>时候可能误用了<code>=</code>。</p> <h3 id="Comparing-Sequences-and-Other-Types">5.8 Comparing Sequences and Other Types</h3> <p>相同序列类型之间的序列对象可以相互比较。比较使用字典序:首先比较两个序列的第一项,如果它们不同,比较运算的结果就可确定了;如果它们不同,比较两个序列中的下一个项,以此类推,直到其中一个序列耗尽。如果被比较的两个项是同一类型的,那么使用字典序递归比较。如果两个序列的所有项都是相等的,那么他们相等。如果其中一个序列是另一个序列的子序列,那么短的一个序列较小。字符串的字典序使用Unicode代码点数字排序单个字符。</p> <p>以下是相同类型的序列对象之间的比较示例:</p> <div class="sourceCode"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'><code class="sourceCode python">(<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>) <span class="op"><</span> (<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">4</span>) [<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>] <span class="op"><</span> [<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">4</span>] <span class="co">'ABC'</span> <span class="op"><</span> <span class="st">'C'</span> <span class="op"><</span> <span class="st">'Pascal'</span> <span class="op"><</span> <span class="st">'Python'</span> (<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>, <span class="dv">4</span>) <span class="op"><</span> (<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">4</span>) (<span class="dv">1</span>, <span class="dv">2</span>) <span class="op"><</span> (<span class="dv">1</span>, <span class="dv">2</span>, <span class="op">-</span><span class="dv">1</span>) (<span class="dv">1</span>, <span class="dv">2</span>, <span class="dv">3</span>) <span class="op">==</span> (<span class="fl">1.0</span>, <span class="fl">2.0</span>, <span class="fl">3.0</span>) (<span class="dv">1</span>, <span class="dv">2</span>, (<span class="st">'aa'</span>, <span class="st">'ab'</span>)) <span class="op"><</span> (<span class="dv">1</span>, <span class="dv">2</span>, (<span class="st">'abc'</span>, <span class="st">'a'</span>), <span class="dv">4</span>)</code></pre><div class="contentsignin">登入後複製</div></div> <p>注意当不同类型对象之间有合适的比较方式时,使用<code><</code>或者<code>></code>比较不同类型的对象是合法的。例如,混合数字类型之间的比较是根据其数字上的值,0等于0.0。否则,解释器会抛出<code>TypeException</code>异常,而不是随意提供结果</p> <h3 id="Footnotes">Footnotes</h3> <p><span id="jump1">[1] </span> 其他语言可能返回改变后的对象,从而允许方法链接,如:<code>d->insert("a")>remove("b")->sort();</code><br><span id="jump2">[2] </span> 调用<code>d.keys()</code>返回一个<em>dictionary view</em>对象。从而支持如成员关系测试和迭代之类的操作,但是其内容并不是独立于原始字典的,只是一个<em>视图</em></p>

以上是[原文]Python教程#資料結構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1318
25
PHP教程
1268
29
C# 教程
1248
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Golang vs. Python:性能和可伸縮性 Golang vs. Python:性能和可伸縮性 Apr 19, 2025 am 12:18 AM

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

notepad 怎麼運行python notepad 怎麼運行python Apr 16, 2025 pm 07:33 PM

在 Notepad 中運行 Python 代碼需要安裝 Python 可執行文件和 NppExec 插件。安裝 Python 並為其添加 PATH 後,在 NppExec 插件中配置命令為“python”、參數為“{CURRENT_DIRECTORY}{FILE_NAME}”,即可在 Notepad 中通過快捷鍵“F6”運行 Python 代碼。

See all articles