2017-02-01 22 views
0

私はCaesar-Cypher関数を作成しています。私のコースで使用している教科書から、これを行うために組み込みのord()関数とchr()関数を使用することをお勧めしました。それは最良の方法かもしれないし、そうでないかもしれない(間違いなく私が見たものからではない)が、あなたがしたいものだ。Caesar-cypher:ord()関数は文字列を受け取り、整数を受け取ると言う

私の問題は、forループでplaceholder変数をord()関数に送信すると、長さ1の文字列が返されるが、代わりに整数を受け取るというエラーが発生することです。私は変数cが 'i'の値を持っていることを確認する直前にprint関数を置いていますが、関係なく失敗するようです。ここで

は、私が作成した関数である:

def rotate_word(word, num): 
    count = 0 
    newWord = '' 
    while count < len(word): 
     for c in word: 
      print(c) 
      newWord += chr(((ord(c)) - (ord(num) -1))) 
      count += 1 
    print(newWord) 

そして、これは私が受け取るエラーです:

rotate_word('ibm', -1) 
i 
Traceback (most recent call last): 
    File "<pyshell#95>", line 1, in <module> 
    rotate_word('ibm', -1) 
    File "<pyshell#94>", line 7, in rotate_word 
    newWord += chr(((ord(c)) - (ord(num) -1))) 
TypeError: ord() expected string of length 1, but int found 

このエラーが-1よりも、他の整数のために発生します。公平であるように、コード自体が私が望むことをしているかどうかは完全にはわかりません(私はこの部分を理解しようとしていましたが、この部分がなければ残りの部分を確実にするという点は見られません)。

+1

「ord(num)」、「num」のみを使用しないでください:) – GAVD

答えて

0

ordパラメータとしてstringを取り、intを返す:

1つのUnicode文字を表す文字列が与えられると、その文字のUnicodeコードポイントを表す整数を返します。たとえば、ord( 'a')は整数97を返し、ord( '€')(ユーロ記号)は8364を返します。これはchr()の逆です。

コードでは、代わりにintを渡しているため、コマンドラインに表示されるエラーが発生します。 numを何かに変換する必要はありません。ただ、回転量を追加し、chrで再び文字に結果を変換し、数値に文字を変換:上記'a'が左回転しているか'z'を回転させ、オーバーフロー/アンダーフロー例を処理しない

def rotate_word(word, num): 
    count = 0 
    newWord = '' 
    while count < len(word): 
     for c in word: 
      newWord += chr(ord(c) + num) 
      count += 1 
    print(newWord) 

rotate_word('ibm', -1) # 'hal' 

注意右。

+0

あなたの回答と最後のごあいさつありがとうございます。私はordの2番目の呼び出しでintの問題を認識しましたが、over/under-flowについては考えませんでした。ありがとうございました。 – mwierda

関連する問題