2013-11-23 14 views
3

我試圖定義一個Python3功能,用於評估輸入是否符合給定的要求;它們是:長度必須在3到20個字符之間(包括),只能是字母和撇號以及「 - 」和空格。評估的要求,返回總是如此

def validateFirstname(firstname): 
    #Local Variable 
    hasFirstname = False 
    Caracterslist = "/'/-" 

    if (len(firstname) >= 3 and len(firstname) <= 20 and 
     firstname.isalpha(), firstname.isspace(), (firstname in Caracterslist)): 
     hasFirstname = True 
    return hasFirstname 

firstname = str(input("Enter your first name: ")) 
if (validateFirstname(firstname)): 
    print("Your first name is: ", firstname) 
else: 
    print("The first name you entered ", firstname, "is not valid!") 

實際上,它比20個caracters返回True即使名字較長,即使它包含的數字...

我不明白爲什麼...

回答

1

你可以把支票存入一個子功能清潔代碼:

def validateFirstname(firstname): 
    def validchar(c): 
     return c.isalpha() or c.isspace() or (c in "'-") 
    total = sum(1 for c in firstname if validchar(c)) 
    return 3 <= total <= 20 and total == len(firstname) 
+0

它幾乎可行!事情是,如果使用任何'或 - ,它總是返回false ...。 – djwelcome

+0

@djwelcome,固定它,我有'firstname'而不是'c'。 – perreal

+0

它工作!只需要將'('in''=「)中的=改成'(c in」' - 「)' – djwelcome

3

在你的表達:

if (len(firstname) >= 3 and len(firstname) <= 20 and 
     firstname.isalpha(), firstname.isspace(), (firstname in Caracterslist)): 

以下部分正在評估爲元組(請注意逗號):

(len(firstname) >= 3 and len(firstname) <= 20 and 
     firstname.isalpha(), firstname.isspace(), (firstname in Caracterslist)) 

這實質上形式是:

(a and b and c, f, g, h) 

,因此被評價爲元組。

這個元組,無論其內容將評估爲True,e.g:

>>> if (False,False,False): 
    print "Was True" 

Was True 

這是因爲元組本身在True/False意義上考慮。

在Python以下值被認爲是假Python Documentation

  1. 任何數值類型的
  2. 零,例如,0,0L,0.0, 0J。

  3. 任何空序列,例如, '',(),[]。

  4. 任何空映射,例如,{}。用戶定義的類的

  5. 情況下,如果類定義了一個 非零()或len個()方法中,當該方法返回整數零或布爾值假。 1

所有其他值都被認爲是真的 - 因此許多類型的對象總是爲真。

由於元組是不(,)中,將考慮True,因此表達式計算爲True。您需要用適當的布爾運算符替換,。這將停止表達被視爲一個元組becase的將是形式(a)


有你的表達邏輯問題,你需要制定出的條件正確鏈的邏輯。但是,您也必須修復元組創建問題(上面)。適當的邏輯可以是:

#if fistname is not all spaces, and is of correct length, and (is either all alphabetical or contains a character in characterlist) 
if not firstname.isspace() and 3 <= len(firstname) <= 20 and (firstname.isalpha() or any(c in firstname for c in Caracterslist)): 
    return firstname 
+0

用'和'替換逗號不是一個正確的修復。 – user2357112

+0

我試過了,現在,它只是返回假的一切... – djwelcome

+0

@ user2357112是他刪除了逗號,他將留下'if(a和b和c和d ...):'這將不會被處理作爲元組。 – HennyH

1
firstname.isalpha(), firstname.isspace(), (firstname in Caracterslist)) 

這一部分是問題。你想要做的是測試firstname中的每個字符是字母,空格,撇號還是連字符。這並不是那樣做的。除非你真的希望這個代碼能夠做到這一點,否則它並不特別相關。它足以說它完全不像你想要的。

下面是一個代碼片段,它實際上檢查每個字母的約束。它遍歷每個字符,檢查它是否是一個字母或幾個允許非字母字符中的一個:

for letter in firstname: 
    if not (firstname.isalpha() or firstname in " '-"): 
     return False 

你也可以使用一套操作來檢查組允許的字符是否是集合的一個超集輸入字符:

import string 

#string.letters is a string containing all ASCII letters 
if not set(string.letters + " '-").issuperset(firstname): 
    return False 
0
from string import ascii_letters 

if ((len(firstname) in range(3, 20)) and all(c in ascii_letters+" '-" for c in firstname): 
    #do things