パラメータを取らない関数を定義しました:
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が生成され (キーが存在しない場合のデフォルト値)、それは気に入らないでしょう。後者の方法は、文字列のみを処理できます。Dycrypt
None
dict.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'