2

作ったエンクリプターからコードを解読するデクリプターを作ろうとしています。コードを実行すると、このタイプのエラーが発生します

     getcrypt = ''.join(map(Decrypt.get,split_up_into_sixteen_chars(x_str)))
TypeError: split_up_into_sixteen_cjars() takes 0 positional arguments but 1 was given

私はプログラミングにかなり慣れていないので、何が原因なのかわかりません。ここに私のコードがあります

Decrypt = {'1s25FF5ML10IF7aC' : 'A', 1s2afF5ML10I7ac' : 'a'} #I obviously have more than this but I'm trying to make it as simplified as possible
def split_up_into_sixteen_chars():
    while len(x_str)>0:
        v = x_str[:16]
        print(v)
x_str = (input())
getcrypt = ''.join(map(Decrypt.get,split_up_into_sixteen_chars(x_str)))
print(getcrypt)
4

1 に答える 1

3

パラメータを取らない関数を定義しました:

def split_up_into_sixteen_chars():

それでもあなたはそれを渡しています:

split_up_into_sixteen_chars(x_str)

関数がここで 1 つのパラメーターを受け取り、名前を付けることを Python に伝える必要があります。

def split_up_into_sixteen_chars(x_str):

使用する名前は、関数呼び出しに渡す名前と一致する必要はありませんが、関数内で使用するものと一致する必要があります。次の関数も機能します。私がしたのは、パラメータの名前を変更することだけでした:

def split_up_into_sixteen_chars(some_string):
    while len(some_string) > 0:
        v = some_string[:16]
        print(v)

これは、パラメーターが関数に対してローカルなローカル名some_stringになるため機能します。関数内にのみ存在し、関数が完了すると再び消えます。

関数が無限ループを作成することに注意してください。の長さはsome_string常に 0 か、常に 0 より長くなります。長さはループの本体では変化しません。

以下はよりうまくいくでしょう:

def split_up_into_sixteen_chars(some_string):
    while len(some_string) > 0:
        v = some_string[:16]
        print(v)
        some_string = some_string[16:]

some_string毎回それ自体の短いバージョンに置き換えるからです。

次の問題は、関数が何も返さないことです。次に、Python はデフォルトの戻り値 を受け取りますNone。印刷はまったく別のものでありprint()、データをコンソールまたは IDE に書き込みますが、関数の呼び出し元はその情報を読み取ることができません。

この場合、本当にジェネレーター関数が必要なので、 を使用しますyield。ジェネレーター関数は情報をチャンクで返します。ジェネレーターに次のチャンクを 1 つずつ要求することができますmap()。関数を次のように変更します。

def split_up_into_sixteen_chars(some_string):
    while len(some_string) > 0:
        v = some_string[:16]
        yield v
        some_string = some_string[16:]

あるいは:

def split_up_into_sixteen_chars(some_string):
    while some_string:
        yield some_string[:16]
        some_string = some_string[16:]

whileおよびで使用されるブール値テストに関しては、空の文字列は「false-y」であるためifです。

あなたのmap(Decrypt.get, ...)立場として、 にキーとして存在しないsplit_up_into_sixteen_chars()ものを生成する場合、 aが生成され (キーが存在しない場合のデフォルト値)、それは気に入らないでしょう。後者の方法は、文字列のみを処理できます。DycryptNonedict.get()''.join()

1 つのオプションは、代わりに文字列のデフォルトを返すことです。

''.join(map(lambda chunk: Decrypt.get(chunk, ''), split_up_into_sixteen_chars(x_str)))

''に存在しないチャンクに対して空の文字列が返されるようになりましたDecrypt。これにより、スクリプト全体がどのような文字列入力に対しても機能します。

>>> x_str='Hello world!'
>>> ''.join(map(lambda chunk: Decrypt.get(chunk, ''), split_up_into_sixteen_chars(x_str)))
''
>>> x_str = '1s25FF5ML10IF7aC'
>>> ''.join(map(lambda chunk: Decrypt.get(chunk, ''), split_up_into_sixteen_chars(x_str)))
'A'
于 2013-05-06T16:27:31.457 に答える