<ul>
<li>您的代码接受一些应该拒绝的输入。例如,它接受后跟三个空格的16位数字,而它应该验证空格的位置。你知道吗</li>
<li>它是常规的(虽然不是必需的),并且通常有助于可读性一点,如果你不介绍东西,直到他们需要。例如,在直接完成对<code>S</code>的检查之前,不要创建<code>a</code>。你知道吗</li>
<li><code>try: int(a)</code>代码还接受一些它应该拒绝的内容。例如,如果字符串以<code>-</code>开头,则此检查将通过,但函数稍后在执行<code>int(a[0])</code>时将抛出异常。在这种情况下,它应该返回<code>False</code>,而不是抛出异常。你知道吗</li>
<li><code>if sum(lister) == 0: return False</code>从问题描述来看似乎是错误的,因为没有什么要说<code>0000 0000 0000 0000</code>应该被拒绝。我假设这不是一个真实的信用卡号码,但这与所说的问题无关;-)</li>
</ul>
<p>在评论中回答您的问题,是的,您可以比创建一个列表更简洁地总结。以下内容称为“生成器理解”,您应该在Python参考中查找:</p>
<pre><code>sum(int(d) for d in a)
</code></pre>
<p>最后,当您有一个函数以以下结尾时:</p>
<pre><code>if something:
return False
return True
</code></pre>
<p>考虑一下是否写得更好:</p>
<pre><code>return not something
</code></pre>
<p>答案并非总是说这样会更好,但肯定更简洁。你知道吗</p>
<p>把所有东西放在一起:</p>
<pre><code>def check(s):
if len(s) != 19:
return False
# there's more than one way to check this, a regex is fine, but another way is
expected_spaces = (4, 9, 14)
for idx, ch in enumerate(s):
if (ch == ' ') != (idx in expected_spaces):
return False
try:
checksum = sum(int(d) for d in s if d != ' ')
return checksum % 10 == 0
# or you might prefer a one-liner:
# return sum(int(d) for d in s if d != ' ') % 10 == 0
except ValueError:
return False
</code></pre>
<p>注意,调用<code>int()</code>检查字符是否是数字(如果不是,则抛出异常),但它接受非英语数字,如Unicode <code>U+0660</code>,“阿拉伯-印度数字零”。问题语句没有说明是否允许这样做,但如果不允许,则需要对此代码进行额外检查。另一方面,Matt的正则表达式专门测试ASCII数字。你知道吗</p>