입출력

입출력은 여러 가지 형식으로 가능합니다.

input()

input([입력시 표시될 문자열(옵션)]) 함수를 이용해서 키보드로부터 문자열을 입력받을 수 있습니다.

>>> num = input('입력하세요:')
입력하세요:123 문자

>>> print('num = ', num)
num =  123 문자

입력된 문자열을 원하는 객체로 변경하려면 문자열 객체 메소드 split()을 이용합니다. 다음과 같이 문자열 12 34 문자를 입력받는다.

입력 = input('입력하세요:')
입력하세요:12 34 문자

입력 문자열을 공백 문자를 구분으로 리스트로 저장합니다.

문자열 = 입력.split()
print(문자열)
['12', '34', '문자']

리스트 축약을 이용해 숫자형 문자열만 숫자로 변환하고 연산을 해본다.

,  = [int() for  in 문자열[:2]]
print("{} + {} = {}".format(, ,  + ))
12 + 34 = 46

print()

print(객체) 함수는 키워드인자가 아닌 모든 인자들을 str(객체) 함수를 이용해서 변환된 것을 출력합니다. 여러 객체를 출력하기 위해서는 쉼표로 구분해서 나열하면 된다.

print('한글과', '컴퓨터의', '만남')
한글과 컴퓨터의 만남

기본적으로 각 객체 사이를 공백 문자를 넣어서 출력합니다. 출력할 때 출력 객체 사이에 들어갈 문자열을 sep 옵션을 이용해 지정할 수 있습니다. 다음은 각 문자열 객체 사이에 ***를 삽입하고 있습니다.

print('한글과', '컴퓨터의', '만남', sep='***')
한글과***컴퓨터의***만남

다음은 구분 문자로 쉼표와 공백 문자를 넣어서 출력한 것입니다.

print('하나', '둘', '셋', sep=', ')
하나, , 

출력 문자열 끝을 end= 옵션을 이용해 바꿀 수 있습니다. 기본값은 end=\n입니다.

print('한글', end='의 \n')
print('우수성', end='')
한글의
우수성

str()

str(객체) 함수는 객체.__str__() 메소드를 실행합니다. 만일 객체__str__() 메소드를 구현하지 않았다면 repr(객체)를 실행합니다. 다음과 같이 사람 클래스를 만들고 길동 객체를 만들어 print(길동)을 해봅니다.

class 사람:

    def __init__(self, 이름=None, 성별=None):
        self.이름 = 이름
        self.성별 = 성별

길동 = 사람('홍길동', '남')
print(길동)
<__main__.사람 object at 0x000001D86B09E898>

길동.__str__() 메소드가 구현되어 있지 않기 때문에 repr(길동)을 실행하게 된다.

repr(길동)
'<__main__.사람 object at 0x000001D86B09E898>'

print(길동) 과 같은 결과가 나오는 것을 알 수 있습니다. 다음은 사람 클래스에 __str__() 메소드를 정의한 것입니다.

class 사람:

    def __init__(self, 이름=None, 성별=None):
        self.이름 = 이름
        self.성별 = 성별

    def __str__(self):
        return '이름:{}, 성별:{}'.format(self.이름, self.성별)

길동 = 사람('홍길동', '남')
print(길동)
이름:홍길동, 성별:

print(길동)의 결과는 print(길동.__str__())를 실행한 것과 같은 결과가 나오는 것을 알 수 있습니다.

print(길동.__str__())
이름:홍길동, 성별:

즉, __str_() 메소드가 구현되어 있으면 이것을 사용하는 것을 알 수 있습니다.

repr()

repr(객체)는 문자열을 반환합니다. repr(객체)객체.__repr()__ 메소드를 실행합니다. 객체__repr()__ 메소드를 구현하지 않았다면 기본적으로 객체"<타입 이름 메모리 주소>"와 같은 정보가 출력된다. 대부분 __repr()__ 메소드는, eval(repr(객체)) 함수를 실행했을 때 원하는 결과가 나오도록 만듭니다.

사람 클래스를 이용해서 살펴봅니다. 길동 객체를 출력해봅니다.

class 사람:

    def __init__(self, 이름=None, 성별=None):
        self.이름 = 이름
        self.성별 = 성별

길동 = 사람('홍길동', '남')
print(길동)
<__main__.사람 object at 0x000001D86B09E4E0>

사람 클래스는 __str__() 메소드가 없기 때문에 repr(길동) 을 실행할 것이고, repr(길동)길동.__repr__()메소드를 실행하려고 하는데 __repr__() 메소드가 구현되어있지 않기 때문에 기본적인 정보인 타입 이름과 메모리 주소 정보가 출력 된다. 다음과 같이 __repr__() 메소드를 구현해봅니다.

class 사람:

    def __init__(self, 이름=None, 성별=None):
        self.이름 = 이름
        self.성별 = 성별

    def __repr__(self):
        return '이름은 "{}"이고 성별은 "{}"입니다.'.format(self.이름, self.성별)

길동 = 사람('홍길동', '남')
print(길동)
이름은 "홍길동"이고 성별은 "남"입니다.

print(길동)을 실행하면 길동.__str__() 메소드를 실행하려고 하는데 구현되어 있지 않으므로 repr(길동)을 실행하게 된다. 즉, 길동.__repr__() 메소드를 실행합니다.

데이터베이스

sqlite3

sqlite3에서 정규표현식을 사용하려면 내부 함수를 정의하고 시작해야 합니다.

In [1]: import sqlite3
   ...: import re
   ...: 

regexp 함수를 정의합니다. 첫번째 매개변수는 정규표현식 패턴이고 두번째 매개변수는 검색할 문자열입니다. 반환값은 논리형입니다.

In [2]: def regexp(patt, item):
   ...:   return re.search(patt, item) is not None
   ...: 

디비를 접속하고 내부 함수를 정의합니다. create_function의 첫번째 매개변수는 함수 이름이고 두번째 매개변수는 인자의 갯수, 세번째는 실제 정의된 함수를 대입합니다.

In [3]: conn = sqlite3.connect(':memory:')
   ...: conn.create_function("regexp", 2, regexp)
   ...: 
In [4]: cur = conn.execute("select * from table_name where regexp('\d{2}', field_name)")
   ...: cur.fetchall()
   ...: conn.close()
   ...: