Как проверить наличие c букв в строке? - PullRequest
0 голосов
/ 24 февраля 2020

У меня проблема с моей программой шифрования Python 3. Я пишу код, который использует сравнения для проверки определенных букв в userMessage, используя операторы if и циклы for. Проблема, которую я имею, состоит в том, что алфавит выскакивает между каждой буквой зашифрованного вывода. Например, если выходные данные должны быть amxer, это aAmBxCeDr. Кроме того, второй оператор if, который проверяет vwxyz, заставляет vwxyz всплывать между символами, которые зашифрованы от прокручивания vwxyz 5 раз вправо в ASCII. Второе утверждение if состоит в том, чтобы заменить эти символы на буквы abcde.

#Start
#variables
encryptedMessage=""
userMessage = input("your message here: ")
userMessage =userMessage.lower()
shift=5
#function
def step2():
    #for loop
    for character in userMessage:
        #5:50AM February 24th, 2020
        #looking for global variable
        global encryptedMessage
        if character== "a"or"b"or"c"or"d"or"e"or"f"or"g"or"h"or"i"or"j"or"k"or"l"or"m"or"n"or"o"or"p"or"q"or"r"or"s"or"t"or"u":
            eN = ord(character)
            eN+= shift
            encryptedMessage+=chr(eN)  
        #checking for letters that go to random symbols
        if character=="v"or"w"or"x"or"y"or"z":

            if character=="v": character=="a"
            if character=="w": character=="b"
            if character=="x": character=="c"
            if character=="y": character=="d"
            if character=="z": character=="e"
            encryptedMessage+=character

step2()
print(userMessage)
print(encryptedMessage)

Мой код имеет вывод:

your message here: abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
fagbhcidjekflgmhniojpkqlrmsntoupvqwrxsytzu{v|w}x~yz
>>> 

1 Ответ

1 голос
/ 24 февраля 2020

То, что вы используете, является неверным синтаксисом. character == 'a' or 'b' совпадает с (character == 'a') or 'b', which is always True since 'b' не None`.

Если вы хотите использовать несколько равных, вы должны записать их как character == 'a' or character == 'b' or ....

В качестве альтернативы, гораздо лучшее решение (как показано ниже) использует set() и in оператор, который проверяет, находится ли символ внутри набора, и возвращает True, если он его находит.

encryptedMessage=""
userMessage = input("you'r message here: ")
userMessage =userMessage.lower()
shift=5
#function
FIRST= set(["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u"])
SECOND = set(["v","w","x","y","z"])
def step2():
    #for loop
    for character in userMessage:
        #5:50AM February 24th, 2020
        #looking for global variable
        global encryptedMessage
        if character in FIRST:
            eN = ord(character)
            eN+= shift
            encryptedMessage+=chr(eN)  
        #checking for letters that go to random symbols
        if character in SECOND:
            if character=="v": character=="a"
            if character=="w": character=="b"
            if character=="x": character=="c"
            if character=="y": character=="d"
            if character=="z": character=="e"
            encryptedMessage+=character

step2()
print(userMessage)
print(encryptedMessage)

И поскольку я только сейчас понял, что это простой шифр вращения, вот еще один пример того, как реализовать это.

Учитывая, что A равно 0, а Z равно 25, вы можете просто повернуть, используя модульную арифметику c как encrypted_char = (char + shift) % 26. В нашем случае буквы 'a' и 'z' не находятся на числе 1, но мы можем легко решить эту проблему, вычтя, а затем добавив начальное значение

A = ord('a')
def lowercase_rotate_cypher( message, shift):
    accumulator = []
    for character in message:
        c = A + ( ( ord(character) + shift - A ) % 26)
        accumulator.append( chr(c) )
    return ''.join(accumulator)

В вашем случае shift=5 и сообщение передается со входа.

...