特定ord中的Python循环遍历列表

2024-09-29 22:21:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表定义为:

pad = [unhexlify('00' * (16-j) + ('%02d' % j) * j) for j in range(1, 17)]

这将为填充oracle攻击构造一个填充列表。由于这个攻击是如何工作的,我需要循环使用元素2-16,然后如果我没有命中,返回并尝试第一个元素。循环如下:

^{pr2}$

如何更改外循环定义来实现这一点?在

伪代码:

for padsel in pad (items 2-16):
    do stuff until hitting a break condition
else:
    do stuff on element 1

谢谢。在


Tags: 代码in元素列表for定义itemsrange
2条回答

不要在for循环中使用else子句,只需修改迭代的iterable(list):

for padsel in (pad[1:16] + [pad[0]]):
    print(str(hexlify(padsel)) +  "- selected pad")
    for i in range(256):    #increment guess
        g = unhexlify("000000000000000000000000000000" + "{:02x}".format(i)) 
        print(str(hexlify(g)) + "- guess")
        if attack(g,padsel,ct_prev, ct_target):
            m2 += "{:02x}".format(i)
            print(m2)
            break
        else:
            continue   
m2 = m2[::-1] 
print(m2 + "- m2")

使用else子句将需要在for循环的主体中复制代码,或者将主体重构为一个函数,这样就不需要重复了。但是,由于第一个项目的处理方式与其他项目相同,因此最简单的方法是通过迭代项目2到项目16,然后迭代项目1(如果需要)来组织最后一个处理项目。在

^{pr2}$

最后一条语句有效地将列表的第一个元素移动到列表的末尾。如果您不介意修改列表,或者更喜欢修改列表,可以执行以下操作:

>>> l = range(1,16+1)
>>> l.append(l.pop(0))
>>> print l
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1]

如果您需要保持原始列表不变,请尝试:

for item in items[1:16]:  # iterate through elements 1-17 (list indexes starts at 0
    do stuff
    if condition:
        break
else: # else in for loops will be run if loop ended normally (w/o `break`)
    do stuff with items[0]

请记住,切片列表(list[x:y])将创建现有列表的副本。当与大列表一起使用时,这可能会成为内存问题。在

相关问题 更多 >

    热门问题