我想创建一个编码字符串的简单函数。 这个想法如下:
所以这是我的代码:
def encode (text, key):
textbit=[]
encoded=[]
keybit=bin(key)
for a in text:
textbit.append(bin(ord(a)))
for x in xrange (0, len(textbit)):
encoded.append(textbit[x])^(keybit)
return 0
word='abcdef'
encode(word, 243)
当我尝试运行它时,会返回错误:
TypeError:^:'NoneType'和'str'的不支持的操作数类型。
你能告诉我如何解决这个问题吗?
答案 0 :(得分:0)
您的错误是因为括号:您想要添加xor的结果,而是尝试xor encoded.append(...)
返回的内容。
但是他们还有很多其他问题,我已经修复了其中一些但并非全部(你可能想要添加一个返回并转换回字符串):
def encode(text, key):
textbit = []
encoded = []
for a in text:
textbit.append(ord(a))
for x in textbit:
encoded.append(x ^ key)
word = 'abcdef'
encode(word, 243)
答案 1 :(得分:0)
您的代码中存在一些问题(除了其他样式方面的考虑因素):
首先,当您尝试附加XOR表达式的结果时,您错放了括号:您编写了encoded.append(textbit[x])^(keybit)
而不是encoded.append(textbit[x]^keybit)
。错误的括号导致Python尝试在append
(始终为None
)和keybit
的结果之间执行XOR,这是一个字符串,如错误消息所报告的那样。 / p>
但是,即使将代码从encoded.append(textbit[x])^(keybit)
更改为encoded.append(textbit[x]^keybit)
,也会导致Python报告错误。事实上,新代码将尝试在由函数textbit[x]
构建的两个字符串keybit
和bin
之间执行XOR(它返回一个字符串 - 不是数字 - 包含二进制表示形式整数),但XOR运算符只接受整数。
然而,第二个问题有一个简单的解决方案:您必须记住,所有整数都作为二进制数存储在计算机内部。因此,在将它们与二元运算符一起使用之前,无需将它们转换为另一种格式(例如,使用bin
)。
考虑到这些注意事项(并使encode
函数返回编码的字符串,而不是无用的0
),您的函数将变为:
def encode(text, key):
textbit = []
encoded = []
for a in text:
textbit.append(ord(a))
for x in textbit:
encoded.append(chr(x^key))
return ''.join(encoded)
利用list comprehension,您可以进行一些简化:
def encode(text, key):
textbit = [ord(a) for a in text]
encoded = [chr(x^key) for x in textbit]
return ''.join(encoded)
摆脱计算textbit
的简单临时步骤,可以编写函数:
def encode(text, key):
encoded = [chr(ord(a)^key) for a in text]
return ''.join(encoded)
这可以简化为单行功能:
def encode(text, key):
return ''.join([chr(ord(a)^key) for a in text])
或使用generator expression作为:
def encode(text, key):
return ''.join(chr(ord(a)^key) for a in text)
这是Klaus D建议的单线。