2015-11-22 42 views
-2
if all(password.islower()) or (password.isalpha()) or (password.isalnum()): 
    print("") 

我試圖使它所以如果statment檢查是否所有的變量「密碼」的是小寫的,但all功能不是爲我工作。使用所有功能與像str.islower)功能(

我的問題是,有一個錯誤信息說

TypeError: 'bool' object is not iterable 

我如何使用all功能和any功能與像.islower其他功能?功能.isalnum.isalpha是否意味着檢查所有變量是數字還是字母?

+1

檢查文檔... HTTPS://docs.python.org/3/library/functions.html#all –

回答

2

對於密碼測試,要檢查是否人物的任何在某一組:

any(c.islower() for c in password) 

這隻會如果有至少1小寫字母是真實的。您可以and結合這些測試(因爲沒有循環不使用all()這裏,沒有點):

any(c.islower() for c in password) and any(c.isdigit() for c in password) 

如果有至少一個小寫字符和密碼一個數字只會是真實的。

但是,將這些測試串在一起變得笨拙,快速。這是很容易創建一個單獨的功能,並且拼出每個密碼測試:

def is_valid(password): 
    if len(password) < 8: 
     return False 
    if not any(c in password for c in '[email protected]%/()=?+.-'): 
     return False 
    if not any(c.isdigit() for c in password): 
     return False 
    if not any(c.islower() for c in password): 
     return False 
    if not any(c.isupper() for c in password): 
     return False 
    return True 

,然後只是推遲到功能,當你需要看,如果你的密碼長度至少爲8個字符,使用小寫和大寫字母,並且至少包含1個數字和1個「特殊」字符,例如:

if is_valid(password): 

採用專用的功能遠更容易維護。

如果您的密碼檢查器仍然需要更靈活,您可以使用單獨的測試並按順序收集它們。只有然後all()功能有幫助,所有測試需要通過:

def password_contains_lowercase(password): 
    return any(c.is_lower() in password) 

def password_contains_uppercase(password): 
    return any(c.is_upper() in password) 

def password_contains_digit(password): 
    return any(c.is_digit() in password) 

def password_min_length(length): 
    def password_length_test(password): 
     return len(password) >= min_length 
    return password_length_test 

# etc. 

policies = { 
    'mixed_case': (
     password_min_length(8), 
     password_contains_lowercase, 
     password_contains_uppercase 
    ), 
    'mixed_case_and_digits': (
     password_min_length(8), 
     password_contains_lowercase, 
     password_contains_uppercase, 
     password_contains_digit 
    ), 
    # ... 
} 


def is_valid_password(policy, password): 
    return all(test(password) for test in policies[policy]) 
+0

謝謝回覆。你能解釋我做了什麼來檢查密碼中的所有字符是小寫嗎?我不明白。 – ASAP

+0

@ASAP:如果*所有*字符都需要小寫,那麼只需使用'password.islower()',不需要循環,不需要'all()'。如果* all *字符是小寫字符,'str.islower()'方法只返回true。我們只是在循環時在字符串中使用它,只有*一個*字符。 –

0

我認爲這個問題是所有期望一個iterable

表格文檔
所有(迭代器) - > bool

Return True if bool(x) is True for all values x in the iterable. 
If the iterable is empty, return True. 

但線

if all(password.islower()) or (password.isalpha()) 
    #  ^--------will result in a `bool`----------^ 
    #  --------and NOT and iterable------------- 

你應該如何使用它:

if all([password.islower(), password.isalpha(), password.isalnum()]): 
    print("") 
+0

在這種情況下,您只需使用'password.islower()和password.isalpha()和password.isalnum()'。但是,如果'isalpha()'爲true,後一個測試總是成立,並且如果字符串的islower()'爲真,則'isalpha()'總是爲真。所以整個測試是毫無意義的,因爲你可以把它歸結爲'password.islower()'。 –

+0

@MartijnPieters同意了,我的重點是向他展示他如何以錯誤的方式使用'all'內建函數,以及'bool'相關錯誤的原因,因爲'all'要求迭代。此外,我會再次提到,使用'和'會導致錯誤,您不會在'all'的參數內使用邏輯運算符,因此您的註釋代碼將不會運行。 'all',顧名思義就是試圖查看所有傳入的表達式是否返回true,沒有''和'或'or'的情況。 –

+1

我沒有說你仍然會使用'all()'。 :-P –