我尝试使用以下函数在Python中创建加密函数。
def code_char(c, key):
adj = ord('a') if c.islower() else ord('A')
return chr(adj + (ord(c)-adj+int(key))%26)
^对角色进行编码
def isletter(c):
if 65 <= ord(c) <= 90:
return True
elif 97 <= ord(c) <= 122:
return True
else:
return False
^检查字符是否为字母
加密功能必须包含code_block
和isletter(c)
功能
我希望能够输入任何长度的字符串,并根据8位数密钥对其进行加密。
我也希望忽略任何空格,标点符号以及任何不是字母的内容。
非常感谢任何帮助
答案 0 :(得分:0)
使用isletter
def isletter(c):
if 65 <= ord(c) and ord(c) <= 90:
return True
elif 97 <= ord(c) and ord(c) <= 122:
return True
else:
return False
旧代码中的:
65<=ord(c)<=90
65<=ord(c)
会给出一些布尔值,然后与90
进行比较。 [AC:在python中不正确]
code_char
功能更改:
def code_char(c, key):
tmp=ord(c)+int(key)
if(tmp>122):
return chr(tmp-26)
else:
return chr(tmp)
答案 1 :(得分:0)
您的问题与code_char
一致,因为当您添加int(key)
时需要修改%26
以确保该字母保留为ascii字符:
def code_char(c, key):
adj = ord('a') if c.islower() else ord('A')
return chr(adj + (ord(c)-adj+int(key))%26)
结果:
>>> encrypt("This is a secret message!!", "12345678")
'Ujlw ny h afeuiy slatcji!!'
您当然可以改进代码,例如可以重写code_block
:
import itertools as it
def code_block(word, key):
k = it.cycle(key)
return "".join(code_char(c, next(k)) if isletter(c) else c for c in word)
您还可以重写isletter()
:
def isletter(c):
return c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
您可以利用已定义此内容的string
模块:
import string
def isletter(c):
return c in string.ascii_letters
最后,您encrypt()
不必要地创建了一个列表''.join()
而且只是:{/ p>
def encrypt(s, key): # string is a module - may clash
return code_block(s, key)
注意:if 65 <= ord(c) <= 90:
完全合法,并且按照您的期望在Python中完成。