-2

2 つの引数を取得する関数で for ループを結合しようとしています。2 つの引数で実行する必要があります (どちらも整数のリストです)。これを試してもうまくいきません:

def xor_bytes (b, a):
    for i in range (b):
    for Z in range (a):
        if b[i]>a[Z]:
            return byte1
        if b[i]<a[Z]:
            return byte2
        if b[i]==a[Z]:
            return 0
4

1 に答える 1

2
def xor_bytes (b, a):
    for i,z in zip(b,a):
        if i>z:
            return byte1
        if i<z:
            return byte2
        if i==z:
            return 0
  1. 標準ライブラリのドキュメントを参照するzipか、ターミナルで試してみてください
  2. 大文字と小文字が重要です。z大文字の sを修正しました
  3. リストを反復処理するために range を使用する必要はありません。リストを反復するだけです。
  4. 未定義の変数があるため、このコードは実際には意図したとおりに機能しないか、実際にはまったく機能しません

コードは実際には 1 バイトしか返さないことに注意してください。おそらくジェネレーターとして使用したいでしょう:

def xor_bytes (b, a):
    for i,z in zip(b,a):
        if i>z:
            yield i
        if i<z:
            yield z
        if i==z:
            yield chr(0)


In [6]: list(xor_bytes('hambone', 'cheesey'))
Out[6]: ['h', 'h', 'm', 'e', 's', 'n', 'y']

代わりにこれが必要になる可能性があります。

In [13]: [chr(ord(a)^ord(b)) for a,b in zip('hambone', 'cheesey')]
Out[13]: ['\x0b', '\t', '\x08', '\x07', '\x1c', '\x0b', '\x1c']

明らかでない場合、これは 2 つのバイト文字列を取り、バイトの各ペアを xor した結果を含むバイト (または技術的には長さ 1 のバイト文字列) のリストを返します。

または:

In [14]: ''.join(chr(ord(a)^ord(b)) for a,b in zip('hambone', 'cheesey'))
Out[14]: '\x0b\t\x08\x07\x1c\x0b\x1c'
于 2012-12-12T20:59:34.723 に答える