본문으로 이동

일반인을 위한 파이썬 지침서/문자열의 복수

위키책, 위키책

이제 문자열로 할 수 있는 기가 막힌 꼼수하나를 보이겠다.

def shout(string):
    for character in string:
        print "Gimme a "+character
        print "'"+character+"'"

shout("Lose")

def middle(string):
    print "The middle character is:",string[len(string)/2]

middle("abcdefg")
middle("The Python Programming Language")
middle("Atlanta")

그 출력은 다음과 같다.

Gimme a L
'L'
Gimme a o
'o'
Gimme a s
's'
Gimme a e
'e'
The middle character is: d
The middle character is: r
The middle character is: a

이 프로그램이 보여주는 것은 문자열이 여러 면으로 리스트와 비슷하다는 것이다. shout 프로시져는 for회돌이가 리스트에 사용될 수 있는 것과 마찬가지로 문자열에 사용될 수 있다는 것을 보여준다. middle 프로시져는 그 문자열이 len함수 그리고 배열 지표 그리고 썰기 역시 사용할 수 있음을 보여준다. 대부분의 리스트 사양은 문자열에도 또한 작동한다.

다음의 사양은 문자열의 어떤 특별한 사양을 보여준다.

def to_upper(string):
    ## Converts a string to upper case
    upper_case = ""
    for character in string:
        if 'a' <= character <= 'z':
            location = ord(character) - ord('a')
            new_ascii = location + ord('A')
            character = chr(new_ascii)
        upper_case = upper_case + character
    return upper_case

print to_upper("This is Text")

그 출력을 여기에 보이면

THIS IS TEXT

컴퓨터가 문자열의 문자를 0에서 255까지의 숫자로 나타내므로 이것은 잘 작동한다. 파이썬은 ord( ordinal의 약자)라 부르는 함수를 가지고 있어서 문자를 숫자로 반환해 준다. 또한 대응되는 chr 이라 부르는 함수도 있어서 숫자를 문자로 반환해준다. 이것을 염두에 두고서 프로그램은 깨끗해지기 시작해야만 한다. 첫 번째 세부사항은 이 라인이다: 'if 'a' <= character <= 'z':' 이 라인은 문자가 소문자인가 점검한다. 만약 그렇다면 다음의 라인이 사용된다. 먼저 그것은 'location = ord(character) - ord('a')' 라인을 사용하여 위치로 변환되어 a=0,b=1,c=2 등등으로 변환된다. 다음으로 그 새로운 값은 'new_ascii = location + ord('A')'에서 발견된다. 이 값은 다시 문자로 변환되어서 이제는 대문자이다.

이제 더 짧은 타이핑 연습을 위해

print "Integer to String"
print repr(2)
print repr(23445)
print repr(-23445)
print "String to Integer"
print int("14234")
print int("12345")
print int("-3512")
print "Float to String"
print repr(234.423)
print repr(62.562)
print repr(-134.5660)
print "Float to Integer"
print int(51.523)
print int(224.63)
print int(-1234.562)

친숙하게 보이는 출력은 다음과 같다.

Integer to String
2
23445
-23445
String to Integer
14234
12345
-3512
Float to String
234.423
62.562
-134.566
Float to Integer
51
224
-1234

여러분이 아직까지 이해가 가지 않는다면 (역주: 가르쳐 주면) repr 함수가 정수를 문자열로, int함수가 문자열을 정수로 변환할수 있다. repr 함수는 어떤 것의 출력가능한 형태를 돌려준다. 여기에 이러한 약간의 예가 있다.

>>> repr(1)
'1'
>>> repr(234.14)
'234.14'
>>> repr([4,42,10])
'[4, 42, 10]'

int 함수는 문자열(혹은 소수형)을 정수로 변환한다. float 라고 불리는 비슷한 함수 또한 있어서 정수나 문자열을 소수형으로 바꾸어 준다. 파이썬이 가지고 있는 또 다른 함수는 eval 함수이다. eval 함수는 문자열을 취해 파이썬이 판단하는 형태로 데이타를 반환한다. 예를 들어

>>> v=eval('123')
>>> print v,type(v)
123 <type 'int'>  <- 정수형
>>> v=eval('645.123')
>>> print v,type(v)
645.123 <type 'float'>  <- 소수형
>>> v=eval('[1,2,3]')
>>> print v,type(v)
[1, 2, 3] <type 'list'> <- 리스트형

여러분이 eval 함수를 사용한다면 그 함수가 여러분이 예상한 형태를 반환하는지 점검해야 한다.

하나의 유용한 문자열 함수는 split 함수이다. 여기에 예가 있다.

>>> import string
>>> string.split("This is a bunch of words")
['This', 'is', 'a', 'bunch', 'of', 'words']
>>> string.split("First batch, second batch, third, fourth",",")
['First batch', ' second batch', ' third', ' fourth']

split이 문자열을 문자열의 리스트로 변환하는 것을 주목하라. 문자열은 기본값으로 공백으로 분리되거나 혹은 선택적으로 두 번째 인수에 의해서 분리된다 (이경우에는 콤마).

예제

[+/-]
# This program requires a excellent understanding of decimal numbers
def to_string(in_int):
    "Converts an integer to a string"
    out_str = ""
    prefix = ""
    if in_int < 0:
        prefix = "-"
        in_int = -in_int
    while in_int / 10 != 0:
        out_str = chr(ord('0')+in_int % 10) + out_str
        in_int = in_int / 10
    out_str = chr(ord('0')+in_int % 10) + out_str
    return prefix + out_str

def to_int(in_str):
    "Converts a string to an integer"
    out_num = 0
    if in_str[0] == "-":
        multiplier = -1
        in_str = in_str[1:]
    else:
        multiplier = 1
    for x in range(0,len(in_str)):
        out_num = out_num * 10 + ord(in_str[x]) - ord('0')
    return out_num * multiplier

print to_string(2)
print to_string(23445)
print to_string(-23445)
print to_int("14234")
print to_int("12345")
print to_int("-3512")

그 출력은 다음과 같다.

2
23445
-23445
14234
12345
-3512