Python:Caesar Cipher,If语句和else语句同时为True?

时间:2011-04-24 18:52:48

标签: python if-statement encryption

我几乎已经解决了这个问题,但由于某种原因,第一个If语句和else语句都对任何大写字母输入都是正确的。因此,如果ASCII值位于65和90之间,则if语句声明为true并打印出该值,但else语句也声明为true并打印出一个语句。如果我把'continue'放在第一个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

5 个答案:

答案 0 :(得分:7)

您的第一个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,

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

答案 1 :(得分:4)

您还应该学习如何使代码更加pythonic。

首先要做的事情是: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,

答案 2 :(得分:1)

您的问题是您需要使用elif(请参阅http://docs.python.org/tutorial/controlflow.html)。

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

顺便说一句,您不需要将“原始”列表。蟒蛇中的字符串与列表的行为非常相似。


k = int(raw_input(“请为k输入一个值:”))#Shifter number original = raw_input(“plaintext:”)#Message用户想要加密 original_as_array = list(original)##我正在将输入转换为数组

表示范围内的i(0,len(原始)):##现在分隔每个字符以添加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,

答案 3 :(得分:0)

试试这个:

#!/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'

答案 4 :(得分:-4)

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