2017-08-15 11 views
-4

私はちょうどのpythonを始めたと私は愚かなエラーにこだわっているが、私は、私はこのエラーを得たプログラムを実行するとき、それはQ:python:なぜ私のcharはstrと見なされますか?

def encryption(str1): 
    i = 0 
    for x in str1: 
     if (x >= 'a' and x <= 'z' or x >= 'A' and x <= 'Z'): 
      str1[i] = str1[i] + 3 % 26 #str[i] = x + 3 % 26 
     i+=1 
    return str1 

を働いていない理由を私は理解していない:

TypeError: string indices must be integers, not str.

ことができます誰かが私になぜstr [i] - 23がstrとみなされるのか説明します。私には、charのascii値を変更するだけです。

+2

これはCではない、ORDは(0009 [I]) '文字のASCII値を取得する'試みます。なぜインデックスを 'x'と混ぜるのですか?エラーはどこか他の場所にあるようです... –

+0

と投稿する前にインデントを修正してください。 –

+0

文字列は不変であることを覚えておいてください。 –

答えて

1

Pythonの文字列は、Cのような配列ではありません。これらは変更不可能です。すなわち、 文字列を変更することはできません。あなたのオプションは、 の文字列をリスト(Cの配列に似ています)にしたり、新しい空文字列 を作成し、各暗号化された文字を連結します(これはおそらくもっと速くなります)。 Ordは文字列をascii番号に変換し、chrは逆変換します。 文字IFF真はisalpha法テスト{-ZのA-Z}にある

str1 = 'this is a test [email protected]#[email protected]#[email protected]' 

def encryption(str1): 
    new_string = '' 
    for character in str1: 
     if character.isalpha(): 
      new_string += chr(ord(character) + 3 % 26) 
     else: 
      new_string += character 
    return new_string 

print(encryption(str1)) 
+0

ああ、よく私は大きなpython文字列訓練セッションでは、私はPythonとCの文字列の間に大きな違いがありました。有難う御座います。 – Cjdcoy

+0

主な違いは不変です。 Cのように文字列にインデックスを付けることはできますが、個々の文字要素を変更することはできません。擬似C配列にする場合は、list comprehension array = [x for string for x]を行い、その後に変更を加えた後にzipしてください。 "" .join(array)。しかし、私の答えの方法は、より高速でpythonicされます。 – Rosh

+0

yea私はあなたのような理由でしようとするので、Cを模倣するためにpythonをやっていません。 – Cjdcoy

関連する問題