Chr() arg 不在 python 范围内



我一直在创建一个程序,其中一部分涉及随机修改字符列表:

    while rel>0:
        pos = random.randint(0,len(out)-1)
        change = random.randint(-1*rel,rel)
        if (change+ord(out[pos]))>=255:
            change = 255-ord(out[pos])
        elif ((ord(out[pos]))-change)<=0:
            change = -1*(ord(out[pos]))
        out[pos] = chr(ord(out[pos])+change)
        rel -= abs(change)

在这里,rel 是程序用来修改字符列表的"货币"。它首先在列表中选择一个随机位置,并在 -rel 和 +rel 之间对该位置进行随机更改,然后使用 chr(ord(out[pos])+change 更改该字符的值。这给了我一个错误,即这个新的修改字符值超出了范围(256),所以我在更改字符之前添加了要执行的 2 if 语句,但它仍然偶尔返回此错误,特别是对于较大的 rel 值。我怎样才能阻止这种情况?

问题在于您选择的翻译检查。

elif ((ord(out[pos]))-change)<=0:

为什么这种差异有意义? 所有其他操作都基于字符和更改的总。 当更改 -ord(out[pos]) <时>,您会收到错误:ifelif 条件都不是 True,因此您最终会采用负数的 chr

将其减号更改为加号,您应该没问题,直到您获得超过 512 的 rel 值。 如果可能,请考虑使用模数 (%) 而不是简单的减法。

我花了几分钟来追踪这一点。 我清理了程序并添加了一对描摹打印以找出发生了什么。

import random
out = list("Now is the time for all good parties")
rel = 500
while rel > 0:
    pos = random.randint(0, len(out)-1)
    chord = ord(out[pos])
    change = random.randint(-rel, rel)
    print "A", chord, change
    if change + chord >= 255:
        change = 255 - chord
    elif chord + change <= 0:
        change = -chord
    print "B", chord, change
    out[pos] = chr(chord + change)
    rel -= abs(change)
print ''.join(out)

最新更新