python password rules validation -
i'm practicing python , i'm having trouble understanding why code won't take - function takes string , if it's @ least 10 characters in length, has @ least 1 digit, 1 lowercase, , 1 uppercase letter, should return true. also, there's gotta more succinct way write did these nested conditionals. all!
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
the following should work, , removes unnecessary imports :
def checkio(data): return len(data) >= 10 , any(char.isdigit() char in data) , any(char.islower() char in data) , any(char.isupper() char in data) you can iterate on strings default, , each string has isdigit, islower, etc... methods can use. any() method returns true if of values returned iterable passed true, , something(value) value in iterable syntax creates generator expression, iterates on each character of string , checks whether it's digit/lowercase/uppercase character.
based on this answer.
benchmark time, horrible benchmark code (but seems job) :
from time import time import re data = "ulffunh8ni" # password def benchmark(method): # benchmark method, loops 1000000 times , prints how took start = time() _ in range(1000000): method(data) print(time() - start) def checkio_kasra(data): # kasra's answer return len(data) >= 10 , all([any(i.isdigit() in data),any(i.islower() in data),any(i.isupper() 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) not none) , (capital.search(data) not none) , (lower.search(data) not none) def checkio_andredaniel(data): # answer return len(data) >= 10 , any(char.isdigit() char in data) , any(char.islower() char in data) , any(char.isupper() char in data) def checkio_shashank_bitmask(data): if len(data) < 10: return false lud_bitmask = 0 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 , 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) the results, on low-end tablet running windows 7 , python 3.4.x (ran 2 times sure) :
$ python pass.py 6.333611011505127 # shashank 9.625216960906982 # kasra 11.450419902801514 # andrey sabitov 8.36161494255066 # me however, given semi-incorrect input of 1xyzxyzxyz (length , digits good, uppercase), solutions fail stop :
7.456813097000122 # shashank 9.328815937042236 # kasra 11.169620037078857 # andrey sabitov 6.349210977554321 # me note these benchmarks don't take account eventual edits. suggest run benchmark on own machine using latest answers. feel free update post new results.
Comments
Post a Comment