-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathEncodeAsString.html
More file actions
389 lines (265 loc) · 29.8 KB
/
EncodeAsString.html
File metadata and controls
389 lines (265 loc) · 29.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="zh-CN" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-CN" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta content="Topic: String Encoding Exercise, Difficulty: Medium, Category: Practice Problem" name="description" />
<meta content="function, string, casting, practice problem" name="keywords" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>编码为字符串 — Python Like You Mean It</title>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/language_data.js"></script>
<script src="https://www.googletagmanager.com/gtag/js?id=UA-115029372-1"></script>
<script src="../../_static/gtag.js"></script>
<script src="../../_static/translations.js"></script>
<script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"></script>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/x-mathjax-config">MathJax.Hub.Config({"tex2jax": {"inlineMath": [["$", "$"], ["\\(", "\\)"]], "processEscapes": true, "ignoreClass": "document", "processClass": "math|output_area"}})</script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/my_theme.css" type="text/css" />
<link rel="index" title="索引" href="../../genindex.html" />
<link rel="search" title="搜索" href="../../search.html" />
<link rel="next" title="模组3:NumPy基础" href="../../module_3.html" />
<link rel="prev" title="扇出差" href="DifferenceFanout.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> Python Like You Mean It
</a>
<div class="version">
1.4
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">目录:</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../../intro.html">Python Like You Mean It</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../module_1.html">模组1:Python入门</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../module_2.html">模组2:Python基础</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../../module_2_problems.html">模组2:题目</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="MergeMaxDicts.html">合并两个词典</a></li>
<li class="toctree-l2"><a class="reference internal" href="Palindrome.html">回文判断</a></li>
<li class="toctree-l2"><a class="reference internal" href="MarginPercentage.html">错误范围内百分比</a></li>
<li class="toctree-l2"><a class="reference internal" href="DifferenceFanout.html">扇出差</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">编码为字符串</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#解">解</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../module_3.html">模组3:NumPy基础</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../module_3_problems.html">模组3:题目</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../module_4.html">模组4:面向对象编程</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../module_5.html">模组5:琐碎话题</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">Python Like You Mean It</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> »</li>
<li><a href="../../module_2_problems.html">模组2:题目</a> »</li>
<li>编码为字符串</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/Module2_EssentialsOfPython/Problems/EncodeAsString.md.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<style>
/* CSS overrides for sphinx_rtd_theme */
/* 24px margin */
.nbinput.nblast.container,
.nboutput.nblast.container {
margin-bottom: 19px; /* padding has already 5px */
}
/* ... except between code cells! */
.nblast.container + .nbinput.container {
margin-top: -19px;
}
.admonition > p:before {
margin-right: 4px; /* make room for the exclamation icon */
}
/* Fix math alignment, see https://github.com/rtfd/sphinx_rtd_theme/pull/686 */
.math {
text-align: unset;
}
</style>
<div class="section" id="编码为字符串">
<h1>编码为字符串<a class="headerlink" href="#编码为字符串" title="永久链接至标题">¶</a></h1>
<p>有时,我们需要在函数中根据输入类型的不同进行不同的操作。本题将考察你对类型,控制流,词典,和更多概念的掌握。</p>
<blockquote>
<div><p>我们想要将一序列的Python对象编码为一个字符串。以下描述了对每种对象类型的编码规则。每个对象的翻译结果应由 <code class="docutils literal notranslate"><span class="pre">"</span> <span class="pre">|</span> <span class="pre">"</span></code> 隔开,并在最后函数应返回一个长字符串。</p>
</div></blockquote>
<ul class="simple">
<li><p>如果对象是整数,通过拼写它在10进制下每一位数字将其转化为字符串,如下: <code class="docutils literal notranslate"><span class="pre">142</span></code> <span class="math notranslate nohighlight">\(\rightarrow\)</span> <code class="docutils literal notranslate"><span class="pre">one-four-two</span></code>;<code class="docutils literal notranslate"><span class="pre">-12</span></code> <span class="math notranslate nohighlight">\(\rightarrow\)</span> <code class="docutils literal notranslate"><span class="pre">neg-one-two</span></code>。 / 如果对象是浮点数,通过相同的规则转化其整数部分(通过取整得到)并在后面添加字符串<code class="docutils literal notranslate"><span class="pre">"and</span> <span class="pre">float"</span></code>: <code class="docutils literal notranslate"><span class="pre">12.324</span></code> <span class="math notranslate nohighlight">\(\rightarrow\)</span> <code class="docutils literal notranslate"><span class="pre">one-two</span> <span class="pre">and</span> <span class="pre">float</span></code>。</p></li>
<li><p>如果对象是字符串,直接附加不需要额外操作。</p></li>
<li><p>如果对象是任何其它类,附加<code class="docutils literal notranslate"><span class="pre">'<OTHER>'</span></code>。</p></li>
</ul>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># 范例行为</span>
<span class="o">>>></span> <span class="n">s</span> <span class="o">=</span> <span class="n">concat_to_str</span><span class="p">([</span><span class="mi">12</span><span class="p">,</span><span class="o">-</span><span class="mf">14.23</span><span class="p">,</span><span class="s2">"hello"</span><span class="p">,</span> <span class="kc">True</span><span class="p">,</span>
<span class="o">...</span> <span class="s2">"Aha"</span><span class="p">,</span> <span class="mf">10.1</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<span class="o">>>></span> <span class="n">s</span>
<span class="s1">'one-two | neg-one-four and float | hello | <OTHER> | Aha | one-zero and float | <OTHER> | five'</span>
</pre></div>
</div>
<p><strong>提示</strong>:查阅在<a class="reference external" href="https://cn.pythonlikeyoumeanit.com/Module2_EssentialsOfPython/Basic_Objects.html">这里</a>介绍的 <code class="docutils literal notranslate"><span class="pre">isinstance</span></code> 函数来处理不同的数据类型。同时,你可以考虑创建一个辅助函数来将整数编码到我们特殊格式的字符串,因为我们在处理整数和浮点数时都要用到它。在任何情况下,将重复进行的工作抽取为函数都是一个好习惯。你将会需要硬编码(hardcode)每个数字到它英文名字的转化表。</p>
<div class="section" id="解">
<h2>解<a class="headerlink" href="#解" title="永久链接至标题">¶</a></h2>
<p>我们的解总分化为三个简单的函数。<code class="docutils literal notranslate"><span class="pre">int_to_str</span></code> 用来将整数转化成英语单词。<code class="docutils literal notranslate"><span class="pre">item_to_transcript</span></code> 将任何类型的对象转化为根据本题描述的字符串格式。最后,<code class="docutils literal notranslate"><span class="pre">concat_to_str</span></code> 迭代输入列表,调用另外两个辅助函数,将每个对象转化为字符串表达方法,并由 <code class="docutils literal notranslate"><span class="pre">'</span> <span class="pre">|</span> <span class="pre">'</span></code> 链接这些字符串。</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">int_to_str</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> 接受一个整数并将其格式化为字符串:</span>
<span class="sd"> e.g. 142 -> "one-four-two"</span>
<span class="sd"> -12 -> "neg-one-two"</span>
<span class="sd"> """</span>
<span class="n">mapping</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"0"</span><span class="p">:</span> <span class="s2">"zero"</span><span class="p">,</span> <span class="s2">"1"</span><span class="p">:</span> <span class="s2">"one"</span><span class="p">,</span> <span class="s2">"2"</span><span class="p">:</span> <span class="s2">"two"</span><span class="p">,</span> <span class="s2">"3"</span><span class="p">:</span> <span class="s2">"three"</span><span class="p">,</span>
<span class="s2">"4"</span><span class="p">:</span> <span class="s2">"four"</span><span class="p">,</span> <span class="s2">"5"</span><span class="p">:</span> <span class="s2">"five"</span><span class="p">,</span> <span class="s2">"6"</span><span class="p">:</span> <span class="s2">"six"</span><span class="p">,</span> <span class="s2">"7"</span><span class="p">:</span> <span class="s2">"seven"</span><span class="p">,</span>
<span class="s2">"8"</span><span class="p">:</span> <span class="s2">"eight"</span><span class="p">,</span> <span class="s2">"9"</span><span class="p">:</span> <span class="s2">"nine"</span><span class="p">,</span> <span class="s2">"-"</span><span class="p">:</span> <span class="s2">"neg"</span><span class="p">}</span>
<span class="k">return</span> <span class="s2">"-"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">mapping</span><span class="p">[</span><span class="n">digit</span><span class="p">]</span> <span class="k">for</span> <span class="n">digit</span> <span class="ow">in</span> <span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">item_to_transcript</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
<span class="sd">""" Any -> str """</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span> <span class="k">return</span> <span class="s1">'<OTHER>'</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span> <span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span> <span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">item</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" and float"</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span> <span class="k">return</span> <span class="n">item</span>
<span class="k">return</span> <span class="s1">'<OTHER>'</span>
<span class="k">def</span> <span class="nf">concat_to_str</span><span class="p">(</span><span class="n">l</span><span class="p">):</span>
<span class="sd">"""</span>
<span class="sd"> 将一列表的对象转化成字符串表达方式并粘连在一起</span>
<span class="sd"> Parameters</span>
<span class="sd"> ----------</span>
<span class="sd"> l: List[Any]</span>
<span class="sd"> 输入对象的列表</span>
<span class="sd"> Returns</span>
<span class="sd"> -------</span>
<span class="sd"> str</span>
<span class="sd"> Examples</span>
<span class="sd"> --------</span>
<span class="sd"> >>> concat_to_str([1, None, 'hi', 2.0])</span>
<span class="sd"> one | <OTHER> | hi | two and float</span>
<span class="sd"> """</span>
<span class="k">return</span> <span class="s2">" | "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">item_to_transcript</span><span class="p">(</span><span class="n">item</span><span class="p">)</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">l</span><span class="p">)</span>
</pre></div>
</div>
<p>我们在本答案中多次使用 <code class="docutils literal notranslate"><span class="pre">str.join</span></code> 函数和生成器理解。请回忆:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="s2">"<hi>"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">some_iterable_of_strings</span><span class="p">)</span>
</pre></div>
</div>
<p>等值于以下更长的代码:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">out</span> <span class="o">=</span> <span class="s2">""</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">some_iterable_of_strings</span><span class="p">:</span>
<span class="n">out</span> <span class="o">+=</span> <span class="s2">"<hi>"</span> <span class="o">+</span> <span class="n">x</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">int_to_str</span></code> 为了将整数的每位数转化成字符串使用了一个小技巧——它用 <code class="docutils literal notranslate"><span class="pre">str</span></code> 将整数转化为字符串。而字符串是一个<a class="reference external" href="https://cn.pythonlikeyoumeanit.com/Module2_EssentialsOfPython/SequenceTypes.html">序列</a>。这允许我们访问整数的每一位数,甚至迭代它们:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># 将整数转化为字符串让我们可以通过索引/迭代来</span>
<span class="c1"># 访问它的符号和位数</span>
<span class="o">>>></span> <span class="n">x</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="o">-</span><span class="mi">123</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">x</span>
<span class="s1">'-123'</span>
<span class="o">>>></span> <span class="n">x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="s1">'-'</span>
<span class="o">>>></span> <span class="n">x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="s1">'3'</span>
</pre></div>
</div>
<p>因此,<code class="docutils literal notranslate"><span class="pre">"-".join(mapping[digit]</span> <span class="pre">for</span> <span class="pre">digit</span> <span class="pre">in</span> <span class="pre">str(n))</span></code> 将整数转化为字符串,迭代其每一位数,并使用函数中定义的<a class="reference external" href="https://cn.pythonlikeyoumeanit.com/Module2_EssentialsOfPython/DataStructures_II_Dictionaries.html">词典</a>来将其转换成对应的单词。</p>
<p><code class="docutils literal notranslate"><span class="pre">item_to_transcript</span></code> 是一个特别骚操作的函数。首先,它并不使用elif语句,但这:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">item_to_transcript</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
<span class="sd">""" Any -> str """</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span> <span class="k">return</span> <span class="s1">'<OTHER>'</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span> <span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span> <span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">item</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" and float"</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span> <span class="k">return</span> <span class="n">item</span>
<span class="k">return</span> <span class="s1">'<OTHER>'</span>
</pre></div>
</div>
<p>和以下完全等值:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">item_to_transcript_alt</span><span class="p">(</span><span class="n">item</span><span class="p">):</span>
<span class="sd">""" Any -> str """</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'<OTHER>'</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">float</span><span class="p">):</span>
<span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">item</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" and float"</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="n">item</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">'<OTHER>'</span>
</pre></div>
</div>
<p>后者使用了熟悉的<a class="reference external" href="https://cn.pythonlikeyoumeanit.com/Module2_EssentialsOfPython/ConditionalStatements.html">if-elif-else</a>语句,且为一个完全合理可接受的版本。但请注意在 <code class="docutils literal notranslate"><span class="pre">item_to_transcript</span></code> 中的<a class="reference external" href="https://cn.pythonlikeyoumeanit.com/Module2_EssentialsOfPython/Functions.html#Multiple-return-Statements">多个返回语句</a>实现了一样的逻辑。也就是说如果某个条件被满足,它对应的值会被返回,且后面的任何代码都会被跳过。比如说,如果 <code class="docutils literal notranslate"><span class="pre">item</span></code> 是一个整数,那么第二个if条件会运算为真并返回
<code class="docutils literal notranslate"><span class="pre">int_to_str(item)</span></code>,同时,程序立即从函数主体跳出。</p>
<p>在两个函数中选哪个“更好”终归是一个风格上的偏好。你可能注意到了单行的 <code class="docutils literal notranslate"><span class="pre">if-return</span></code> 表达式。这也仅仅是一个风格的选择。这:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span> <span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</pre></div>
</div>
<p>和以下没有区别:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">return</span> <span class="n">int_to_str</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
</pre></div>
</div>
<p>在 <code class="docutils literal notranslate"><span class="pre">item_to_transcript</span></code> 中使用单行的 <code class="docutils literal notranslate"><span class="pre">if-return</span></code> 表达式强调了该函数像词典一般的行为:代码的格式很好地对应了其功能。但就算如此,这样的单行语句也要谨慎使用。有些人可能认为这是一个可爱的小技巧。我也觉得它很可爱。这代码很可爱。我写的代码很可爱。</p>
<p>最后,你可能在代码中注意到一个像是重复的部分:我们的第一个 <code class="docutils literal notranslate"><span class="pre">if</span></code> 语句当 <code class="docutils literal notranslate"><span class="pre">item</span></code> 为 <code class="docutils literal notranslate"><span class="pre">True</span></code> 或 <code class="docutils literal notranslate"><span class="pre">False</span></code>(布尔值)时返回 <code class="docutils literal notranslate"><span class="pre">'<OTHER>'</span></code>,而我们的最后一行代码在以上所有情况都没有满足时(也就是当 <code class="docutils literal notranslate"><span class="pre">item</span></code> 不是 <code class="docutils literal notranslate"><span class="pre">bool</span></code>,<code class="docutils literal notranslate"><span class="pre">int</span></code>,<code class="docutils literal notranslate"><span class="pre">float</span></code>,或 <code class="docutils literal notranslate"><span class="pre">str</span></code> 类型对象时)会返回 <code class="docutils literal notranslate"><span class="pre">'<OTHER>'</span></code>。为什么我们不将最后一行和第一个 <code class="docutils literal notranslate"><span class="pre">if</span></code> 句段合并呢?不这样做的原因是 <code class="docutils literal notranslate"><span class="pre">True</span></code> 和 <code class="docutils literal notranslate"><span class="pre">False</span></code> 不仅仅是布尔类型的实例,它们也是整数!<code class="docutils literal notranslate"><span class="pre">True</span></code> 的行为类似于整数 <code class="docutils literal notranslate"><span class="pre">1</span></code> 而 <code class="docutils literal notranslate"><span class="pre">False</span></code> 像 <code class="docutils literal notranslate"><span class="pre">0</span></code>:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">isinstance</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="kc">True</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span>
<span class="go">True</span>
<span class="gp">>>> </span><span class="mi">3</span><span class="o">*</span><span class="kc">True</span> <span class="o">+</span> <span class="kc">True</span> <span class="o">-</span> <span class="kc">False</span>
<span class="go">4</span>
</pre></div>
</div>
<p>因此,如果我们没有首先检查布尔值,<code class="docutils literal notranslate"><span class="pre">True</span></code> 和 <code class="docutils literal notranslate"><span class="pre">False</span></code> 会被分别转化成 <code class="docutils literal notranslate"><span class="pre">'one'</span></code> 和 <code class="docutils literal notranslate"><span class="pre">'zero'</span></code>,而不是 <code class="docutils literal notranslate"><span class="pre">'<OTHER>'</span></code>。这是一个比较微妙难抓的边界情况。</p>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../../module_3.html" class="btn btn-neutral float-right" title="模组3:NumPy基础" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="DifferenceFanout.html" class="btn btn-neutral float-left" title="扇出差" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
© Copyright 2019, Ryan Soklaski
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>