Python没有迭代字符串中的所有字符(返回'None'?)

时间:2016-11-30 05:36:25

标签: python list loops passwords

我正在尝试创建一个程序,可以迭代密码中的字符以确定它是否符合规范。 它至少需要七个字符,一个大写字符,一个小写字符和一个数字。这就是我所拥有的:

def validPass(password): # >= 7 chars, one upper, one lower, one digit
for ch in password:
    if ch.isdigit():
        if ch.isupper():
            if ch.islower():
                if len(password) >= 7:
                    print ' Your password is valid.'
                else:
                    print 'Your password is not the correct length.'
    else:
        if ch.isupper():
            if ch.islower():
                if len(password) >= 7:
                    print ' Your password is valid.'
                    break
                else:
                    print 'Your password is not the correct length.'
            else:
                print 'Your password is not the correct length.'
        else:
            if ch.islower():
                if len(password) >= 7:
                    print ' Your password is valid.'
                    break
                else:
                    print 'Your password is not the correct length.'
            else:
                if len(password) >= 7:
                    print ' Your password is valid.'
                    break
                else:
                    print 'Your password is not the correct length.'
print validPass('$$$$$$$')

我知道我在这里咆哮着错误的树。此外,当我提交'$$$$$$$'时,我得到:

Your password is valid.
None

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

你的函数没有return语句,你试图打印函数的返回值,然后是None。

顺便说一下,你函数定义下的块应该缩进。

查看与示例的不同之处。

In [7]: def foo():
    return 'Hai'
   ...: 
In [8]: print foo()
Hai
In [9]: def foo():
    print 'Hai'
   ...:     
In [10]: print foo()
Hai
None

答案 1 :(得分:0)

正如@Dim所说,你的函数没有返回任何东西,所以不需要在函数上调用print

嵌套if语句的方法的问题是你必须重新检查每对if / else块中的其他要求,这会增加很多冗余。

这是另一种方法:

保留密码要求的跟踪器变量,初始化为False。迭代password中的字符,如果满足要求,则将跟踪器变量设置为True

示例:

def validPass(password):
    # tracker variables for the password requirements
    upper, lower, digit, length = False, False, False, False
    if len(password) >= 7:
        length = True
    for ch in password:
        if not lower and ch.islower():
            lower = True
        if not upper and ch.isupper():
            upper = True
        if not digit and ch.isdigit():
            digit = True
    # add print statements based on tracker variables if necessary
    # return True/False indicating password validity
    return all([upper, lower, digit, length])

答案 2 :(得分:0)

>>> pwd = '1frSpuh`

制作一些变量以存储计数

>>> n_upper = 0
>>> n_lower = 0
>>> n_digit = 0
>>> 

迭代字符串并测试每个字符,计算您感兴趣的字符

>>> for c in pwd:
    if c.isdigit():
        n_digit = n_digit + 1
    if c.islower():
        n_lower = n_lower + 1
    if c.isupper():
        n_upper = n_upper + 1

应用标准

>>> if n_upper >= 1 and n_lower >= 1 and n_digit >= 1 and len(pwd) >=7:
    print('valid')
else:
    print('NOT!!!')

具有互斥条件的嵌套条件

if ch.isdigit():
    if ch.isupper():
        if ch.islower():

永远不会工作 - 一个角色不能全部三个。

函数需要一个return语句来返回一些东西。