循环通过字符串

时间:2015-03-27 15:19:28

标签: python iteration modulo

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

3 个答案:

答案 0 :(得分:5)

成分

以下是一些可以帮助您以简洁的方式编写encrypt函数的成分:

  1. 您可以直接遍历字符串的字符:

    >>> my_string = 'hello'
    >>> for c in my_string:
    ...     print(c)
    ...
    h
    e
    l
    l
    o
    
  2. 您可以使用标准库的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
    
  3. 您可以使用zip函数同时迭代两个序列:

    >>> for a, b in zip('hello', 'world'):
    ...     print(a, b)
    ...
    h w
    e o
    l r
    l l
    o d
    

    编辑:正如kichik建议的那样,你也可以使用itertools.izip,如果你处理非常大的输入字符串,这是有益的。

  4. 您可以使用xor运算符计算两个数字的^

    >>> 5 ^ 3
    6
    
  5. 您可以使用join函数将单个字符串序列连接到单个字符串:

    >>> ''.join(['hello', 'how', 'are', 'you'])
    'hellohowareyou'
    
  6. 您可以使用所谓的生成器表达式提供join,这类似于for循环,但作为单个表达式:

    >>> ''.join(str(x+5) for x in range(3))
    '567'
    
  7. 全部放在一起

    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]