음성학/음운론 연구를 위한 Python 맛보기
음운론학회 연구방법론 워크숍
2018년 12월 8일 (토)

음성학/음운론 연구를 위한 Python 맛보기 Part 1

Python Overview

  • [x] Part 1
    • Python 프로그래밍을 위한 variables 및 data type의 이해
    • control structure 소개
    • function과 class 소개
  • Part 2
    • 문자열
    • file input 및 file ouput
    • packages (예, NLTK) 사용 소개
  • Part 3
    • Regular Expression
    • Unicode와 text encoding
    • Error 발생시 대처법

파이썬 인터프리터

파이썬 인터프리터는 '대화 모드'라 하여, 개발자와 파이썬이 대화하듯이 프로그래밍할 수 있다. '대화하듯이'이라는 것은, 예를 들어 개발자가 "1+2는?"이라고 물으면 파이썬 인터프리터가 곧바로 "3입니다"라고 대답한다는 것을 의미한다. 그럼 실제로 입력해보도록 하자.

In [ ]:
1+2

이처럼 파이썬 인터프리터에서는 대화식으로 프로그래밍할 수 있다. 이번 시간에는 이 대화 모드를 사용하여 파이썬 프로그래밍을 간단히 실습해보도록 하자.

산술 연산

덧셈과 곱셈 등의 산술 연산은 다음과 같이 할 수 있다.

In [ ]:
1-2
In [ ]:
4*5
In [ ]:
7/5
In [ ]:
3**2

*은 곱셈, /는 나눗셈, **는 거듭제곱을 의미한다(3**2는 3의 2제곱).

참고로, Python2에서는 정수끼리 계산한 결과는 정수이다. 예를 들어, 7/5의 결과는 1이다. Python3에서는 정수를 나눈 결과는 1.4와 같이 실수(부동소수점)가 된다.

자료형(Data type)

프로그래밍 언어에서는 자료형(data type)이라는 것이 있다. 자료형이란 데이터의 성질을 나타내는 것으로, 예를 들어, 정수, 실수, 문자열과 같은 형태가 있다. Python에서는 type()함수로 특정 데이터의 자료형을 알아 볼 수 있다.

In [ ]:
type(10)
In [ ]:
type(2.718)
In [ ]:
type("hello")

즉, 10은 int(정수), 2.718은 float(실수), "hello"는 str(문자열)형임을 알 수 있다.

변수(Variables)

xy등의 알파벳을 사용하여 변수(variable)를 정의할 수 있다. 또한 변수를 사용하여 계산하거나 변수에 다른 값을 대입할 수도 있다.

In [ ]:
x = 10 # 초기화
print(x) # x의 값 출력
In [ ]:
x = 100 # 변수에 값을 대입
print(x)
In [ ]:
y = 3.14
x*y
In [ ]:
type(x*y)

파이썬은 동적 언어로 분류되는 프로그래밍 언어이다. 동적이라 함은 변수의 자료형을 상황에 맞게 자동으로 결절한다는 뜻이다. 앞의 예에서 x의 자료형이 int(정수)라는 것을 사용자가 명시한 적이 없었다. 하지만, 10이라는 정수로 초기화할 때, x의 형태가 int임을 파이썬이 스스로 판단한다는 것이다. 또한, 정수와 실수를 곱한 결과는 자동 형변환을 통해 실수(float)가 되었다.

참고로, #는 주석(annotation)의 시작을 알리는 문자이다. Python이 코드를 해석할 때, #이후의 문자는 모두 무시해 버린다.

리스트(List)

여러 데이터를 리스트(list)로도 정리할 수 있다.

In [ ]:
a = [1, 2, 3, 4, 5] # 리스트 생성
In [ ]:
print(a)  # 리스트의 내용 출력
In [ ]:
len(a)  # 리스트 길이 출력
In [ ]:
a[0]  # 첫 원소에 접근
In [ ]:
a[4] # 다섯 번째 원소에 접근
In [ ]:
a[4] = 99 # 값 대임
In [ ]:
print(a)

원소에 접근할 때는 a[0]처럼한다. []안의 수를 index(색인)라 하며, index는 0부터 시작한다. (Index 0이 첫 번째 원소를 가리킨다).

또 파이썬 List에는 슬라이싱(slicing)이라는 편리한 기법이 준비되어 있다. Slicing을 이용하면 범위를 지정해 원하는 부분 리스트를 얻을 수 있다.

In [ ]:
print(a)
In [ ]:
a[0:2] # index 0부터 2까지 얻기(2번째는 포함되지 않는다.)

List를 slicing하려면 a[0:2]처럼 쓴다. a[0:2]는 index 0부터 1(2보다 하나 앞)까지의 원소를 꺼낸다. Index 번호 -1은 마지막 원소, -2는 끝에서 한 개 앞의 원소에 해당한다.

In [ ]:
a[1:]  # Index 1부터 끝까지 얻기
In [ ]:
a[:3]  # 처음부터 Index 3까지 얻기 (3번째는 포함되지 않는다.)
In [ ]:
a[:-1] # 처음부터 마지막 원소의 1개 앞까지 얻기
In [ ]:
a[:-2] # 처음부터 마지막 원소의 2개 앞까지 얻기
In [ ]:
a[::] # 처음부터 마지막 원소까지. 
In [ ]:
a[::2] # 한칸씩 건너띄면서
In [ ]:
a[::-1]   # 꺼꾸로

empty list에 조건에 맞는 요소들 append하기

In [ ]:
list_name = []
stopwords = ["a", "an", "the",  "of"]
string = "The empty list can be made to store items of interests"
for i in string.split():
    i = i.lower()
    if i not in stopwords: 
        list_name.append(i)
print(list_name)
딕셔너리(Dictionary)

리스트는 Index 번호로 0, 1, 2, ...순으로 값을 저장하는 반면, 딕셔너리(dictionary)는 Key와 Value를 한 쌍으로 저장한다. 즉 영한 사전처럼 단어와 그 의미를 짝지어 저장한다.

In [ ]:
me = {'height': 180}  # 딕셔너리 생성
In [ ]:
me['height']   # Key로 원소에 접근 
In [ ]:
me['weight'] = 70 # 새 원소 추가
In [ ]:
print(me)
bool

파이썬에는 bool(불 혹은 불리언)이라는 자료형이 있다. 이 자료형은 True(참)과 False(거짓)라는 두 값 중 하나를 취한다. 또 bool에는 and, or, not 연산자를 사용할 수 있다.

In [ ]:
hungry = True  # 배가 고프다
sleepy = False # 졸리지 않다
In [ ]:
type(hungry)
In [ ]:
not hungry
In [ ]:
hungry and sleepy # 배가 고프다 그리고 졸리지 않다
In [ ]:
hungry or sleepy # 배가 고프다 또는 졸리지 않다
if 문

조건에 따라서 달리 처리하려면 if/else 문을 사용한다.

In [ ]:
hungry = True
if hungry:
    print("I'm hungry")
In [ ]:
hungry = False
if hungry:
    print("I'm hungry") # 들여쓰기는 공백 문자로
else:
    print("I'm not hungry")
    print("I'm sleepy")

Python에서는 공백 문자가 중요한 의미를 지닌다. 이번 if 문에서도 if hungry: 다음 줄은 앞쪽에 4개의 공백 문자가 있다. 이 들여쓰기(indentation)는 지난 조건 if hungry:가 충족될 때 실행되는 코드를 포함한다.

for 문

반복 (루프) 처리에는 for 문을 사용한다.

In [ ]:
for i in [1, 2, 3]:
    print(i)

여기에서는 [1, 2, 3]이라는 리스트 안의 원소를 하나씩 출력하는 예를 보여줬다. for ... in ...: 구문을 이용하면 리스트 등 데이터의 집합의 각 원소에 차례로 접근할 수 있다.

making nonsense CVC items

In [ ]:
# define vowels and consonants
vowels = 'aiu'
consonants = 'ptk'
for nucleus in vowels:
    for onset in consonants:
        for coda in consonants:
            print(onset, nucleus, coda, sep="")
함수(function)

특정 기능을 수행하는 일련의 명령들을 묶어 하나의 함수(function)로 정의할 수 있다.

In [ ]:
def hello():
    print("Hello World")
In [ ]:
hello()

함수는 인수(arguments)를 취할 수도 있다. 또한 + 연산자를 사용하여 문자열을 이어 붙일 수도 있다.

In [ ]:
def hello(object):
    print("Hello " + object + "!")
    
In [ ]:
hello("cat")
클래스(Class)

지금까지는 int와 str 등의 자료형(data type)을 살펴봤다. 그리고 type() 함수로는 원하는 데이터의 자료형을 알아낼 수 있었다. 이들은 내장된 자료형, 즉 파이썬이 기본으로 제공하는 자료형이다.

이번에는 새로운 클래스를 정의한다. 개발자가 직접 클래스를 정의하면 독자적인 자료형을 만들 수 있다. 또한, 클래스에는 그 클래스 만의 전용 함수(method; 메서드)와 속성을 정의할 수도 있다.

파이썬에서는 class라는 키워드를 사용하여 클래스를 정의한다. 클래스의 구조는 다음과 같다.

class 클래스 이름:
    def __init__(self, 인수, ...):      # 생성자(constructor)
        ...
    def 메서드_이름_1(self, 인수, ...):    # Method 1
        ...
    def 메서드_이름_2(self, 인수, ...):    # Method 2
        ...

클래스 정의에는 __init__라는 특별한 메서드가 있는데, 클래스를 초기화하는 방법을 정의한다. 이 초기화용 메서드를 생성자(constructor) 라고도 하며, 클래스의 인스턴스가 만들어질 때 한번 만 불린다. 또 파이썬에서는 메서드의 첫 번째 인수로 자신(자신의 인스턴스)를 나타내는 self를 명시적으로 쓰는 것이 특징이다. (다른 프로그래밍 언어를 쓰던 사람은 이처럼 self를 쓰는 규칙이 이상하다고 느낄지도 모른다.)

그럼 간단한 클래스를 하나 만들어 보자.

In [ ]:
class Man:
    def __init__(self, name):
        self.name = name
        print("Initialized!")
        
    def hello(self):
        print("Hello " + self.name + "!")
        
    def goodbye(self):
        print("Good-bye " + self.name + "!")

여기에서는 Man이라는 새로운 class를 정의했다.

In [ ]:
m = Man("David")

그리고 Man 클래스에서 m이라는 인스턴스(instance, 객체)를 생성한다. Man의 생성자(초기화 메서드)는 name이라는 인수를 받고, 그 인수로 인스턴스 변수인 self.name을 초기화한다. Instance 변수는 Instance별로 저장되는 변수이다. 파이썬에서는 self.name처럼 self 다음에 속성 이름을 써서 인스턴스 변수를 작성하거나 접근할 수 있다.

In [ ]:
m.hello()
In [ ]:
m.goodbye()

문자열(string) method

Python이 가지고 유용한 methods들을 소개한다.

In [ ]:
s = "the man who passes the sentence should swing the sword." # 왕좌의 게임(Game of thrones)에 나오는 문구
print(s)

대소문자 변경

In [ ]:
s1 = s.capitalize()
s1
In [ ]:
s2 = s1.swapcase()
s2
In [ ]:
s3 = s2.lower()
s3
In [ ]:
s4 = s3.title()
s4
In [ ]:
s5 = s4.upper()
s5

수정

In [ ]:
s = "the man who passes the sentence shouldswing the sword.\n" # 왕좌의 게임(Game of thrones)에 나오는 문구
print(s)
In [ ]:
s1 = s.strip()
print(s1)
In [ ]:
s2 = s.split()
print(s2)
In [ ]:
s3 = ' '.join(s2)
print(s3)
In [ ]:
s4 = '\t'.join(s2)
print(s4)
In [ ]:
s5 = s.strip().split()
print(s5)

module 사용하기

  • module은 하나의 파일에 함수, 클래스, 데이터 등을 모아 놓은 묶음이다.
  • 예를 들어, Python은 수학 시간에 배웠던 sin(), cos(), tan()과 같은 삼각함수, 로그 함수 등을 계산해 주는 함수들을 모아서 math module을 제공한다.

  • 다음 site로 접속해 보면 어떤 module 들이 설치되어 있는 지 확인할 수 있다.

https://docs.python.org/3.7/py-modindex.html

module을 import하는 3가지 방식

  1. import [module]
  2. from [module] import [함수 혹은 클래스]
  3. from [module] import [함수 혹은 클래스] as [별명(alias)] import [module] as [별명]
In [ ]:
import math
math.log(10)
In [ ]:
from math import log, sqrt
log(10)
In [ ]:
from math import log as lg
lg(10)
In [ ]:
import math as m
m.log(10)

References

  • 이지선 (2018). 스타트 업 파이썬. 성안당
  • 처음 시작하는 파이썬 (한빛미디어, 2015)
In [ ]: