【问题标题】:How to check for specific letters in string?如何检查字符串中的特定字母?
【发布时间】:2020-02-24 13:00:05
【问题描述】:

我的 Python 3 加密程序有问题。我正在编写代码,使用比较来检查userMessage 中的某些字母,使用if 语句和for 循环。我遇到的问题是字母表会在加密输出的每个字母之间弹出。例如,如果输出应该是amxer,那么它就是aAmBxCeDr。此外,检查vwxyz 的第二个if 语句使vwxyz 在从vwxyz 以ASCII 码向右滚动5 次加密的符号之间弹出。第二个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
>>> 

【问题讨论】:

  • 您无法进行比较。 character == 'a' or 'b'(character == 'a') or 'b' 相同,自 b is not None 以来始终为 True。

标签: python python-3.x for-loop encryption python-idle


【解决方案1】:

您使用的是无效语法。 character == 'a' or 'b'(character == 'a') or 'b', which is alwaysTruesince'b' is not 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,您可以像 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 和消息是从输入传递的。

【讨论】:

  • 我建议另外两个改进:1) 不要使用全局变量 - 将输入字符串作为参数传递给函数并返回函数的结果; 2)利用ord("v") - ord("a")是21这一事实。
  • 现在才意识到这只是一个简单的移位加密。我添加了小写的 rot 函数示例。
猜你喜欢
  • 2022-12-18
  • 2013-10-19
  • 2011-07-08
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
相关资源
最近更新 更多