我正在练习一些 Python,但我无法理解为什么这段代码不能接受 - 函数接受一个字符串,如果它的长度至少为 10 个字符,至少有 1 个数字、1 个小写字母和 1 个大写字母信,它应该返回真。此外,必须有一种比我对所有这些嵌套条件语句所做的更简洁的方式来编写它。谢谢大家!
import string
alphalower = string.ascii_lowercase
alphaupper = string.ascii_uppercase
digs = string.digits
def checkio(data):
if len(data) >= 10:
if data.count(digs) >= 1:
if data.count(alphaupper) >= 1:
if data.count(alphalower) >= 1:
return True
else:
return False
最佳答案
以下应该有效,并删除不必要的导入:
def checkio(data):
return len(data) >= 10 and any(char.isdigit() for char in data) and any(char.islower() for char in data) and any(char.isupper() for char in data)
默认情况下,您可以遍历字符串,并且每个字符串都有 isdigit、islower 等...您可以使用的方法。 any()
方法在传递给它的 iterable 返回的任何值为真时返回 True,并且 something(value) for value in iterable
语法创建一个生成器表达式,它遍历字符串的每个字符并检查它是否是数字/小写/大写字符。
基于 this answer 。
基准测试时间,使用我可怕的基准测试代码(但它似乎可以完成工作):
from time import time
import re
data = "ULFFunH8ni" # the password
def benchmark(method): # benchmark method, loops 1000000 times and prints how much it took
start = time()
for _ in range(1000000): method(data)
print(time() - start)
def checkio_kasra(data): # Kasra's answer
return len(data) >= 10 and all([any(i.isdigit() for i in data),any(i.islower() for i in data),any(i.isupper() for i in data)])
def checkio_andreysabitov(data): # Andrey Sabitov's regex-based answer
if len(data) < 10:
return False
digital = re.compile('[0-9]+')
capital = re.compile('[A-Z]+')
lower = re.compile('[a-z]+')
return (digital.search(data) is not None) and (capital.search(data) is not None) and (lower.search(data) is not None)
def checkio_andredaniel(data): # My answer
return len(data) >= 10 and any(char.isdigit() for char in data) and any(char.islower() for char in data) and any(char.isupper() for char in data)
def checkio_shashank_bitmask(data):
if len(data) < 10: return False
lud_bitmask = 0
for ch in data:
if ch.islower():
lud_bitmask |= 4
if lud_bitmask == 7: return True
elif ch.isupper():
lud_bitmask |= 2
if lud_bitmask == 7: return True
elif ch.isdigit():
lud_bitmask |= 1
if lud_bitmask == 7: return True
return False
def checkio_shashank_pure_regex(data):
return bool(re.match(r'(?=.*?[0-9])(?=.*?[A-Z])(?=.*?[a-z]).{10}', data))
def checkio_shashank_impure_regex(data):
return len(data) >= 10 and re.match(r'(?=.*?[0-9])(?=.*?[A-Z])(?=.*?[a-z])', data)
benchmark(checkio_kasra)
benchmark(checkio_andreysabitov)
benchmark(checkio_andredaniel)
benchmark(checkio_shashank_bitmask)
benchmark(checkio_shashank_pure_regex)
benchmark(checkio_shashank_impure_regex)
结果,在我运行 Windows 7 和 Python 3.4.x 的低端平板电脑上(运行两次以确保):
$ python pass.py
6.333611011505127 # Shashank
9.625216960906982 # Kasra
11.450419902801514 # Andrey Sabitov
8.36161494255066 # Me
但是,给定 1XYZXYZXYZ
的半错误输入(长度和数字都很好,但都是大写),一些解决方案无法提前停止:
7.456813097000122 # Shashank
9.328815937042236 # Kasra
11.169620037078857 # Andrey Sabitov
6.349210977554321 # Me
请注意,这些基准测试并未考虑最终的修改。我建议您使用最新的答案在您自己的机器上运行基准测试。随时用新结果更新这篇文章。
关于python密码规则验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856568/