python-3.x 相同的输入为程序提供不同的输出

kpbpu008  于 2023-02-10  发布在  Python
关注(0)|答案(2)|浏览(140)

新手程序员在这里。我试图写一个程序,它将采取UID从用户和验证他们的基础上一定的规则。规则是:
1.必须包含至少2个大写英文字母字符。
1.它必须包含至少3位数字(0 - 9)。3.它只能包含字母数字字符(A-Z,a-z & 0 - 9)。
1.字符不应重复。
1.有效UID中必须正好有个字符。
我正在放代码。也为这个大代码道歉(我是新手)

# UID Validation
n=int(input()) #for iterations
uid=[]
# char=[]
valid=1
upper=0
numeric=0

# take input first of everycase
for x in range (0,n):
    num=input()
    uid.append(num)
# print (uid)
for i in uid:
    # print (i)
    # to count each word and number
    count={}
    for char in i:
        count[char]=count.get(char,0)+1
    for j in i:
        if j.isupper():
            upper=upper+1
        elif j.isnumeric():
            numeric=numeric+1
    # print('numeric =', numeric)
    # print('upper =', upper)
        
    # Check conditions
    while valid==1: 
        if len(i)!= 10: 
            valid= 0
            # print('invalid for word count')
        elif i.isalnum()== False: #alphanumeric
            valid=0
            # print('invalid for alnum')
        elif upper<2: #minimum alphabet and numbers
            valid=0
            # print('invalid for min alphabet')
        elif numeric<3:
            valid=0
            # print('invalid for min numeric')
        else:
            for k,v in count.items(): #no repitation
                if v>1:
                    valid=0

        # to check if given UID is valid or not
        if valid==1:
            print ('Valid')
        elif valid==0:
            print('Invalid')
        valid=1
        break

我已经写了代码,但似乎我面临的一个输入问题,只有这是检查UID标签:2TB1YVIGNM
这是一个无效的标签。我的程序显示相同的当我单独运行它或第一次在一批许多。但是,让我们说我运行程序和输入2个标签,与"2TB1YVIGNM"是第二个,它将显示为"有效"。请注意,这是只发生在这个特定的标签
还有其他几个标签运行良好,其中一些如下所述:77yS77UXtS d72MJ4参考OA778K96P22TB1YVIGNM "除此标签外" 9JC86fM1L7 3w2F84OSw5 GOeGU49Jdw 8428COZZ9C WOPOX413H2 1h5dS6K3X8 Fq6FN44C6P
输出应为:无效有效无效无效有效无效无效无效无效无效有效无效
我的输出如下:无效有效无效有效有效无效无效无效无效无效有效无效

8zzbczxx

8zzbczxx1#

要解决这个问题,需要将每个uid的uppernumeric设置回0:

for i in uid:
    upper = 0
    numeric = 0
    count={}

附言:对于你的新手,我建议你阅读PEP 8,它会使你的代码更具可读性和美观
P.S.S:不需要手动计算每个字符在字符串中相遇的次数,Python中已经实现了这样的操作,请查看计数器了解更多细节
我同意评论说,对于这种类型的任务,最好使用正则表达式

vdzxcuhz

vdzxcuhz2#

你可以将逻辑片段提取到函数中并调用它们:

#It must contain at least 2 uppercase English alphabet characters.
def has_at_least_two_uppercase(potential_uid):
    return sum([char.upper() == char for char in potential_uid])>= 2

#No character should repeat.
def has_unique_chars(potential_uid):
    return len(set(potential_uid)) == len(potential_uid)

#There must be exactly characters in a valid UID.
def is_proper_length(potential_uid:str, proper_length:int = 10)-> bool:
    return len(potential_uid) == proper_length
   
#It must contain at least 3 digits ( 0-9 ).
def has_three_digits(potential_uid):
    return sum([char.isnumeric() for char in potential_uid])>=3

#It should only contain alphanumeric characters (A -Z ,a -z & 0 -9 )
# Defining a function for this may be an overkill to be honest 
def is_alphanumeric(potential_uid):
    return potential_uid.isalnum()

def is_valid_uid(potential_uid):
    if has_at_least_two_uppercase(potential_uid) is False:
        return False
    if has_unique_chars(potential_uid) is False:
        return False
    if is_proper_length(potential_uid) is False:
        return False
    if has_three_digits(potential_uid) is False:
        return False
    if is_alphanumeric(potential_uid) is False:
        return False
    return True

旁注:

  • 使用is检查True/False
  • 对于布尔条件使用True/False而不是1/0(如valid变量)

[可选/家庭作业]

  • 使用文档字符串代替注解
  • 添加添加类型提示(参见is_proper_length示例)
  • 您可以使用all()并将所有调用传递给它,但是if将在不检查所有条件的情况下从函数短路(这一切取决于问题,如条件的数量,UID的长度,要检查的UID数量等),您可以随意调整检查顺序,例如,如果长度不正确,则无需检查其余部分(但在某种程度上,这是一种预优化,通常不鼓励这样做)
  • 如果需要,进一步参数化你的函数,定义参数来检查上限,数值等等

相关问题