如何区分用户输入的空白​​字符串和我创建的空字符串?

时间:2012-02-07 18:43:51

标签: python recursion python-3.x

任务是让用户输入密码,然后使用递归确保其中没有元音。如果是,则让用户重新输入密码。这就是我到目前为止所做的:

def passwordCheck(pwd):
    """checks if pwd has any vowels in it."""#doc string
    vowels = 'aeiou'#specifies the characters that aren't allowed
    if pwd == '':
        return 0
    elif pwd == None:
        return None#Shouldn't be necessary but just in case
    elif pwd[0] not in vowels:#checks that the 1st(0th) character is not a vowel
        return passwordCheck(pwd[1:])#gets rid of the 1st(0th) character and starts again
    elif pwd[0] in vowels:#checks if the 1st(0th) character is a vowel
        return 1#if it is, stops the function calls and returns a value

password = str(input('Please enter a password with no vowels in it: '))#asks user to input their new password
x = passwordCheck(password)#checks the password is valid, i.e. no vowels

while x == 1:#when the password entered contains a vowel
    print('\nSorry, that is not a valid password.\nYour password cannot contain any vowels.')#tells the user why their password is invalid
    password = str(input('\nPlease enter a different password: '))#gives the user a chance to re-enter their password
    x = passwordCheck(password)#checks to make sure the new password is valid

print('\nCongratulations, you have entered a valid password!')#tells the user if their desired password is valid
print('\nYou are now able to log on to the system with these credentials.')#could've been included on the previous line but looks neater here

我知道这可能不是最狡猾的方式,但在大多数情况下它适用于我。我希望听到更好的方式,但理想情况下,有人可以提供相同的风格。我不想在不理解它的情况下复制某些代码。

我的问题是处理用户根本没有输入密码的情况。第一个if语句:

if pwd == '':
    return 0

我认为它刚刚处理了字符串完全递归后的情况,即没有元音,但经过几分钟检查后,显然这也适用于没有密码。 我也尝试过使用:

if pwd == None:
    return something

现在我认为问题可能是因为我说:

password = str(input('######'))

但是我也在摆弄它,但仍然无法做到这一点!我试过google并搜索stackoverflow但没有运气,所以如果有人有任何想法/解决方案他们认为可能会有所帮助我会非常感谢听到他们。非常感谢你。

我的主要问题是:

如何区分一个空的字符串,因为它已经被递归而用户没有输入任何内容?

解决。

最终使用

def passwordValid(pwd):
if len(pwd)>0 and passwordCheck(pwd)==0:
    return pwd
else: return 'Fail'

password = str(input('Please enter a password with no vowels in it: '))#asks user to input their new password
y = passwordValid(password)#checks the password is valid, i.e. no vowels

while y == 'Fail':#when the password entered contains a vowel
    print('\nSorry, that is not a valid password.\nYour password cannot contain any vowels or be empty.')#tells the user why their password is invalid
    password = str(input('\nPlease enter a different password: '))#gives the user a chance to re-enter their password
    y = passwordValid(password)#checks to make sure the new password is valid


print('\nCongratulations, you have entered a valid password!')#tells the user if their desired password is valid
print('\nYou are now able to log on to the system with these credentials.')#could've been included on the previous line but looks neater here

谢谢Wayne Werner修复标题和主要问题。

5 个答案:

答案 0 :(得分:1)

这个问题可以分解为(至少)三个不同的子问题:

  • 检查字符串是否包含元音
  • 检查字符串是否为有效密码(长度> X 有元音)
  • 从用户那里获取密码

您的代码应该反映这种结构。因此,您可以使用以下功能布局:

def has_vowels(string):
  if not string:  # check for empty string
    return False  # empty strings never have vowels
  # TODO we have a non-empty string at this point and can use recursion

def is_valid_password(string):
  return len(string) > 0 and not has_vowels(string)

def request_password():
  while True:   # use an endless loop here, we don't won't to repeat
                # the "input" statement. We could also change this to
                # something like `for i in range(3)` to allow only a limited
                # number of tries.
    passwd = input('Please enter a password with no vowels in it: ')
    # TODO check if input is valid, if yes, return, if no, print an error

答案 1 :(得分:0)

不要尝试用单一方法解决这两个问题。你有两个ditinct critera:没有元音;最小长度。

def isPasswordValid(pwd):
    return len(pwd) > 4 and not passwordCheck(password)

x = isPasswordValid(password)

...

可以通过添加另一个参数来解决这个问题,这个参数表明循环了多少个字符,但这很笨拙并且没有任何实际好处。

答案 2 :(得分:0)

您无法区分空字符串和空字符串。但是,您可以将变量设置为None,或者设置为“__no_string_entered_yet”之类的字符串。那就是说,我不明白为什么你需要,看看其他答案。

答案 3 :(得分:0)

我相信这会解决您的问题:

  • 不允许空密码(不同于“空白”密码?)
  • 密码中不允许元音

我选择不使用if/elif/else支持构造它,以便有效字符“落空”

def pwd_check(s):
    vowels = 'aeiou'
    if len(s) == 0: return False     # This is only valid in the first iteration
    if s[0] in vowels: return False
    if len(s) == 1: return True      # Success: a 1 character pwd with no vowels
    return pwd_check(s[1:])

我考虑过检查以确保没有传递像' '这样的字符串,但我没有看到明确要求的。 pwd_check(password.strip())解决了这个问题。

答案 4 :(得分:0)

这就是我喜欢做的事 为了好玩,我添加了密码的最小和最大长度条件:

def passwordCheck(pwd,vowels = 'aeiou',minimum=5,maximum=12):
    if pwd == '':
        return 0,None,None
    elif pwd[0] in vowels:
        return -1,None,None
    else:
        y = passwordCheck(pwd[1:])[0]
        if y==-1:
            return -1,None,None
        else:
            return y + 1,minimum,maximum



mess = 'Please enter a password with no vowels in it: '
while True:
    x,miin,maax = passwordCheckstr(input(mess))

    if x==-1:
        mess = ('\nSorry, that is not a valid password.\n'
                'Your password cannot contain any vowels.\n'
                'Please enter a different password: ')

    elif x==0:
        mess = ('\nSorry, you must enter a password.\n'
                'Please do enter a password: ')

    elif x<miin:
        mess = ('\nSorry, the password must have at least %d characters.\n'
                'The string you entered has %d characters.\n'
                'Please, enter a new longer password: ' % (miin,x))

    elif x>maax:
        mess = ('\nSorry, the password must have at most %d characters.\n'
                'The string you entered has %d characters.\n'
                'Please, enter a new shorter password: ' % (maax,x))

    else:
        print ('\nCongratulations, you have entered a valid password!\n'
               '\nYou are now able to log on to the system with these '
                 'credentials.') 
        break

修改

另一种算法。
我不满意将这样的元组返回-1,None,None

def check_password(forbidden,minimum,maximum):

    def passwordCheck(pwd,cnt=0,forbid = forbidden,
                      miin=minimum,maax = maximum):
        # cnt is the number of preceding turns of recursion
        # that have been already executed.
        if pwd == '':
            if cnt==0:
                # cnt==0 means that it's the first turn of recursion
                # since pwd is '', it means no entry has been done
                return 0
            elif cnt<miin:
                return -3
            elif cnt>maax:
                return -2
        elif pwd[0] in forbid:
            return -1
        else:
            if cnt in (-3,-2,-1):
                return cnt
            else:
                return passwordCheck( pwd[1:] , cnt+1 )


    mess = 'Please enter a password with no vowels in it: '
    while True:
        x = str(raw_input(mess)).strip()
        y = passwordCheck(x)

        if y==0:    # inexistent string
            mess = ('\nSorry, you must enter a password.\n'
                    'Please do enter a password: ')

        elif y==-1: # string contains a vowel
            mess = ('\nSorry, that is not a valid password.\n'
                    'Your password cannot contain any vowels.\n'
                    'Please enter a different password: ')

        elif y==-2: # string too long
            mess = ('\nSorry, the password must have at most %d characters.\n'
                    'The string you entered has %d characters.\n'
                    'Please, enter a new shorter password: ' % (maximum,len(x)))

        elif y==-3: # string too short
            mess = ('\nSorry, the password must have at least %d characters.\n'
                    'The string you entered has %d characters.\n'
                    'Please, enter a new longer password: ' % (minimum,len(x)))

        else:       # success
            print ('\nCongratulations, you have entered a valid password!\n'
                   'You are now able to log on to the system with these credentials.')
            break

# EXECUTION
check_password('aeiou',5,12)