【问题标题】:Python: Caesar Cipher, If statement and else statement both True at the same time?Python:Caesar Cipher,If 语句和 else 语句同时为真?
【发布时间】:2011-04-24 18:52:47
【问题描述】:

我几乎已经解决了这个问题,但由于某种原因,第一个 If 语句和 else 语句对于任何大写字母输入都是正确的。因此,如果 ASCII 值介于 65 和 90 之间,则 if 语句声明为 true 并打印出该值,但 else 语句也声明为 true 并打印出一条语句。如果我将“继续”放在第一个 if 语句的底部,则该程序可以完美运行。但是我不知道为什么它会这样工作。你能帮我纠正我的逻辑缺陷吗,我不明白为什么要这样做。这是我的代码和输出:

k = int(raw_input("Please enter a value for k: ")) #Shifter number
original = raw_input("plaintext:  ") #Message user wants ciphered
original_as_array = list(original) ##I am turning the input into an array

for i in range(0,len(original)): ##Now seperating each character to add k
    char = original_as_array[i]
    charint = ord(char)

    if charint >= 65 and charint <=90:
        cipher_int = ((charint-65 + k) % 26)+65
        code_char = chr(cipher_int)
        print code_char,

    if charint >= 97 and charint <=122:
        cipher_int = ((charint-97 + k) % 26)+97
        code_char = chr(cipher_int)
        print code_char,


    else:
        print char,

只有大写的输出示例:

Please enter a value for k: 13
plaintext:  PLEASE HELP
C P Y L R E N A F S R E   U H R E Y L C P

【问题讨论】:

    标签: python if-statement encryption


    【解决方案1】:

    您的第一个 if 语句与 else 语句无关。你想要的

    if charint >= 65 and charint <=90:
            cipher_int = ((charint-65 + k) % 26)+65
            code_char = chr(cipher_int)
            print code_char,
    
    elif charint >= 97 and charint <=122:
        cipher_int = ((charint-97 + k) % 26)+97
        code_char = chr(cipher_int)
        print code_char,
    
    
    else:
        print char,
    

    否则(对于大写字母),第一个条件解析为真,第二个条件解析为假,并且因为语句解析为假,所以执行 else 语句。

    【讨论】:

      【解决方案2】:

      您还应该学习如何让您的代码更符合 Python 风格。

      首先要做的事:Python 列表不是数组,它们是列表。不是一回事。

      您不需要从您的字符串中创建一个列表。 Python 字符串是字符序列并且已经支持订阅:

      >>> 'hello'[4]
      'o'
      

      但是您既不需要列表也不需要订阅来访问字符串中的字符。您可以而且应该像这样进行迭代:

      for char in original:
          ...
      

      另外,Python 中的比较运算符可以而且应该被链接起来:

      if 65 <= charint <= 90:
          ...
      

      有重复发生。不要重复自己:

      def cipher(ch_int, offset, lowest):
          return chr((ch_int - lowest + offset) % 26 + lowest)
      
      for char in original:
          charint = ord(char)
          if 65 <= charint <= 90:
              print cipher(charint, k, 65),
          elif 97 <= charint <= 122:
              print cipher(charint, k, 97),
          else:
              print char,
      

      【讨论】:

      • 很棒的帖子,非常感谢您抽出宝贵的时间来做这件事!谢谢:)
      【解决方案3】:

      你的问题是你需要使用 elif(见http://docs.python.org/tutorial/controlflow.html)。

      如果字母不是小写,则 else: 子句运行。

      顺便说一句,您不需要将“原始”列表。 python 中的字符串的行为与列表几乎相同。


      k = int(raw_input("请为k输入一个值:")) #Shifter号 original = raw_input("plaintext: ") #消息用户想要加密 original_as_array = list(original) ##我正在把输入变成一个数组

      for i in range(0,len(original)): ##现在分隔每个字符以添加k char = original_as_array[i] charint = ord(char)

      if charint >= 65 and charint <=90:
          cipher_int = ((charint-65 + k) % 26)+65
          code_char = chr(cipher_int)
          print code_char,
      
      elif charint >= 97 and charint <=122:
          cipher_int = ((charint-97 + k) % 26)+97
          code_char = chr(cipher_int)
          print code_char,
      
      
      else:
          print char,
      

      【讨论】:

      • 感谢smokey,非常感谢关于输入已经是字符串的提示! :)
      【解决方案4】:

      试试这个:

      #!/usr/bin/python
      
      k = int(raw_input("Please enter a value for k: ")) #Shifter number
      original = raw_input("plaintext:  ") #Message user wants ciphered
      original_as_array = list(original) ##I am turning the input into an array
      
      for i in range(0,len(original)): ##Now seperating each character to add k
          char = original_as_array[i]
          charint = ord(char)
      
          if charint >= 65 and charint <=90:
              cipher_int = ((charint-65 + k) % 26)+65
              code_char = chr(cipher_int)
              print code_char,
              continue
      
          if charint >= 97 and charint <=122:
              cipher_int = ((charint-97 + k) % 26)+97
              code_char = chr(cipher_int)
              print code_char,
              continue
      
          print char,
      

      每个成功案例后,您需要使用continue跳过其他案例。

      附注:

      也可以按如下方式进行:

      >>> import string
      >>> transtab = string.maketrans(string.lowercase + string.uppercase,string.lowercase[k:] + string.lowercase[:k] + string.uppercase[k:] + string.uppercase[:k])
      >>> "PLEASE HELP".translate(t)
      'CYRNFR URYC'
      

      【讨论】:

      • 我真的,真的不赞成 continue 在这种情况下,当 elif 如此清晰时。事实上,我不赞成 continue 在任何可以完全避免的情况下。
      • @JasonFruit:由于所有其他答案都在做elif,只是想记录另一种做同样事情的方法。至于continue,我没有反对意见。
      • 没关系 --- 这没有错,我也没有否决它或其他任何东西,但我确实想表达我对它的可取性的看法。
      【解决方案5】:
      word=raw_input("ENTER YOUR MESSAGE IN CAPITAL LETTERS :")
      
      def cal(a):
          if a=="A":
              c="D"
          elif a=="B":
              c="E"
          elif a=="C":
              c="F"
          elif a=="D":
              c="G"
          elif a=="E":
              c="H"
          elif a=="F":
              c="I"
          elif a=="G":
              c="J"
          elif a=="H":
              c="K"
          elif a=="I":
              c="L"
          elif a=="J":
              c="M"
          elif a=="K":
              c="N"
          elif a=="L":
              c="O"
          elif a=="M":
              c="P"
          elif a=="N":
              c="Q"
          elif a=="O":
              c="R"
          elif a=="P":
              c="S"
          elif a=="Q":
              c="T"
          elif a=="R":
              c="U"
          elif a=="S":
              c="V"
          elif a=="T":
              c="W"
          elif a=="U":
              c="X"
          elif a=="V":
              c="Y"
          elif a=="W":
              c="Z"
          elif a=="X":
              c="A"
          elif a=="Y":
              c="B"
      
          elif a=="Z":
              c="C"
          elif a==" ":
              c=" "
          else:
              c=a
          return c
      
      b=len(word)
      l=""
      a=0
      while a<b:
          l=l+cal(word[a])
          a=a+1
      
      print l
      

      【讨论】:

      • 这是什么鬼
      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 2014-02-15
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多