あなたは何をすべきかについていくつかのアイデアを持っていて、1つのトラックを開始して別のトラックに移動するように変更したと思います。あなたが初心者であるという事実を考えると、それは驚くべきことではありません。しかし、は一貫してとすることをお勧めします。また、再帰、反復、スライシング、または例外を使用してこれを実行できます。しかし、あなたがそれをやっている理由を理解せずにそれらをすべて組み合わせることは問題です。
あなたは、これはメッセージ出力していることがわかります - 1行につき1つの文字が。すばらしいです!問題の最初の部分が完了しました。次のステップはキーから文字を取り出すことです。さて、そこに鍵を入れましょう。しかし、一度に2つの文字列をどのように反復するのですか?私たちがpython iterate over two sequences
のためにgoogleを検索すると、私の最初の結果はHow can I iterate through two lists in parallel?でした。悪くない。便利なダンディzip
の機能について教えてください。あなたがそれについて学ぶ場合は、python3 zip
を検索するか、>>> help(zip)
をあなたのREPLで実行するだけです。今
残りの文字列はどこですか?私たちが最短の文字列の終わりに達すると、それは止まります。私たちはジッパーのヘルプを見れば、我々は以下を参照してください。引数の順序で最短のiterableが
が続くので、それだけで最短のものまで行くことになるだろう。まあ、それはバマーです。つまり、キーとメッセージの長さを同じにする必要があります。それとも?私たちの鍵がより長い場合は、メッセージよりもでしょうか?うまくいけば、今ではあなたはこのような何かを行うことができますことを知っている:
>>> 'ab'*10
'abababababababababab'
私達は私達のキーは動作します私たちのメッセージ、と少なくとも同じ長さであることを確認してください。だから、私たちはメッセージの中の文字の数を鍵の倍数だけ増やすことができます。私たちが必要とする以上にの方法を持っていますが、それはうまくいくはずですか?試してみましょう:
message = 'computing is awesome'
keyword = 'gcse'*len(message)
for letter, key in zip(message, keyword):
print(letter, key)
Sweet!出来た!
だから今ちょうどord
値を追加してみましょうと我々は何を得る見てみましょう:
for letter, key in zip(message, keyword):
print(chr(ord(letter)+ord(key)))
をああ...親愛なります。 ASCII文字ではありません。すでに分かっているように、それぞれから96を引く必要があります。数学のおかげで判明したように、すでに得られた合計から96 * 2を引くことができます。
for letter, key in zip(message, keyword):
if letter == ' ':
print()
else:
new_code = (ord(letter)+ord(key)-96*2)
print(chr(new_code+96))
ただし、まだアルファベット以外の文字があります。だから、その価値を取り戻すには、
for letter, key in zip(message, keyword):
if letter == ' ':
print()
else:
new_code = (ord(letter)+ord(key)-96*2)
if new_code > 26:
new_code -= 26
print(chr(new_code+96))
これでいいですね。私たちが残している唯一のことは、私たちのメッセージをプリントアウトする代わりに文字列に組み合わせて、このコードを関数に貼り付けることです。そして、ユーザーから私たちの入力を得る。
def change(message, keyword):
if len(keyword) < len(message):
keyword = keyword * len(message)
result = ''
for letter, key in zip(message, keyword):
if letter == ' ':
result += ' '
else:
new_code = (ord(letter)+ord(key)-96*2)
if new_code > 26:
new_code -= 26
result += chr(new_code+96)
return result
message = input('enter your sentence: ')
keyword = input('enter your keyword: ')
print(change(message, keyword))
再帰
だから我々はそれが反復を使用して作業を持っている:我々はまた、関数に当社の主要長増加コードを固執するつもりです。再帰はどうですか?あなたはであり、あなたの解決策で再帰を使用しているのは確かにです。さて、始めに戻って、手紙による手紙を印刷する方法を考えてみましょう。
message = 'computing is awesome'
def change(message):
if not message:
return
print(message[0])
change(message[1:])
change(message)
これは機能します。ここでキーを追加します。実際には前と同じことをすることができます。ただ乗算するだけです。
def change(message, keyword):
if not message:
return
if len(keyword) < len(message):
keyword = keyword*len(message)
print(message[0], keyword[0])
change(message[1:], keyword[1:])
これは驚くほど単純です。今度は、変換された値をプリントアウトしてみましょう:
def change(message, keyword):
if not message:
return
if len(keyword) < len(message):
keyword = keyword*len(message)
new_code = (ord(message[0])+ord(keyword[0])-96*2)
if new_code > 26:
new_code -= 26
print(chr(new_code+96))
change(message[1:], keyword[1:])
は再び我々はスペース文字を処理する必要があります。
def change(message, keyword):
if not message:
return
if len(keyword) < len(message):
keyword = keyword*len(message)
if message[0] == ' ':
print()
else:
new_code = (ord(message[0])+ord(keyword[0])-96*2)
if new_code > 26:
new_code -= 26
print(chr(new_code+96))
change(message[1:], keyword[1:])
は今残っている唯一のことは、結果を組み合わせることです。再帰では、通常、前後の値のいくつかの種類を渡し、我々は我々の結果とそれをやろうとしている:私たちは、再帰的なアプローチでは、いくつかのスライスを使用
をスライス
def change(message, keyword, result=''):
if not message:
return result
if len(keyword) < len(message):
keyword = keyword*len(message)
if message[0] == ' ':
result += ' '
else:
new_code = (ord(message[0])+ord(keyword[0])-96*2)
if new_code > 26:
new_code -= 26
result += chr(new_code+96)
return change(message[1:], keyword[1:], result)
print(change(message, keyword))
。私たちは、文字列の一部を切り取るのではなく、インデックスを渡すことさえできました。しかし、今我々はスライスし、ダイスするつもりです。
はデフ変更(メッセージ、キーワード):それは私たちの再帰的なソリューションにかなり似ているようになるだろうlenの場合 (キーワード)< LEN(メッセージ): キーワード=キーワード* LEN(メッセージ)
while message:
print(message[0], keyword[0])
message = message[1:]
keyword = keyword[1:]
あなたはそれはあなたが私たちの再帰的な溶液からのコードに置くことができることを実現するためのストレッチの多くすべきではない、ということを参照してください。
while message:
if message[0] == ' ':
print()
else:
new_code = (ord(message[0])+ord(keyword[0])-96*2)
if new_code > 26:
new_code -= 26
print(chr(new_code+96))
message = message[1:]
keyword = keyword[1:]
そして、我々はただ、結果に文字を組み合わせる:
def change(message, keyword):
if len(keyword) < len(message):
keyword = keyword*len(message)
result = ''
while message:
if message[0] == ' ':
result += ' '
else:
new_code = (ord(message[0])+ord(keyword[0])-96*2)
if new_code > 26:
new_code -= 26
result += chr(new_code+96)
message = message[1:]
keyword = keyword[1:]
return result
さらに読書
あなたは、いくつかのよりよいことを行うことができます。私たちが鍵で行った愚かな乗算よりも、itertools.cycleはどうですか?
減算の代わりにモジュロ除算を使用するとどうなりますか?
入力内容は何ですか?期待される成果は?代わりにあなたの出力は何ですか?あなたの質問に[mcve]を含めるように編集してください。 –
あなたはそれを反復している間に 'message'の値を変更することをお勧めしません。 IndexErrorsを捕まえて何か問題が起こった場合には、もう一度関数を実行することをお勧めします。 – Kevin