<p><code>password.isalnum()</code>返回布尔值,因此<code>password.isalnum()==password</code>将始终<em>是<code>False</code>。</p>
<p>只要省略<code>==password</code>部分:</p>
<pre><code>if password.lower()== password or password.upper()==password or password.isalnum():
# ...
</code></pre>
<p>下一步,它可以<strong>从不</strong>同时是所有的上和下,或者所有的上和数,或者所有的下和所有的数,所以第二个条件(中)是不可能的。也许你应该寻找<em>一些</em>大写、小写和数字的存在?</p>
<p>然而,首先要解决的是另一个问题。您正在测试密码是否为字母数字,仅由字符和/或数字组成。如果只想测试数字,请使用<a href="http://docs.python.org/2/library/stdtypes.html#str.isdigit" rel="nofollow">^{<cd5>}</a>。</p>
<p>您可能需要熟悉<a href="http://docs.python.org/2/library/stdtypes.html#string-methods" rel="nofollow">string methods</a>。有一些方便的<code>.islower()</code>和<code>.isupper()</code>方法可供您尝试,例如:</p>
<pre><code>>>> 'abc'.islower()
True
>>> 'abc123'.islower()
True
>>> 'Abc123'.islower()
False
>>> 'ABC'.isupper()
True
>>> 'ABC123'.isupper()
True
>>> 'Abc123'.isupper()
False
</code></pre>
<p>这比使用<code>password.upper() == password</code>更快、更简洁,下面将测试相同的内容:</p>
<pre><code>if password.isupper() or password.islower() or password.isdigit():
# very weak indeed
</code></pre>
<p>下一个需要学习的技巧是在字符串上循环,这样就可以测试单个字符:</p>
<pre><code>>>> [c.isdigit() for c in 'abc123']
[False, False, False, True, True, True]
</code></pre>
<p>如果将其与<code>any()</code>函数结合使用,则可以测试是否有<em>一些</em>字符是数字:</p>
<pre><code>>>> any(c.isdigit() for c in 'abc123')
True
>>> any(c.isdigit() for c in 'abc')
False
</code></pre>
<p>我认为在测试密码强度时,你会发现这些技巧很方便。</p>