2016-12-08 13 views
0

以前の私たちは、「腐敗」量によって単一の文字を受信して​​、回転させる機能を作成しました:機能 - シーザー暗号

def rotate(letter, rot): 
shift = 97 if letter.islower() else 65 
return chr((ord(letter) + rot - shift) % 26 + shift) 

letter = input('Enter a letter: ') 
rot = int(input('Enter a number: ')) 
print(rotate(letter, rot)) 

は今、私はすべての文字を回転させる機能を作成する必要があります文字列の "腐敗"量(右)。だから、例えば

(Hello World, 1) 

の入力と

encrypt(text, rot) 

は返します:

Ifmmp Xpsme 

そして、これは私がこれまで持っているものです。

def rotate(letter, rot): 
    shift = 97 if letter.islower() else 65 
    return chr((ord(letter) + rot - shift) % 26 + shift) 

def encrypt(text, rot): 
    encrypted = [] 
    for letter in text: 

#use previous rotate function to rotate characters 

     encrypted.append(rotate(letter,rot)) 

     return ''.join(encrypted) 

text = input("Enter some text") 
rot = int(input("Enter a number")) 
print(encrypt(text,rot)) 

しかし、私を」 20行目にParseErrorを取得する:print(encrypt(text,rot))。私は2つの関数を正しく一緒に使用しているかどうかわかりません - 回転関数は暗号化関数の内部にあるべきですか?なぜ私がParseErrorを取得している別の理由はありますか?私が正しい道にいるかどうか私に教えてください/できれば助けてください。ありがとうございました。

EDIT:インデントprint(encrypt(text,rot))は「ParseErrorです:ライン21上の不正な入力」を処分したが、それはまた私に「ParseErrorです:ライン17上の不正な入力」:与えた私は前後にインデントを移動しようとしたreturn ''.join(encrypted):を。

EDIT 2:ソリューションは、このようになります(後の固定インデント):

def rotate(letter, rot): 
    shift = 97 if letter.islower() else 65 
    return chr((ord(letter) + rot - shift) % 26 + shift) 

#letter = input('Enter a letter: ') 
#rot = int(input('Enter a number: ')) 
#print(rotate(letter, rot)) 

def encrypt(text, rot): 
    encrypted = [] 
    for letter in text: 

#use previous rotate function to rotate characters 

     encrypted.append(rotate(letter,rot)) 

    return ''.join(encrypted) 

text = input("Enter some text") 
rot = int(input("Enter a number")) 

print(encrypt(text,rot)) 

EDIT 3:あなたが回転中にスペースや特殊文字を維持したい場合は、あなたが回転するように指定する必要があります文字がアルファベットである場合、この関数は次のように実行します:

def rotate(letter, rot): 
    shift = 97 if letter.islower() else 65 
    return chr((ord(letter) + rot - shift) % 26 + shift) 

def encrypt(text, rot): 
    encrypted = [] 
    for letter in text: 

#if it's a space, keep it a space 
#if it's a special character, keep it a special character 

     if letter.isalpha(): 

#use previous rotate function to rotate characters 

      encrypted.append(rotate(letter,rot)) 

     else: 

      encrypted.append(letter) 

     return ''.join(encrypted) 

text = input("Enter some text") 
rot = int(input("Enter a number")) 

print(encrypt(text,rot)) 
+0

タブとスペースをミックスしていますか? –

+0

IDEの上にあるようにタブで区切られています。タブを使ってすべてのスペースを作成しました。 – HappyHands31

答えて

2

あなたはダングリングコロンがあります。

return ''.join(encrypted): 
          ^

削除してください。

ところで、あなたのreturnはあなたのfor-loopの中にあり、最初の繰り返しで関数が終了します。

+0

これでParseErrorが取り除かれました。ありがとうございました。今私は次のようになっています: "ValueError:基数10のint()のリテラルが無効です: '20行目に数字を入力してください"。コラプスがなくても質問が更新されました。 – HappyHands31

+1

ええ、 'intput'と' int'をその文字列に適用する順序を逆順にします。 ''数字を入力してください '...エラーはわかりやすいものです。もちろん、ああ、 –

+0

。それはその問題を取り除いた。今では "NameError:name 'letter'が15行目に定義されていません。" – HappyHands31