2013-10-25 80 views
-1

這可以縮短/改進嗎?我試圖在python中創建一個密碼檢查器。可以縮短或改進此代碼嗎?

if可以放在for循環中嗎?如果是這樣,怎麼樣?

pw = input("Enter password to test: ") 

caps = sum(1 for c in pw if c.isupper()) 
lower = sum(1 for c in pw if c.islower()) 
nums = sum(1 for c in pw if c.isnumeric()) 

scr = ['weak', 'medium', 'strong'] 
r = [caps, lower, nums] 


if len(pw) < 6: 
    print("too short") 
elif len(pw) > 12: 
    print("too long") 

if caps >= 1: 
    if lower >= 1: 
     if nums >= 1: 
      print(scr[2]) 
     elif nums < 1: 
      print("your password is " + scr[1]) 
    elif lower < 1: 
     print("your password strength is " + scr[0]) 
elif caps < 1: 
    print("your password strength is " + scr[1]) 

感謝您的任何建議:d

+3

codereview.stackexchange.com是應該在哪裏。這兩個問題的答案我確定是的,它可以縮短和改善 –

+0

'scr [1]'絕對不比''medium'更簡單或更有意義。 (如果你想讓你的字符串本地化......有更好的方法來做到這一點。) – abarnert

+4

這個問題似乎是脫離主題,因爲它是關於審查工作代碼。請嘗試[代碼評論](http://codereview.stackexchange.com)。 – abarnert

回答

1

我會修復嵌套的if語句。

scr = ['weak', 'medium', 'strong'] # if you want to keep this fine 
# but I suggest you do something like this: 
_WEAK = scr[0] 
_MEDIUM = scr[1] 
_STRONG = scr[2] 
if caps >= 1 and lower >= 1 and nums >= 1: 
    print(_STRONG) 
elif caps < 1: 
    print("your password strength is " + _MEDIUM) 
elif lower < 1: 
    print("your password strength is " + _WEAK) 
elif nums < 1: 
    print("your password is " + _MEDIUM) 
+0

但這是一個不同的邏輯。並不是說OP的邏輯有意義,但這也不是。 –

2
caps = sum(1 for c in pw if c.isupper()) 

可以是:

caps = sum(c.isupper() for c in pw) 

if caps >= 1: 

可以是:

if caps: 

顯著改進:底部if/elif塊可以完全被做

i_strength = sum(map(bool,[caps,lower,nums])) - 1 #or sum(map(bool,r)) - 1 
print('your password is {}'.format(scr[i_strength])) 

說明刪除:map(bool,[caps,lower,nums])累積了多少次每個caps,lower,nums是非零的。將它們與sum相加可以爲您提供「強度」,您可以方便地將它放入列表中,可以通過索引訪問它。

所有這些改進都利用了python中的「虛假」概念,或者稱爲布爾上下文中的對象值。通常空和零的東西是False,並且求和布爾等於加1和零,所以你去。


當然,它似乎並不認爲你是什麼比檢查,如果他們是非零其他上/下/ NUMS的計數。因此,清理也只是

caps = any(c.isupper() for c in pw) 
... 

然後

i_strength = sum([caps,lower,nums]) -1 
+0

...就像這樣,密碼強度檢查更有意義。做得好! –

0

我會忽略的一般問題,「可以將此代碼被縮短或改進的」,因爲這是爲Code Review的問題。但你也有一個具體的問題在那裏:

可以將if放入for循環嗎?如果是這樣,怎麼樣?

他們可以,但你不得不把它們變成可以放在迭代器裏面的東西,比如函數,而且我真的不認爲你想在這種情況下。

讓我們從一個簡單的例子開始,只用線性一系列檢查:

checks = [ 
    ((lambda caps, lower, num: caps >= 1 and lower >= 1 and nums >= 1), 2), 
    ((lambda caps, lower, num: caps < 1), 1), 
    ((lambda caps, lower, num: lower < 1), 0), 
    ((lambda caps, lower, num: num < 1), 1) 
] 
for check, value in checks: 
    if check(caps, lower, num): 
     print('your password strength is ' + scr[value]) 
     break 

您可以改爲把檢查情況在一些編碼數據的形式,並與數據驅動檢查,更換if check(…)條件。例如:

checks = [ 
    ((1, 1, 1), 2), 
    ((-1, 0, 0), 1), 
    ((0, -1, 0), 0), 
    ((0, 0, -1), 1) 
] 
for check, value in checks: 
    for value, condition in zip((caps, lower, num), check): 
     if condition == -1 and value >= 1 or condition == 1 and value < 1: 
      break 
    else: 
     print('your password strength is ' + scr[value]) 
     break 

但我認爲這樣更不可讀。有很多用例可以說明這種事情是有意義的 - 例如,想象你想爲x的每個值評估40個多項式;您可以將每個多項式存儲爲係數列表,並具有這樣的通用「評估多項式」邏輯。但這不是其中之一。

無論哪種方式,這已經很醜陋。如果你想嵌套檢查,你將需要一個嵌套結構,你可能想要遞歸處理。