【问题标题】:Issue with user input in case statement案例语句中的用户输入问题
【发布时间】:2020-09-03 10:48:46
【问题描述】:

我在运行我的 case switch 代码时遇到问题这是我第一次运行 case switch。每当我在 python 上运行它时,它只允许用户为 1 选择与 2 和 3 相关的问题,它只是打印要求用户输入的消息。我可能缺少一个非常简单的解决方法。

    userchoice=1
while userchoice!=0:
    userchoice = input("Press 1 or 2 or 3 to run solution for 1 or 2 or 3 or press 0 to exit: ")
    
    if int(userchoice)==1:
               
        # Copy your code for question 1 here
            #Question 1 

        def main():
        #String input
            s=input('Enter Random String of numbers and letters: ')
  
    #Calculating string of numbers
            str1=""
            for i in range(0,len(s)):
                str=s[i]
                if(str.isnumeric()==True):
                    str1+=str
            print("String of Numbers is: ", str1)

    #Calculating longest substring in descending order
            str2=""
            str2+=str1[0]
            max_string=str2
            length=1
            max_length=1
            for i in range(1,len(str1)):
                if str1[i]>str1[i-1]:
                    length+=1
                    str2+=str1[i]
                    if length>max_length:
                        max_length=length
                        max_string=str2
                else:
                    length=1
                    str2=str1[i]

            
            print("Longest substring in numberic descending order is", max_string)
    #Calculating the Average of numbers
            avg=0.0
            for i in range(0, len(max_string)):
                avg+=float(max_string[i])
            avg=avg/max_length
            print("Average: ", round(avg,0))

            if __name__=="__main__":
                main()   
    
    elif int(userchoice)==2:
               #Encryption section:

        text=input("Enter a phrase for encryption (lowercase, no spaces):" ) #instructions that will assist the user to meet the input requirements for the code to work
        dis=int(input("Enter distance value: ")) #dis is the number of spaces the user wishes the letter to be moved for encryption (example if dis is 5 and the phrase is "cat", "cat" will become "hfy")
        code=" "
        
        for ch in text: 
            ordvalue=ord(ch)  #the ordvalue is defined as ord(ch), ord takes the string argument of a single unicode character and returns its point value
            ciphervalue=ordvalue+dis #the ciphervalue takes the point value of the characters in the selected phrase and adds the numberic value inputted by the user to each characters point value 
    
        if ciphervalue>ord('z'): #defines rules for if the ciphervalue is grater then the unit value of 'z'
                x=ciphervalue-ord('z') #uses the constant 'x' defining it as the ciphervalue minus the value of 'z'
                ciphervalue=ord('a')+x-1 #if the value is greater then 'z' then the cipher value is the unit value of 'a' plus what is defined to be 'x'
        code=code+chr(ciphervalue) #uses the 'chr' function to convert the interger collected by the ciphervalue and converts it to the character that occupies that value
        print("Encription is: ", code) #Prints the encrypted values

#Decryption 
        decrypt=input("Enter a phrase for decryption (lowercase, no spaces): ") #instructions that will assist the user to meet the input requirements for the code to work
        dis=int(input("Enter distance value: ")) #number of spaces the user wishes to move the letter to decrypt the code (example, encryption: "hfy", distance:5, decryption= cat )
        code=" "

        for ch in decrypt:
            ordvalue=ord(ch) #similar to decryption
        ciphervalue=ordvalue-dis #instead of adding the users numeric input to the unit value this takes the value inputted by the user
    
        if ciphervalue<ord('a'): #rules for if the ciphervalue results in a value less then the unit value of 'a'
            x=ord('a')-ciphervalue #defines 'x' in a similar way to the encryption
            ciphervalue=ord('z')-x+1 
        code=code+chr(ciphervalue)
        print("decryption is:", code)       
        # Copy your code for question 2 here
        
    
    elif int(userchoice)==3:
        
        #Question 3
        count = 0
        total = 0.0

        filename = input("Enter file name: ")
        x = open(filename) 

        for line in x:
            if not line.startswith("X-DSPAM-Confidence:") : 
                continue 
            t=line.find("0")
            number=float(line[t: ])
            count = count+1
            total = total + number
        average = total/count
        print("Average spam confidence: ", average)
        
    elif int(userchoice)==0:
        print("Thanks!")
        break
    
    else:
        print("Wrong Choice, Please try 1,2,3 or press 0 to exit!")

【问题讨论】:

    标签: python switch-statement


    【解决方案1】:

    您正在选项 1 中创建函数 main,但从不调用该函数。

    if __name__ == "__main__"
    

    是你的脚本的入口点,虽然在这种情况下你想要做的是直接调用你的 main 函数。你可以这样尝试:

     if int(userchoice) == 1:
    
        # Copy your code for question 1 here
        # Question 1
    
        def main():
            # String input
            s = input('Enter Random String of numbers and letters: ')
    
            # Calculating string of numbers
            str1 = ""
            for i in range(0, len(s)):
                str = s[i]
                if (str.isnumeric() == True):
                    str1 += str
            print("String of Numbers is: ", str1)
    
            # Calculating longest substring in descending order
            str2 = ""
            str2 += str1[0]
            max_string = str2
            length = 1
            max_length = 1
            for i in range(1, len(str1)):
                if str1[i] > str1[i - 1]:
                    length += 1
                    str2 += str1[i]
                    if length > max_length:
                        max_length = length
                        max_string = str2
                else:
                    length = 1
                    str2 = str1[i]
    
            print("Longest substring in numberic descending order is", max_string)
            # Calculating the Average of numbers
            avg = 0.0
            for i in range(0, len(max_string)):
                avg += float(max_string[i])
            avg = avg / max_length
            print("Average: ", round(avg, 0))
    
        main()
    

    或者您可以直接将代码放在您的 main 函数中的选项 1 块中,如下所示:

        if int(userchoice) == 1:
    
        # Copy your code for question 1 here
        # Question 1
    
        # String input
        s = input('Enter Random String of numbers and letters: ')
    
        # Calculating string of numbers
        str1 = ""
        for i in range(0, len(s)):
            str = s[i]
            if (str.isnumeric() == True):
                str1 += str
        print("String of Numbers is: ", str1)
    
        # Calculating longest substring in descending order
        str2 = ""
        str2 += str1[0]
        max_string = str2
        length = 1
        max_length = 1
        for i in range(1, len(str1)):
            if str1[i] > str1[i - 1]:
                length += 1
                str2 += str1[i]
                if length > max_length:
                    max_length = length
                    max_string = str2
            else:
                length = 1
                str2 = str1[i]
    
        print("Longest substring in numberic descending order is", max_string)
        # Calculating the Average of numbers
        avg = 0.0
        for i in range(0, len(max_string)):
            avg += float(max_string[i])
        avg = avg / max_length
        print("Average: ", round(avg, 0))
    

    【讨论】:

    • Alice Smith 如果这解决了您的问题,请您标记一下吗?
    • 非常感谢,我知道我会错过一些简单的事情:P
    【解决方案2】:

    您可以使用以下函数定义来模拟 switch 语句:

    def switch(v): yield lambda *c: v in c
    

    你可以在 C 风格中使用它:

    for case in switch(int(userchoice)):
    
        if case(1):
           # ... you code for userchoice 1
           break
    
        if case(2):
           # ... you code for userchoice 2
           break
    
        if case(3):
           # ... you code for userchoice 3
           break
    
        if case(0):
           # ... you code for userchoice 0
           break
    else:
        # ... your code for bad userchoice
    

    您也可以使用 if/elif/else 模式而不使用中断:

    for case in switch(int(userchoice)):
    
        if case(1):
           # ... you code for userchoice 1
    
        elif case(2):
           # ... you code for userchoice 2
    
        elif case(3):
           # ... you code for userchoice 3
    
        elif case(0):
           # ... you code for userchoice 0
    
        else:
           # ... your code for bad userchoice
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      相关资源
      最近更新 更多