遍历字符串 - python

我需要能够使用模运算符在字符串中循环,以便每个字符都可以传递给函数。我知道这是一个简单的问题,但是我对如何做感到很困惑。这是我所拥有的,但是它给我错误“ 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))