summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--LectureNotesOnPython.html261
-rw-r--r--LectureNotesOnPython.rst106
2 files changed, 283 insertions, 84 deletions
diff --git a/LectureNotesOnPython.html b/LectureNotesOnPython.html
index f56596b..600059c 100644
--- a/LectureNotesOnPython.html
+++ b/LectureNotesOnPython.html
@@ -376,58 +376,59 @@ ul.auto-toc {
<div class="contents topic" id="id1">
<p class="topic-title first">内容目录</p>
<ul class="simple">
-<li><a class="reference internal" href="#id2" id="id24">前言</a></li>
-<li><a class="reference internal" href="#python" id="id25">Python的发音纠正</a></li>
-<li><a class="reference internal" href="#id3" id="id26">Python源流</a></li>
-<li><a class="reference internal" href="#id4" id="id27">Python的关键词</a></li>
-<li><a class="reference internal" href="#id5" id="id28">值的类型</a></li>
-<li><a class="reference internal" href="#variable" id="id29">变量(Variable)</a></li>
-<li><a class="reference internal" href="#mutable" id="id30">可变(mutable)类型与不可变类型</a></li>
-<li><a class="reference internal" href="#id6" id="id31">数与格式化显示</a></li>
-<li><a class="reference internal" href="#strings" id="id32">字符串(Strings)</a></li>
-<li><a class="reference internal" href="#concatenation" id="id33">字符串相加(concatenation)</a></li>
-<li><a class="reference internal" href="#slice" id="id34">子串(slice)</a></li>
-<li><a class="reference internal" href="#id7" id="id35">搜索字符串</a></li>
-<li><a class="reference internal" href="#string" id="id36">String类(对象)方法</a></li>
-<li><a class="reference internal" href="#in" id="id37">in操作符</a></li>
-<li><a class="reference internal" href="#id8" id="id38">字符串比较</a></li>
-<li><a class="reference internal" href="#id9" id="id39">列表</a></li>
-<li><a class="reference internal" href="#id10" id="id40">列表作为参数</a></li>
-<li><a class="reference internal" href="#append" id="id41">注意区别 <tt class="docutils literal">append</tt> 与 <tt class="docutils literal">+</tt> 操作符</a><ul>
-<li><a class="reference internal" href="#tdd-test-driven-development" id="id42">TDD - Test-driven Development</a></li>
-<li><a class="reference internal" href="#id11" id="id43">计算复杂度</a></li>
+<li><a class="reference internal" href="#id2" id="id25">前言</a></li>
+<li><a class="reference internal" href="#python" id="id26">Python的发音纠正</a></li>
+<li><a class="reference internal" href="#id3" id="id27">Python源流</a></li>
+<li><a class="reference internal" href="#id4" id="id28">Python的关键词</a></li>
+<li><a class="reference internal" href="#id5" id="id29">值的类型</a></li>
+<li><a class="reference internal" href="#variable" id="id30">变量(Variable)</a></li>
+<li><a class="reference internal" href="#mutable" id="id31">可变(mutable)类型与不可变类型</a></li>
+<li><a class="reference internal" href="#id6" id="id32">数与格式化显示</a></li>
+<li><a class="reference internal" href="#strings" id="id33">字符串(Strings)</a></li>
+<li><a class="reference internal" href="#concatenation" id="id34">字符串相加(concatenation)</a></li>
+<li><a class="reference internal" href="#slice" id="id35">子串(slice)</a></li>
+<li><a class="reference internal" href="#id7" id="id36">搜索字符串</a></li>
+<li><a class="reference internal" href="#string" id="id37">String类(对象)方法</a></li>
+<li><a class="reference internal" href="#in" id="id38">in操作符</a></li>
+<li><a class="reference internal" href="#id8" id="id39">字符串比较</a></li>
+<li><a class="reference internal" href="#id9" id="id40">列表</a></li>
+<li><a class="reference internal" href="#id10" id="id41">列表作为参数</a></li>
+<li><a class="reference internal" href="#append" id="id42">注意区别 <tt class="docutils literal">append</tt> 与 <tt class="docutils literal">+</tt> 操作符</a><ul>
+<li><a class="reference internal" href="#tdd-test-driven-development" id="id43">TDD - Test-driven Development</a></li>
+<li><a class="reference internal" href="#id11" id="id44">计算复杂度</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#dictionary" id="id44">字典(Dictionary)</a><ul>
-<li><a class="reference internal" href="#incremental-development" id="id45">递增开发(Incremental Development)</a></li>
-<li><a class="reference internal" href="#keyvalue" id="id46">key与value互换</a></li>
-<li><a class="reference internal" href="#id12" id="id47">字典里面可以有字典</a></li>
+<li><a class="reference internal" href="#dictionary" id="id45">字典(Dictionary)</a><ul>
+<li><a class="reference internal" href="#incremental-development" id="id46">递增开发(Incremental Development)</a></li>
+<li><a class="reference internal" href="#keyvalue" id="id47">key与value互换</a></li>
+<li><a class="reference internal" href="#id12" id="id48">字典里面可以有字典</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#id13" id="id48">函数</a><ul>
-<li><a class="reference internal" href="#id14" id="id49">局部变量</a></li>
-<li><a class="reference internal" href="#id15" id="id50">全局变量</a></li>
-<li><a class="reference internal" href="#id16" id="id51">调用函数与传递参数</a></li>
-<li><a class="reference internal" href="#flow-of-execution" id="id52">函数执行顺序 (flow of execution)</a></li>
+<li><a class="reference internal" href="#id13" id="id49">函数</a><ul>
+<li><a class="reference internal" href="#id14" id="id50">局部变量</a></li>
+<li><a class="reference internal" href="#id15" id="id51">全局变量</a></li>
+<li><a class="reference internal" href="#id16" id="id52">调用函数与传递参数</a></li>
+<li><a class="reference internal" href="#flow-of-execution" id="id53">函数执行顺序 (flow of execution)</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#id17" id="id53">排序</a><ul>
-<li><a class="reference internal" href="#id18" id="id54">排序一组数或一组字符串</a></li>
-<li><a class="reference internal" href="#id19" id="id55">自定义排序算法</a><ul>
-<li><a class="reference internal" href="#id20" id="id56">选择排序</a></li>
-<li><a class="reference internal" href="#merge-sort" id="id57">合并排序 (Merge sort)</a></li>
+<li><a class="reference internal" href="#id17" id="id54">文件</a></li>
+<li><a class="reference internal" href="#id18" id="id55">排序</a><ul>
+<li><a class="reference internal" href="#id19" id="id56">排序一组数或一组字符串</a></li>
+<li><a class="reference internal" href="#id20" id="id57">自定义排序算法</a><ul>
+<li><a class="reference internal" href="#id21" id="id58">选择排序</a></li>
+<li><a class="reference internal" href="#merge-sort" id="id59">合并排序 (Merge sort)</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#id21" id="id58">比较排序速度</a></li>
-<li><a class="reference internal" href="#id22" id="id59">排序元组列表</a></li>
-<li><a class="reference internal" href="#lambda" id="id60">巧用 lambda 函数进行灵活排序</a></li>
+<li><a class="reference internal" href="#id22" id="id60">比较排序速度</a></li>
+<li><a class="reference internal" href="#id23" id="id61">排序元组列表</a></li>
+<li><a class="reference internal" href="#lambda" id="id62">巧用 lambda 函数进行灵活排序</a></li>
</ul>
</li>
-<li><a class="reference internal" href="#id23" id="id61">参考</a></li>
+<li><a class="reference internal" href="#id24" id="id63">参考</a></li>
</ul>
</div>
<div class="section" id="id2">
-<h1><a class="toc-backref" href="#id24">前言</a></h1>
+<h1><a class="toc-backref" href="#id25">前言</a></h1>
<p>非学究写书,无空洞行文。</p>
<p>Python语法简洁,库函数全面强大,编程速度快,运行速度也不慢。</p>
<p>大学里, 往往是专家教初学者。 专家也是从初学者过来的,只不过专家经常忘
@@ -449,12 +450,12 @@ ul.auto-toc {
初学者说“我明白了”。</p>
</div>
<div class="section" id="python">
-<h1><a class="toc-backref" href="#id25">Python的发音纠正</a></h1>
+<h1><a class="toc-backref" href="#id26">Python的发音纠正</a></h1>
<p>国人普遍把th发作s。 Not quite correct。</p>
<p>ˈpī-ˌthän , -thən <a class="reference external" href="https://cn.bing.com/search?q=define%20python&amp;tf=U2VydmljZT1EaWN0aW9uYXJ5QW5zd2VyVjIgU2NlbmFyaW89RGVmaW5pdGlvblNjZW5hcmlvIFBvc2l0aW9uPU5PUCBSYW5raW5nRGF0YT1UcnVlIEZvcmNlUGxhY2U9RmFsc2UgUGFpcnM9RGljdGlvbmFyeVdvcmQ6cHl0aG9uO3NjbjpEZWZpbml0aW9uU2NlbmFyaW87cDpRQVM7IHw%3d&amp;hs=hyRBF0mYq9hrfQUq66DIZnFVta1ZGRfBiBks25oUguk%3d">pronounciation</a></p>
</div>
<div class="section" id="id3">
-<h1><a class="toc-backref" href="#id26">Python源流</a></h1>
+<h1><a class="toc-backref" href="#id27">Python源流</a></h1>
<p>Python之父Guido van Rossum,荷兰人,1956年生,1982年阿姆斯特丹大学获得
数学与计算机科学硕士学位。有过ABC语言的工作经验。1989年设计了Python语
言。</p>
@@ -504,7 +505,7 @@ ul.auto-toc {
</blockquote>
</div>
<div class="section" id="id4">
-<h1><a class="toc-backref" href="#id27">Python的关键词</a></h1>
+<h1><a class="toc-backref" href="#id28">Python的关键词</a></h1>
<div class="line-block">
<div class="line">def pass</div>
<div class="line">from import</div>
@@ -526,7 +527,7 @@ ul.auto-toc {
<p>关键词被语言留用(reserved),无法作变量名。</p>
</div>
<div class="section" id="id5">
-<h1><a class="toc-backref" href="#id28">值的类型</a></h1>
+<h1><a class="toc-backref" href="#id29">值的类型</a></h1>
<p>所有的值都是对象。a = 5, help(a) a.bit_length()</p>
<p>数字。1, 1.,1.1, .1, 1e1, 1e-1, 1E1, 1E-1</p>
<dl class="docutils">
@@ -546,7 +547,7 @@ A list of objects</dd>
<p>元组(tuple),字典(dict)。</p>
</div>
<div class="section" id="variable">
-<h1><a class="toc-backref" href="#id29">变量(Variable)</a></h1>
+<h1><a class="toc-backref" href="#id30">变量(Variable)</a></h1>
<p>是一个名字(name),是指向一个值(value)的名字。</p>
<p>值存放在内存(memory)中的某个地址。</p>
<p>尽量选有意义的简短的名字。比如,代表个数用n,代表索引用i,j,k。</p>
@@ -635,7 +636,7 @@ A list of objects</dd>
</ul>
</div>
<div class="section" id="mutable">
-<h1><a class="toc-backref" href="#id30">可变(mutable)类型与不可变类型</a></h1>
+<h1><a class="toc-backref" href="#id31">可变(mutable)类型与不可变类型</a></h1>
<p>字符串是不可变的(immutable)类型,不能在原内存地址改变。</p>
<p>a = 'hello' 不可以原地修改a[0] = 'H'。需要修改a的值时,需要对a进行重新赋值a = 'Hello'。</p>
<p>列表是可变(mutable)类型,能在原内存地址改变。</p>
@@ -660,7 +661,7 @@ A list of objects</dd>
</blockquote>
</div>
<div class="section" id="id6">
-<h1><a class="toc-backref" href="#id31">数与格式化显示</a></h1>
+<h1><a class="toc-backref" href="#id32">数与格式化显示</a></h1>
<blockquote>
<div class="line-block">
<div class="line">x = 3.1415926</div>
@@ -708,7 +709,7 @@ A list of objects</dd>
</blockquote>
</div>
<div class="section" id="strings">
-<h1><a class="toc-backref" href="#id32">字符串(Strings)</a></h1>
+<h1><a class="toc-backref" href="#id33">字符串(Strings)</a></h1>
<p>由字符组成。</p>
<div class="line-block">
<div class="line">fruit = 'banana!'</div>
@@ -764,7 +765,7 @@ A list of objects</dd>
<p>以上 <tt class="docutils literal"># [start,stop,step]</tt> 代表注释(comment),注释以 <tt class="docutils literal">#</tt> 号开头。</p>
</div>
<div class="section" id="concatenation">
-<h1><a class="toc-backref" href="#id33">字符串相加(concatenation)</a></h1>
+<h1><a class="toc-backref" href="#id34">字符串相加(concatenation)</a></h1>
<p>输出Jack, Kack, Lack, Mack, Nack, Ouack, Pack, and Quack</p>
<div class="line-block">
<div class="line">prefixes = 'JKLMNOPQ'</div>
@@ -783,7 +784,7 @@ A list of objects</dd>
</div>
</div>
<div class="section" id="slice">
-<h1><a class="toc-backref" href="#id34">子串(slice)</a></h1>
+<h1><a class="toc-backref" href="#id35">子串(slice)</a></h1>
<p>s[n:m],其中n或m可省略。
包括第n个字符,不包括第m个字符。(索引自0开始)</p>
<div class="line-block">
@@ -807,7 +808,7 @@ A list of objects</dd>
</div>
</div>
<div class="section" id="id7">
-<h1><a class="toc-backref" href="#id35">搜索字符串</a></h1>
+<h1><a class="toc-backref" href="#id36">搜索字符串</a></h1>
<div class="line-block">
<div class="line">def find(word, c):</div>
<div class="line-block">
@@ -833,7 +834,7 @@ A list of objects</dd>
<p>练习:用上面三参数的find来做。</p>
</div>
<div class="section" id="string">
-<h1><a class="toc-backref" href="#id36">String类(对象)方法</a></h1>
+<h1><a class="toc-backref" href="#id37">String类(对象)方法</a></h1>
<div class="line-block">
<div class="line">upper()</div>
<div class="line">lower()</div>
@@ -846,14 +847,14 @@ A list of objects</dd>
</div>
</div>
<div class="section" id="in">
-<h1><a class="toc-backref" href="#id37">in操作符</a></h1>
+<h1><a class="toc-backref" href="#id38">in操作符</a></h1>
<p>'a' in 'banana'
'seed' in 'banana'</p>
<p>练习:写出下面的函数,使得
in_both('apples', 'oranges')返回'aes'。</p>
</div>
<div class="section" id="id8">
-<h1><a class="toc-backref" href="#id38">字符串比较</a></h1>
+<h1><a class="toc-backref" href="#id39">字符串比较</a></h1>
<p>字典序(alphabetical order)。大写字母排在小写字母前。</p>
<p>字符串之间可以有以下对比操作:</p>
<div class="line-block">
@@ -869,7 +870,7 @@ in_both('apples', 'oranges')返回'aes'。</p>
<p>即兴定义函数,制造一个长度不小于4的密码。</p>
</div>
<div class="section" id="id9">
-<h1><a class="toc-backref" href="#id39">列表</a></h1>
+<h1><a class="toc-backref" href="#id40">列表</a></h1>
<p>语言的内置(built-in)类型。注意与String类比,index也是从0开始, in操作符, 求长度,获得字串,遍历操作类似。</p>
<blockquote>
<div class="line-block">
@@ -987,7 +988,7 @@ a与b是指向[1,2,3]的两个references。
error-prone(易错)</p>
</div>
<div class="section" id="id10">
-<h1><a class="toc-backref" href="#id40">列表作为参数</a></h1>
+<h1><a class="toc-backref" href="#id41">列表作为参数</a></h1>
<blockquote>
<div class="line-block">
<div class="line">def delete_head(t):</div>
@@ -1003,7 +1004,7 @@ error-prone(易错)</p>
</blockquote>
</div>
<div class="section" id="append">
-<h1><a class="toc-backref" href="#id41">注意区别 <tt class="docutils literal">append</tt> 与 <tt class="docutils literal">+</tt> 操作符</a></h1>
+<h1><a class="toc-backref" href="#id42">注意区别 <tt class="docutils literal">append</tt> 与 <tt class="docutils literal">+</tt> 操作符</a></h1>
<blockquote>
<div class="line-block">
<div class="line">t1 = [1, 2]</div>
@@ -1030,7 +1031,7 @@ error-prone(易错)</p>
</dl>
</blockquote>
<div class="section" id="tdd-test-driven-development">
-<h2><a class="toc-backref" href="#id42">TDD - Test-driven Development</a></h2>
+<h2><a class="toc-backref" href="#id43">TDD - Test-driven Development</a></h2>
<p>测试驱动开发。 My favourite。 刺激有挑战性。 帮助厘清需求。 帮助编写代码。</p>
<p>推荐使用pytest。如何安装? 使用命令 <tt class="docutils literal">pip install pytest</tt>。</p>
<p>在 <tt class="docutils literal">test_cases.py</tt> 写如下测试用例。然后在命令行运行: <tt class="docutils literal">python <span class="pre">-m</span> pytest test_cases.py</tt> 。</p>
@@ -1070,13 +1071,13 @@ error-prone(易错)</p>
</pre>
</div>
<div class="section" id="id11">
-<h2><a class="toc-backref" href="#id43">计算复杂度</a></h2>
+<h2><a class="toc-backref" href="#id44">计算复杂度</a></h2>
<p>用Big O表述复杂度。O(n), O(n^2), O(n^3)。</p>
<p>密码实验回顾。</p>
</div>
</div>
<div class="section" id="dictionary">
-<h1><a class="toc-backref" href="#id44">字典(Dictionary)</a></h1>
+<h1><a class="toc-backref" href="#id45">字典(Dictionary)</a></h1>
<p>Mutable数据类型。</p>
<p>实际开发中超级有用。</p>
<blockquote>
@@ -1100,7 +1101,7 @@ error-prone(易错)</p>
<p>key-value pair (item)</p>
<p>item的顺序不可预测,不是按照创建时的顺序。</p>
<div class="section" id="incremental-development">
-<h2><a class="toc-backref" href="#id45">递增开发(Incremental Development)</a></h2>
+<h2><a class="toc-backref" href="#id46">递增开发(Incremental Development)</a></h2>
<p>每次完成一小点。从易到难。</p>
<p>练习:给定一个字符串,数出每个字母出现的频率。</p>
<pre class="code python literal-block">
@@ -1208,7 +1209,7 @@ error-prone(易错)</p>
<p>练习: 改写函数 <tt class="docutils literal">word_frequency</tt> , 使它能接受第三个参数, <tt class="docutils literal">black_lst</tt>。 <tt class="docutils literal">black_lst</tt> 是包含要排除考虑的单词的列表。 例如, <tt class="docutils literal">black_lst</tt> 可以是 <tt class="docutils literal">['the', 'and', 'of', 'to']</tt> 。</p>
</div>
<div class="section" id="keyvalue">
-<h2><a class="toc-backref" href="#id46">key与value互换</a></h2>
+<h2><a class="toc-backref" href="#id47">key与value互换</a></h2>
<p>注意到在原来的字典中一个value可能对应多个key的值。比如 <tt class="docutils literal">d = <span class="pre">{'a':1,</span> <span class="pre">'b':2,</span> <span class="pre">'c':2}</span></tt> 中,2就对应两个key,'b'与'c'。</p>
<pre class="code python literal-block">
<span class="keyword">def</span> <span class="name function">inverse_dictionary</span><span class="punctuation">(</span><span class="name">d</span><span class="punctuation">):</span>
@@ -1245,14 +1246,14 @@ error-prone(易错)</p>
</pre>
</div>
<div class="section" id="id12">
-<h2><a class="toc-backref" href="#id47">字典里面可以有字典</a></h2>
+<h2><a class="toc-backref" href="#id48">字典里面可以有字典</a></h2>
<pre class="code python literal-block">
<span class="name">d</span> <span class="operator">=</span> <span class="punctuation">{</span> <span class="literal string single">'john'</span><span class="punctuation">:{</span><span class="literal string single">'dob'</span><span class="punctuation">:</span><span class="literal string single">'1990-10-23'</span><span class="punctuation">,</span> <span class="literal string single">'height'</span><span class="punctuation">:</span><span class="literal string single">'6 feet 5 inches'</span><span class="punctuation">}</span> <span class="punctuation">}</span>
</pre>
</div>
</div>
<div class="section" id="id13">
-<h1><a class="toc-backref" href="#id48">函数</a></h1>
+<h1><a class="toc-backref" href="#id49">函数</a></h1>
<p>当我们开始不断复制黏贴代码时,就要考虑把这部分代码做成函数了。</p>
<p>函数 <tt class="docutils literal">unique_words</tt> 与 <tt class="docutils literal">unique_words2</tt> 哪个运行速度快?</p>
<pre class="code python literal-block">
@@ -1271,11 +1272,11 @@ error-prone(易错)</p>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">unique_words2</span><span class="punctuation">([</span><span class="literal string single">'hello'</span><span class="punctuation">,</span> <span class="literal string single">'world'</span><span class="punctuation">,</span> <span class="literal string single">'am'</span><span class="punctuation">,</span> <span class="literal string single">'he'</span><span class="punctuation">]</span> <span class="operator">*</span> <span class="name">N</span><span class="punctuation">))</span>
</pre>
<div class="section" id="id14">
-<h2><a class="toc-backref" href="#id49">局部变量</a></h2>
+<h2><a class="toc-backref" href="#id50">局部变量</a></h2>
<p>在函数之内。函数执行结束,局部变量消失。</p>
</div>
<div class="section" id="id15">
-<h2><a class="toc-backref" href="#id50">全局变量</a></h2>
+<h2><a class="toc-backref" href="#id51">全局变量</a></h2>
<p>全局变量位于函数之外,模块之内。全局变量对所有模块内的函数可见(可读)。如果在函数内要对全局变量重新赋值,那么要先用 <tt class="docutils literal">global</tt> 声明之 (declare)。</p>
<pre class="code python literal-block">
<span class="name">verbose</span> <span class="operator">=</span> <span class="name builtin pseudo">True</span>
@@ -1325,7 +1326,7 @@ error-prone(易错)</p>
<p>练习: 定义一个函数 <tt class="docutils literal">empty_dict</tt> 清空字典 <tt class="docutils literal">record</tt>。 要求: 不能用 <tt class="docutils literal">return</tt> 语句。 提示: 可以用 <tt class="docutils literal">pop</tt> 方法, 或者直接给 <tt class="docutils literal">record</tt> 赋值 <tt class="docutils literal">{}</tt> 。</p>
</div>
<div class="section" id="id16">
-<h2><a class="toc-backref" href="#id51">调用函数与传递参数</a></h2>
+<h2><a class="toc-backref" href="#id52">调用函数与传递参数</a></h2>
<p>在使用函数前要先确定函数已经被定义。</p>
<p>区别 <tt class="docutils literal">argument</tt> 与 <tt class="docutils literal">parameter</tt> 。传过去的是 <tt class="docutils literal">argument</tt> , 函数头的参数列表是 <tt class="docutils literal">parameter</tt> 。 <tt class="docutils literal">argument</tt> 的值赋给 <tt class="docutils literal">parameter</tt> , <tt class="docutils literal">parameter</tt> 是函数的局部变量。</p>
<p><tt class="docutils literal">argument</tt> 与 <tt class="docutils literal">parameter</tt> 的名字可以相同也可以不同。</p>
@@ -1346,17 +1347,105 @@ error-prone(易错)</p>
<p>以上 t 一个是全局变量一个是局部变量。</p>
</div>
<div class="section" id="flow-of-execution">
-<h2><a class="toc-backref" href="#id52">函数执行顺序 (flow of execution)</a></h2>
+<h2><a class="toc-backref" href="#id53">函数执行顺序 (flow of execution)</a></h2>
<p>函数的定义不执行,被调用时才执行。</p>
<p>顺序执行。 当遇到函数调用时,跳转到函数,执行函数,函数返回后继续执行跳转地后一条语句。</p>
</div>
</div>
<div class="section" id="id17">
-<h1><a class="toc-backref" href="#id53">排序</a></h1>
+<h1><a class="toc-backref" href="#id54">文件</a></h1>
+<p>信息多存储在文件中。所以文件的读写是最最常见的操作。 本节主要考虑纯文本文件。 以下后缀结尾的文件一般都是纯文本文件: txt, csv, html, rst, md。</p>
+<dl class="docutils">
+<dt>实验: 读取纽约新生儿的名字统计文件 <a class="reference external" href="https://data.cityofnewyork.us/api/views/25th-nujf/rows.csv?accessType=DOWNLOAD">PopularBabyNames</a> 。</dt>
+<dd>写命令行程序 lookupname.py 。给定性别与种族,输出最流行的头几个名字。
+命令行例子: <tt class="docutils literal">python lookupname.py girl white top5</tt> 。 这个命令输出最流行的5个白人女孩的名字。
+第一个参数可以是 <tt class="docutils literal">girl/boy</tt> , 第二个参数可以是 <tt class="docutils literal">asian/white/black/hispanic</tt> 。第三个参数以 <tt class="docutils literal">top</tt> 开始,默认是 1。</dd>
+</dl>
+<pre class="code python literal-block">
+<span class="comment single"># Copyright (C) 2019 Hui Lan</span>
+<span class="comment single"># lanhui AT zjnu.edu.cn</span>
+<span class="comment single"># Purpose: 1. Introduce command line argument parsing. 2. Introduce nested dictionaries.</span>
+<span class="comment single"># Usage:</span>
+<span class="comment single"># python lookupname.py asian boy top10</span>
+<span class="comment single"># python lookupname.py white girl top5</span>
+<span class="comment single"># python lookupname.py girl white top</span>
+
+
+<span class="keyword">def</span> <span class="name function">map</span><span class="punctuation">(</span><span class="name">x</span><span class="punctuation">):</span>
+ <span class="name">d</span> <span class="operator">=</span> <span class="punctuation">{</span><span class="literal string single">'FEMALE'</span><span class="punctuation">:</span><span class="literal string single">'girl'</span><span class="punctuation">,</span> <span class="literal string single">'MALE'</span><span class="punctuation">:</span><span class="literal string single">'boy'</span><span class="punctuation">,</span> <span class="literal string single">'ASIAN AND PACIFIC ISLANDER'</span><span class="punctuation">:</span><span class="literal string single">'asian'</span><span class="punctuation">,</span> <span class="literal string single">'ASIAN AND PACI'</span><span class="punctuation">:</span><span class="literal string single">'asian'</span><span class="punctuation">,</span>
+ <span class="literal string single">'BLACK NON HISPANIC'</span><span class="punctuation">:</span><span class="literal string single">'black'</span><span class="punctuation">,</span> <span class="literal string single">'BLACK NON HISP'</span><span class="punctuation">:</span><span class="literal string single">'black'</span><span class="punctuation">,</span> <span class="literal string single">'HISPANIC'</span><span class="punctuation">:</span><span class="literal string single">'hispanic'</span><span class="punctuation">,</span> <span class="literal string single">'WHITE NON HISPANIC'</span><span class="punctuation">:</span><span class="literal string single">'white'</span><span class="punctuation">,</span> <span class="literal string single">'WHITE NON HISP'</span><span class="punctuation">:</span><span class="literal string single">'white'</span><span class="punctuation">}</span>
+ <span class="keyword">return</span> <span class="name">d</span><span class="punctuation">[</span><span class="name">x</span><span class="punctuation">]</span>
+
+
+<span class="keyword">def</span> <span class="name function">file2dict</span><span class="punctuation">(</span><span class="name">fname</span><span class="punctuation">):</span>
+ <span class="name">d</span> <span class="operator">=</span> <span class="punctuation">{}</span> <span class="comment single"># will be a nested dictionary: e.g., d[gender] = {'asian':{'name':count}, 'black':[], 'white':[], 'hispanic':[]}</span>
+ <span class="name">f</span> <span class="operator">=</span> <span class="name builtin">open</span><span class="punctuation">(</span><span class="name">fname</span><span class="punctuation">)</span>
+ <span class="name">lines</span> <span class="operator">=</span> <span class="name">f</span><span class="operator">.</span><span class="name">readlines</span><span class="punctuation">()</span>
+ <span class="keyword">for</span> <span class="name">line</span> <span class="operator word">in</span> <span class="name">lines</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">:]:</span>
+ <span class="name">line</span> <span class="operator">=</span> <span class="name">line</span><span class="operator">.</span><span class="name">strip</span><span class="punctuation">()</span>
+ <span class="name">lst</span> <span class="operator">=</span> <span class="name">line</span><span class="operator">.</span><span class="name">split</span><span class="punctuation">(</span><span class="literal string single">','</span><span class="punctuation">)</span>
+ <span class="name">gender</span> <span class="operator">=</span> <span class="name builtin">map</span><span class="punctuation">(</span><span class="name">lst</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">])</span>
+ <span class="name">ethnicity</span> <span class="operator">=</span> <span class="name builtin">map</span><span class="punctuation">(</span><span class="name">lst</span><span class="punctuation">[</span><span class="literal number integer">2</span><span class="punctuation">])</span>
+ <span class="name">firstname</span> <span class="operator">=</span> <span class="name">lst</span><span class="punctuation">[</span><span class="literal number integer">3</span><span class="punctuation">]</span><span class="operator">.</span><span class="name">title</span><span class="punctuation">()</span>
+ <span class="name">count</span> <span class="operator">=</span> <span class="name builtin">int</span><span class="punctuation">(</span><span class="name">lst</span><span class="punctuation">[</span><span class="literal number integer">4</span><span class="punctuation">])</span>
+ <span class="keyword">if</span> <span class="operator word">not</span> <span class="name">gender</span> <span class="operator word">in</span> <span class="name">d</span><span class="punctuation">:</span>
+ <span class="name">d</span><span class="punctuation">[</span><span class="name">gender</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="punctuation">{</span><span class="name">ethnicity</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="name">firstname</span><span class="punctuation">:</span><span class="name">count</span><span class="punctuation">}}</span>
+ <span class="keyword">else</span><span class="punctuation">:</span>
+ <span class="keyword">if</span> <span class="operator word">not</span> <span class="name">ethnicity</span> <span class="operator word">in</span> <span class="name">d</span><span class="punctuation">[</span><span class="name">gender</span><span class="punctuation">]:</span>
+ <span class="name">d</span><span class="punctuation">[</span><span class="name">gender</span><span class="punctuation">][</span><span class="name">ethnicity</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="punctuation">{</span><span class="name">firstname</span><span class="punctuation">:</span><span class="name">count</span><span class="punctuation">}</span>
+ <span class="keyword">else</span><span class="punctuation">:</span>
+ <span class="keyword">if</span> <span class="operator word">not</span> <span class="name">firstname</span> <span class="operator word">in</span> <span class="name">d</span><span class="punctuation">[</span><span class="name">gender</span><span class="punctuation">][</span><span class="name">ethnicity</span><span class="punctuation">]:</span>
+ <span class="name">d</span><span class="punctuation">[</span><span class="name">gender</span><span class="punctuation">][</span><span class="name">ethnicity</span><span class="punctuation">][</span><span class="name">firstname</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="name">count</span>
+ <span class="keyword">else</span><span class="punctuation">:</span>
+ <span class="name">d</span><span class="punctuation">[</span><span class="name">gender</span><span class="punctuation">][</span><span class="name">ethnicity</span><span class="punctuation">][</span><span class="name">firstname</span><span class="punctuation">]</span> <span class="operator">+=</span> <span class="name">count</span>
+ <span class="name">f</span><span class="operator">.</span><span class="name">close</span><span class="punctuation">()</span>
+ <span class="keyword">return</span> <span class="name">d</span>
+
+
+<span class="keyword">def</span> <span class="name function">get_commandline_parameter</span><span class="punctuation">(</span><span class="name">lst</span><span class="punctuation">):</span>
+ <span class="name">d</span> <span class="operator">=</span> <span class="punctuation">{</span><span class="literal string single">'gender'</span><span class="punctuation">:</span><span class="literal string single">''</span><span class="punctuation">,</span> <span class="literal string single">'ethnicity'</span><span class="punctuation">:</span><span class="literal string single">''</span><span class="punctuation">,</span> <span class="literal string single">'top'</span><span class="punctuation">:</span><span class="literal number integer">1</span><span class="punctuation">}</span>
+ <span class="keyword">for</span> <span class="name">x</span> <span class="operator word">in</span> <span class="name">lst</span><span class="punctuation">:</span>
+ <span class="name">o</span> <span class="operator">=</span> <span class="name">x</span><span class="operator">.</span><span class="name">lower</span><span class="punctuation">()</span>
+ <span class="keyword">if</span> <span class="name">o</span> <span class="operator word">in</span> <span class="punctuation">[</span><span class="literal string single">'asian'</span><span class="punctuation">,</span> <span class="literal string single">'black'</span><span class="punctuation">,</span> <span class="literal string single">'white'</span><span class="punctuation">,</span> <span class="literal string single">'hispanic'</span><span class="punctuation">]:</span>
+ <span class="name">d</span><span class="punctuation">[</span><span class="literal string single">'ethnicity'</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="name">o</span>
+ <span class="keyword">elif</span> <span class="name">o</span> <span class="operator word">in</span> <span class="punctuation">[</span><span class="literal string single">'girl'</span><span class="punctuation">,</span> <span class="literal string single">'boy'</span><span class="punctuation">]:</span>
+ <span class="name">d</span><span class="punctuation">[</span><span class="literal string single">'gender'</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="name">o</span>
+ <span class="keyword">elif</span> <span class="name">o</span> <span class="operator">==</span> <span class="literal string single">'top'</span><span class="punctuation">:</span>
+ <span class="keyword">pass</span> <span class="comment single"># use default value 1</span>
+ <span class="keyword">elif</span> <span class="literal string single">'top'</span> <span class="operator word">in</span> <span class="name">o</span><span class="punctuation">:</span>
+ <span class="name">d</span><span class="punctuation">[</span><span class="literal string single">'top'</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="name builtin">int</span><span class="punctuation">(</span><span class="name">o</span><span class="punctuation">[</span><span class="literal number integer">3</span><span class="punctuation">:])</span>
+ <span class="keyword">else</span><span class="punctuation">:</span>
+ <span class="keyword">raise</span> <span class="name exception">Exception</span><span class="punctuation">(</span><span class="literal string single">'Not recognised option </span><span class="literal string interpol">%s</span><span class="literal string single">'</span> <span class="operator">%</span> <span class="punctuation">(</span><span class="name">x</span><span class="punctuation">))</span>
+ <span class="keyword">return</span> <span class="name">d</span>
+
+
+<span class="keyword">def</span> <span class="name function">sort_by_value</span><span class="punctuation">(</span><span class="name">d</span><span class="punctuation">):</span>
+ <span class="literal string doc">''' Return a sorted list of tuples, each tuple containing a key and a value.
+ Note that the tuples are order in descending order of the value.'''</span>
+ <span class="keyword namespace">import</span> <span class="name namespace">operator</span>
+ <span class="name">lst</span> <span class="operator">=</span> <span class="name builtin">sorted</span><span class="punctuation">(</span><span class="name">d</span><span class="operator">.</span><span class="name">items</span><span class="punctuation">(),</span> <span class="name">key</span><span class="operator">=</span><span class="name">operator</span><span class="operator">.</span><span class="name">itemgetter</span><span class="punctuation">(</span><span class="literal number integer">1</span><span class="punctuation">),</span> <span class="name">reverse</span><span class="operator">=</span><span class="name builtin pseudo">True</span><span class="punctuation">)</span>
+ <span class="keyword">return</span> <span class="name">lst</span>
+
+
+<span class="keyword namespace">import</span> <span class="name namespace">sys</span>
+<span class="keyword">if</span> <span class="name variable magic">__name__</span> <span class="operator">==</span> <span class="literal string single">'__main__'</span><span class="punctuation">:</span>
+ <span class="name">d</span> <span class="operator">=</span> <span class="name">file2dict</span><span class="punctuation">(</span><span class="literal string single">'Popular_Baby_Names.csv'</span><span class="punctuation">)</span>
+ <span class="name">args</span> <span class="operator">=</span> <span class="name">get_commandline_parameter</span><span class="punctuation">(</span><span class="name">sys</span><span class="operator">.</span><span class="name">argv</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">:])</span>
+ <span class="name">gender</span> <span class="operator">=</span> <span class="name">args</span><span class="punctuation">[</span><span class="literal string single">'gender'</span><span class="punctuation">]</span>
+ <span class="name">ethnicity</span> <span class="operator">=</span> <span class="name">args</span><span class="punctuation">[</span><span class="literal string single">'ethnicity'</span><span class="punctuation">]</span>
+ <span class="name">top</span> <span class="operator">=</span> <span class="name">args</span><span class="punctuation">[</span><span class="literal string single">'top'</span><span class="punctuation">]</span>
+ <span class="name">d2</span> <span class="operator">=</span> <span class="name">d</span><span class="punctuation">[</span><span class="name">gender</span><span class="punctuation">][</span><span class="name">ethnicity</span><span class="punctuation">]</span>
+ <span class="name">lst</span> <span class="operator">=</span> <span class="name">sort_by_value</span><span class="punctuation">(</span><span class="name">d2</span><span class="punctuation">)</span>
+ <span class="keyword">for</span> <span class="name">i</span> <span class="operator word">in</span> <span class="name builtin">range</span><span class="punctuation">(</span><span class="name">top</span><span class="punctuation">):</span>
+ <span class="keyword">print</span><span class="punctuation">(</span><span class="name">lst</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">0</span><span class="punctuation">])</span>
+</pre>
+</div>
+<div class="section" id="id18">
+<h1><a class="toc-backref" href="#id55">排序</a></h1>
<p>排序是常见重要的操作。 按照成绩排序。 按照文件名排序。 按照文件大小排序。 按照时间排序。</p>
<p>Python自带的 <tt class="docutils literal">sorted</tt> 可以很好满足排序需求。</p>
-<div class="section" id="id18">
-<h2><a class="toc-backref" href="#id54">排序一组数或一组字符串</a></h2>
+<div class="section" id="id19">
+<h2><a class="toc-backref" href="#id56">排序一组数或一组字符串</a></h2>
<p>如果需要从大到小排序, 添加 <tt class="docutils literal">reverse=True</tt> 。</p>
<pre class="code python literal-block">
<span class="comment single"># Sort numbers</span>
@@ -1381,13 +1470,16 @@ error-prone(易错)</p>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">sa_decr</span><span class="punctuation">)</span>
</pre>
</div>
-<div class="section" id="id19">
-<h2><a class="toc-backref" href="#id55">自定义排序算法</a></h2>
-<p>为了弄清排序的原理, 我们看两种排序算法。</p>
<div class="section" id="id20">
-<h3><a class="toc-backref" href="#id56">选择排序</a></h3>
+<h2><a class="toc-backref" href="#id57">自定义排序算法</a></h2>
+<p>为了弄清排序的原理, 我们看两种排序算法。</p>
+<div class="section" id="id21">
+<h3><a class="toc-backref" href="#id58">选择排序</a></h3>
<p>遍历列表,每次把最小的那个放到最左边位置。</p>
<pre class="code python literal-block">
+<span class="comment single"># Copyright (C) 2019 Hui Lan</span>
+<span class="comment single"># lanhui AT zjnu.edu.cn</span>
+
<span class="keyword">def</span> <span class="name function">swap</span><span class="punctuation">(</span><span class="name">L</span><span class="punctuation">,</span> <span class="name">i</span><span class="punctuation">,</span> <span class="name">j</span><span class="punctuation">):</span>
<span class="name">L</span><span class="punctuation">[</span><span class="name">j</span><span class="punctuation">],</span> <span class="name">L</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]</span> <span class="operator">=</span> <span class="name">L</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">],</span> <span class="name">L</span><span class="punctuation">[</span><span class="name">j</span><span class="punctuation">]</span>
@@ -1418,9 +1510,12 @@ error-prone(易错)</p>
</pre>
</div>
<div class="section" id="merge-sort">
-<h3><a class="toc-backref" href="#id57">合并排序 (Merge sort)</a></h3>
+<h3><a class="toc-backref" href="#id59">合并排序 (Merge sort)</a></h3>
<p>将列表一分为二,对每半部分排序,把排好序的两部分合并之(确保合并后同样是排好序的)。 注意到,以下的实现方式是递归。</p>
<pre class="code python literal-block">
+<span class="comment single"># Copyright (C) 2019 Hui Lan</span>
+<span class="comment single"># lanhui AT zjnu.edu.cn</span>
+
<span class="keyword">def</span> <span class="name function">_merge</span><span class="punctuation">(</span><span class="name">L</span><span class="punctuation">,</span> <span class="name">R</span><span class="punctuation">):</span>
<span class="literal string doc">''' Return a sorted list that combines the sorted list L and sorted list R.'''</span>
<span class="name">nL</span> <span class="operator">=</span> <span class="name builtin">len</span><span class="punctuation">(</span><span class="name">L</span><span class="punctuation">)</span>
@@ -1463,8 +1558,8 @@ error-prone(易错)</p>
</pre>
</div>
</div>
-<div class="section" id="id21">
-<h2><a class="toc-backref" href="#id58">比较排序速度</a></h2>
+<div class="section" id="id22">
+<h2><a class="toc-backref" href="#id60">比较排序速度</a></h2>
<p>排序是 Python 的核心算法,所以是优化了再优化。</p>
<p>Python 自带的排序算法最快, <tt class="docutils literal">selection_sort</tt> 最慢。</p>
<pre class="code python literal-block">
@@ -1490,7 +1585,7 @@ error-prone(易错)</p>
<span class="name">result2</span> <span class="operator">=</span> <span class="name">selection_sort</span><span class="punctuation">(</span><span class="name">L</span><span class="punctuation">)</span>
<span class="keyword">print</span><span class="punctuation">(</span><span class="name">time</span><span class="operator">.</span><span class="name">time</span><span class="punctuation">()</span> <span class="operator">-</span> <span class="name">now</span><span class="punctuation">)</span>
-<span class="keyword">assert</span> <span class="name">result0</span><span class="operator">==</span> <span class="name">result1</span>
+<span class="keyword">assert</span> <span class="name">result0</span> <span class="operator">==</span> <span class="name">result1</span>
<span class="keyword">assert</span> <span class="name">result1</span> <span class="operator">==</span> <span class="name">result2</span>
</pre>
<p>在命令行运行上面的程序,在作者的计算机上得到如下的结果。</p>
@@ -1503,8 +1598,8 @@ error-prone(易错)</p>
<div class="line">11.57</div>
</div>
</div>
-<div class="section" id="id22">
-<h2><a class="toc-backref" href="#id59">排序元组列表</a></h2>
+<div class="section" id="id23">
+<h2><a class="toc-backref" href="#id61">排序元组列表</a></h2>
<p>一个元组由多个元素组成,多个元组组成元组列表, 如何按照某个元素进行排序呢?</p>
<p>可以有以下两种方案。一种用模块 <tt class="docutils literal">operator</tt> , 一种用 <tt class="docutils literal">lambda</tt> 函数。</p>
<pre class="code python literal-block">
@@ -1534,7 +1629,7 @@ error-prone(易错)</p>
</pre>
</div>
<div class="section" id="lambda">
-<h2><a class="toc-backref" href="#id60">巧用 lambda 函数进行灵活排序</a></h2>
+<h2><a class="toc-backref" href="#id62">巧用 lambda 函数进行灵活排序</a></h2>
<p>如何把一个由字符串组成的列表按照字符串的长短进行排序?</p>
<pre class="code python literal-block">
<span class="name">lst</span> <span class="operator">=</span> <span class="punctuation">[</span><span class="literal string single">'this'</span><span class="punctuation">,</span> <span class="literal string single">'is'</span><span class="punctuation">,</span> <span class="literal string single">'a'</span><span class="punctuation">,</span> <span class="literal string single">'example'</span><span class="punctuation">]</span>
@@ -1591,8 +1686,8 @@ What here shall miss, our toil shall strive to mend.'''</span>
</div>
</div>
</div>
-<div class="section" id="id23">
-<h1><a class="toc-backref" href="#id61">参考</a></h1>
+<div class="section" id="id24">
+<h1><a class="toc-backref" href="#id63">参考</a></h1>
<ul class="simple">
<li>Think Python 2e – Green Tea Press. <a class="reference external" href="http://greenteapress.com/thinkpython2/thinkpython2.pdf">http://greenteapress.com/thinkpython2/thinkpython2.pdf</a>.</li>
</ul>
diff --git a/LectureNotesOnPython.rst b/LectureNotesOnPython.rst
index a729f22..216c148 100644
--- a/LectureNotesOnPython.rst
+++ b/LectureNotesOnPython.rst
@@ -1071,6 +1071,104 @@ key与value互换
+文件
+------------------------------------------------
+
+信息多存储在文件中。所以文件的读写是最最常见的操作。 本节主要考虑纯文本文件。 以下后缀结尾的文件一般都是纯文本文件: txt, csv, html, rst, md。
+
+实验: 读取纽约新生儿的名字统计文件 PopularBabyNames_ 。
+ 写命令行程序 lookupname.py 。给定性别与种族,输出最流行的头几个名字。
+ 命令行例子: ``python lookupname.py girl white top5`` 。 这个命令输出最流行的5个白人女孩的名字。
+ 第一个参数可以是 ``girl/boy`` , 第二个参数可以是 ``asian/white/black/hispanic`` 。第三个参数以 ``top`` 开始,默认是 1。
+
+.. _PopularBabyNames: https://data.cityofnewyork.us/api/views/25th-nujf/rows.csv?accessType=DOWNLOAD
+
+.. code:: python
+
+ # Copyright (C) 2019 Hui Lan
+ # lanhui AT zjnu.edu.cn
+ # Purpose: 1. Introduce command line argument parsing. 2. Introduce nested dictionaries.
+ # Usage:
+ # python lookupname.py asian boy top10
+ # python lookupname.py white girl top5
+ # python lookupname.py girl white top
+
+
+ def map(x):
+ d = {'FEMALE':'girl', 'MALE':'boy', 'ASIAN AND PACIFIC ISLANDER':'asian', 'ASIAN AND PACI':'asian',
+ 'BLACK NON HISPANIC':'black', 'BLACK NON HISP':'black', 'HISPANIC':'hispanic', 'WHITE NON HISPANIC':'white', 'WHITE NON HISP':'white'}
+ return d[x]
+
+
+ def file2dict(fname):
+ d = {} # will be a nested dictionary: e.g., d[gender] = {'asian':{'name':count}, 'black':[], 'white':[], 'hispanic':[]}
+ f = open(fname)
+ lines = f.readlines()
+ for line in lines[1:]:
+ line = line.strip()
+ lst = line.split(',')
+ gender = map(lst[1])
+ ethnicity = map(lst[2])
+ firstname = lst[3].title()
+ count = int(lst[4])
+ if not gender in d:
+ d[gender] = {ethnicity: {firstname:count}}
+ else:
+ if not ethnicity in d[gender]:
+ d[gender][ethnicity] = {firstname:count}
+ else:
+ if not firstname in d[gender][ethnicity]:
+ d[gender][ethnicity][firstname] = count
+ else:
+ d[gender][ethnicity][firstname] += count
+ f.close()
+ return d
+
+
+ def get_commandline_parameter(lst):
+ d = {'gender':'', 'ethnicity':'', 'top':1}
+ for x in lst:
+ o = x.lower()
+ if o in ['asian', 'black', 'white', 'hispanic']:
+ d['ethnicity'] = o
+ elif o in ['girl', 'boy']:
+ d['gender'] = o
+ elif o == 'top':
+ pass # use default value 1
+ elif 'top' in o:
+ d['top'] = int(o[3:])
+ else:
+ raise Exception('Not recognised option %s' % (x))
+ return d
+
+
+ def sort_by_value(d):
+ ''' Return a sorted list of tuples, each tuple containing a key and a value.
+ Note that the tuples are order in descending order of the value.'''
+ import operator
+ lst = sorted(d.items(), key=operator.itemgetter(1), reverse=True)
+ return lst
+
+
+ import sys
+ if __name__ == '__main__':
+ d = file2dict('Popular_Baby_Names.csv')
+ args = get_commandline_parameter(sys.argv[1:])
+ gender = args['gender']
+ ethnicity = args['ethnicity']
+ top = args['top']
+ d2 = d[gender][ethnicity]
+ lst = sort_by_value(d2)
+ for i in range(top):
+ print(lst[i][0])
+
+
+
+
+
+
+
+
排序
------------------------------------------------
@@ -1121,6 +1219,9 @@ Python自带的 ``sorted`` 可以很好满足排序需求。
.. code:: python
+ # Copyright (C) 2019 Hui Lan
+ # lanhui AT zjnu.edu.cn
+
def swap(L, i, j):
L[j], L[i] = L[i], L[j]
@@ -1157,6 +1258,9 @@ Python自带的 ``sorted`` 可以很好满足排序需求。
.. code:: python
+ # Copyright (C) 2019 Hui Lan
+ # lanhui AT zjnu.edu.cn
+
def _merge(L, R):
''' Return a sorted list that combines the sorted list L and sorted list R.'''
nL = len(L)
@@ -1231,7 +1335,7 @@ Python 自带的排序算法最快, ``selection_sort`` 最慢。
result2 = selection_sort(L)
print(time.time() - now)
- assert result0== result1
+ assert result0 == result1
assert result1 == result2