我需要能够使用模运算符在字符串中循环,以便每个字符都可以传递给函数。我知道这是一个简单的问题,但是我对如何做感到很困惑。这是我所拥有的,但是它给我错误“ 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)
python大神给出的解决方案
配料
以下是一些要素,可以帮助您以简洁的方式编写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))