<blockquote>
<p>What exactly is happening with <code>str+letters,str+changes</code> and why it had to be done?</p>
</blockquote>
<p>因为输入字符串<code>"fun times!"</code>不仅仅包含字母表中的字母;它还包含一个空格<code>' '</code>和一个感叹号<code>'!'</code>。如果这些不是字典<code>mapping</code>中的键,那么<code>mapping[c]</code>将在<code>c</code>是这些字符之一时引发<code>KeyError</code></p>
<p>因此<code>zip(str + letters, str + changes)</code>的目的是确保字符串中的每个字符都映射到字典中的自身,然后再将实际需要的转换添加到字典中。请注意,因为它是以<code>str + ...</code>开头的,所以<code>str</code>中的字母表中的任何字母都将首先映射到它们自己,然后<code>letters</code>到<code>changes</code>的映射将覆盖<em>,然后</em></p>
<p>也就是说,使用<code>mapping.get</code>而不是<code>mapping[...]</code>会更简单,因为<code>get</code>方法允许在密钥不存在的情况下返回默认值。在这种情况下,我们不必确保输入字符串中的每个字符都作为键存在于字典中</p>
<pre class="lang-py prettyprint-override"><code>def letter_changes(string):
letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW"
changes = "bcdEfghIjklmnOpqrstUvwxyzABCDEFGHIJKLMNOPQRSTUVWZ"
mapping = { k: v for (k, v) in zip(letters, changes) }
return "".join(mapping.get(c, c) for c in string)
</code></pre>
<p>这里<code>mapping.get(c, c)</code>的意思是,<em>“获取与键<code>c</code>相关联的映射,或者如果<code>c</code>不是字典中的键,只需使用<code>c</code>本身”</em>。这意味着字典中没有的<code>' '</code>或<code>'!'</code>等符号将保持不变</p>