我需要能够使用模运算符遍历一串字符,以便每个字符都可以传递给一个函数。我知道这是一个简单的问题,但我对如何做到这一点感到非常困惑。这是我的,但它给了我错误“TypeError:不是在字符串格式化期间转换的所有参数”。任何建议将不胜感激。
key = 'abc'
def encrypt(key,string):
c = ''
for i in range(0,len(string)):
t = (key)%3
a = XOR(ord(string[i]),ord(t))
b = chr(a)
c = c + b
return(c)
答案 0 :(得分:5)
以下是一些可以帮助您以简洁的方式编写encrypt
函数的成分:
您可以直接遍历字符串的字符:
>>> my_string = 'hello'
>>> for c in my_string:
... print(c)
...
h
e
l
l
o
您可以使用标准库的cycle
模块中的itertools
函数遍历任何可迭代的(例如,字符串):
>>> from itertools import cycle
>>> for x in cycle('abc'):
... print(x)
...
a
b
c
a
b
c
a
# goes on infinitely, abort with Ctrl-C
您可以使用zip
函数同时迭代两个序列:
>>> for a, b in zip('hello', 'world'):
... print(a, b)
...
h w
e o
l r
l l
o d
编辑:正如kichik建议的那样,你也可以使用itertools.izip
,如果你处理非常大的输入字符串,这是有益的。
您可以使用xor
运算符计算两个数字的^
:
>>> 5 ^ 3
6
您可以使用join
函数将单个字符串序列连接到单个字符串:
>>> ''.join(['hello', 'how', 'are', 'you'])
'hellohowareyou'
您可以使用所谓的生成器表达式提供join
,这类似于for
循环,但作为单个表达式:
>>> ''.join(str(x+5) for x in range(3))
'567'
from itertools import cycle, izip
def encrypt(key, string):
return ''.join(chr(ord(k) ^ ord(c))
for k, c in izip(cycle(key), string))
答案 1 :(得分:0)
您可以(可能应该)在不使用range()的情况下迭代字符,并且您希望在每个字符上运行ord()之前运行mod,因为%运算符意味着字符串的其他内容。这应该有效:
key = 'abc'
for c in key:
print XOR(ord(c), ord(c) % 3)
答案 2 :(得分:0)
您可以使用itertools.cycle()
循环显示密钥和itertools.izip()
,以便轻松组合这两种密钥。
import itertools
def encrypt(key, string):
keyi = itertools.cycle(key)
result = ''
for k, v in itertools.izip(keyi, string):
a = ord(v) ^ ord(k)
result += chr(a)
return result
然后像这样使用它:
>>> encrypt('\x00', 'abc')
'abc'
>>> encrypt('\x01', 'abc')
'`cb'
您收到有关格式化的错误,因为%不是字符串的模运算符。它用于格式化字符串。你可能想要使用这样的东西:
key[i%3]