2010-08-17 2 views
2

나는 파이썬 2.7의 초보자이며, 사용자로부터 입력 문자열을 받아 모든 문자를 아스키 값으로 변환하고, 2를 더하는 간단한 프로그램을 만들려고한다. 모든 ascii 값을 변환 한 다음 새 값을 텍스트로 변환합니다. 예를 들어, 사용자 입력이 "test"이면 출력은 "vguv"여야합니다. 제대로 작동하는 것 나던파이썬 : ASCII 및 ASCII에서 텍스트 변환기 프로그램으로의 텍스트

message = input("enter message to encode") 

for ch in message: 
    message2 = ord(ch) + 2 
    print "\n\n" 
    encodedmessage = "" 
    for item in message2.split(): 
      encodedmessage += chr(int(item)) 

print ("encoded msg in text : "), encodedmessage 

그것은, 어떤 도움을 주시면 감사하겠습니다 :

내가 지금까지 작성한 코드입니다. 감사.

+3

항상하려고 약간의 시간을 할애하여 문자 인코딩에 따라 뭔가로 변신 인터프리터가 당신에게 던지는 에러를 요약해라. 이 코드는'AttributeError : 'int'객체에 'split'속성이 없으며 작동하지 않는 행을 표시합니다. 상당히 직접적으로'message2'는 여러분이 아마도 기대하지 않았던'int '객체입니다. 알아낼 수없는 경우 (일부 오류는 상당히 모호 할 수 있음), * 단지 "작동하지 않는다"는 대신 * 오류를 게시하십시오. –

+0

그건 그렇고 : Nick T의 충고는 매우 건전합니다 : 인터프리터의 오류를 받아 들여 그것이 의미하는 것을보십시오. 또한 라인 번호와 컨텍스트를 제공해야하므로 어디서 볼 수 있는지 알 수 있습니다. 각 변수가 보유하고 있다고 생각하는 변수를 보유하고 있는지 확인하십시오. – rbp

답변

2

message2 = ord(ch) + 2message2 정수를 만드는, 그래서 물론 당신이 다음에 split를 호출 할 수 없습니다 - 그것은 하나의 문자를 나타내는 단일의 int이다, 왜 이제까지 당신이 원하는 것은에게 그것을 분할! 또한 루프를 통해 매번 encodedmessage을 빈 문자열로 재설정하므로 split의 별난 문제를 해결하면 간단히 제거 할 수 있습니다. 대신 encodedmessage = ''을 전에 으로 이동 시키십시오.

+0

일반적으로 문자열에 + = 연산자를 사용하는 것은 좋지 않습니다. 호출 될 때마다 새 문자열을 만듭니다. 아마도 문자 목록을 유지 한 다음'' '.join (whateverlist)'을 수행하는 것이 더 나을 것입니다. –

+0

Alex : 그렇습니다.이 점도 고려했습니다. 그러나 그것이 OP를 혼란스럽게 할 것이라고 생각합니다. 그래서이 경우 용서할 수 있습니다. – rbp

+0

@Alex Bliskovsky :'' '.join()'이 문자열 연결보다 빠르다고 자주 반복되지만, 필자는 최신 Python 릴리스에서 반드시 그런 것은 아니라고 생각합니다. 사실,이 미세 테스트에서 http://paste.ubuntu.com/479529/,'python -mtimeit -s'import test ''test.add_strings (1000)'은 201us를 사용하는 반면,'python -mtimeit -s'import test ''test.join_strings (1000)'은 루프 당 250us 걸립니다. @Alex Martelli가이 점에 무게를 두는 지 알고 싶습니다. – unutbu

1

문자와 문자열을 혼합합니다. 문자열을 반복 할 때 (예 : "message"), 각 반복마다 하나의 문자를 얻습니다. 또한, ord (ch)는 정수형 숫자이므로 "split"할 수 없습니다.

또한 "input"을 사용하지 말고 대신 "raw_input"을 사용하십시오. 루프 GIES로 한 번에 한 문자, 그래서 변수의 이름을 변경하고있어, 여기에

message = raw_input("enter message to encode: ") 
encoded_message = "" 
for ch in message: 
    encoded_ord = ord(ch) + 2 

는 아직 새로운 메시지가 없습니다 : 당신이 원하는 무엇

아마이 비슷한입니다 인코딩 된 코드를 더 잘 설명하는 "encoded_ord"로 변환합니다. 이제

, 당신은 인코딩 된 문자로이 "인코딩 ORD"을 설정하고, 인코딩 된 메시지에 추가 할 수 있습니다 :

 encoded_ch = chr(encoded_ord) 
    encoded_message += chr(encoded_ch) 

print "encoded msg in text:", encodedmessage 
1

당신은 rot-13 (또는 일반화 "rot-x") 입력 기능을 수행하려고 ?

from string import ascii_uppercase, ascii_lowercase 

def rotx(data,rotby): 
    total = [] 
    for char in data: 
     if char in ascii_uppercase: 
      index = (ascii_uppercase.find(char) + rotby) % 26 
      total.append(ascii_uppercase[index]) 
     elif char in ascii_lowercase: 
      index = (ascii_lowercase.find(char) + rotby) % 26 
      total.append(ascii_lowercase[index]) 
     else: 
      total.append(char) 
    return "".join(total) 

실행 : 당신이 ASCII 문자에 2를 추가 담요 경우, } 비 인쇄된다

>>> import rotx 
>>> rotx.rotx("test",2) 
'vguv' 
>>> rotx.rotx("IBM-9000",-1) 
'HAL-9000' 

~

관련 문제