python caesar chr和ord没有换行,只是在字母表中迭代

时间:2017-06-25 14:28:53

标签: python cs50 caesar-cipher

我的凯撒代码存在问题。

1)我不知道如何检查一个字符是否是标点符号并且没有总和打印。

2)在相同的行上打印字符,但在完成后返回换行符。

3)通过大数字的字母迭代给我一个标点符号,我怎么能只返回一个字符?

import sys
import string

def main(): 

    if len(sys.argv) != 2:
        print("Usage: caesar.py k")

    else:


        k = int(sys.argv[1])

        if k == 1 or k <= 26:

            text = input("plaintext: ");
            j = len(text)

            for i in range(j):
                #check if is a character
                if text[i].isalpha:
                    if text[i].islower():
                        print(chr(ord(text[i]) + k),end = "")
                    if text[i].isupper():
                        print(chr(ord(text[i]) + k),end = "")
                elif text[i].punctuation():
                    print(text[i])

        else:
            print("You have to introduce a number between 1 and 26")

main()

1 个答案:

答案 0 :(得分:1)

试试这段代码:

import string


def encrypt_ceasar(s, shift):
    assert abs(shift) < 26, 'shift is between -25 and 25 (inclusive)'
    encrypted_s = ''
    for char in s:
        if char.isalpha():
            is_upper = char.isupper()
            char = char.lower()
            pos_alphabet = ord(char) - ord('a')
            new_pos = (pos_alphabet + shift) % 26
            encryted_char = chr(ord('a') + new_pos)
            if is_upper:
                encryted_char = encryted_char.upper()
            encrypted_s += encryted_char
        else:
            encrypted_s += char
    return encrypted_s


def decrypt_ceasar(s, shift):
    return encrypt_ceasar(s, -shift)


if __name__ == "__main__":
    s = 'AbC1$de#zy'
    encrypted_s = encrypt_ceasar(s, 3)
    print('s:', s)
    print('encrypted_s:', encrypted_s)
    print('again s:', decrypt_ceasar(encrypted_s, 3))

输出:

s: AbC1$de#zy
encrypted_s: DeF1$gh#cb
again s: AbC1$de#zy