국민대, 파이썬, 데이터

W03 Python 101



In [13]:
from IPython.display import Image

NOTE: 이 문서에 사용되는 표(숫자 연산, 비교 연산, 문자열 포맷 변환 문자, 확장 연산, formatter에서 지원하는 타입 코드)는 인사이트 출판사에서 나온 파이썬 완벽 가이드에서 발췌했음을 알려드립니다.


Table of Contents

  1. 변수 (Variable)
  2. 연산자 (Operator)
    1. 숫자 연산
    2. 비교 연산
    3. 확장 연산
    4. 문자열 포맷
      1. + (더하기)
      2. % (나머지 연산자)
      3. format 함수 (치환자, formatter)
  3. 프로그램 제어 흐름 (Control Flow)
    1. 조건문 (Conditionals)
    2. 반복문 (Loops and Iterations)
      1. while
      2. for
      3. enumerate()
  4. 데이터 타입 (Data Type)
    1. 순서열 (Sequence)
      1. 문자열 (String)
      2. List와 Tuple
    2. 매핑 (Mapping)
      1. 사전 (Dictionary)
  5. Practice Makes Perfect

1. 변수 (Variable)

변수(Variable)라는 것은 데이터를 담는 그릇입니다. 그리고 이 데이터를 담는 그릇에는 담겨진 내용물의 유형(type)을 가지고 있습니다. 즉 아래와 같이 세 개로 나눠져 있다고 생각하시면 됩니다.

  • 데이터(data)
  • 데이터의 유형(type)
  • 데이터를 담을 수 있는 그릇(identifier)

말은 어렵지만 아래의 간단한 예제를 보도록 하겠습니다. age라는 그릇(identifier)에 데이터 유형(type)이 정수(int)인 20을 넣은 것 뿐입니다. 자료구조 관점으로 보면 좀 더 복잡하긴 합니다. 20이라는 데이터를 저장하는 곳을 가리킨다고 보면 되지만 거기까지는 다루지 않겠습니다.


In [2]:
age = 20
print(type(age))
print(age)


<class 'int'>
20

위의 예제를 봐서 알겠지만 Python은 변수의 타입을 미리 선언하지 않습니다. 미리 선언하는 언어가 있지요. 하지만 Python은 변수의 타입 선언에 매우 자유롭습니다. 또한 PEP8에 의해 age=20이라고 하지 않고 age = 20이라고 표현한 것을 눈여겨 보시면 좋겠습니다. 처음 공부할 때 부터 바른 습관을 갖는 것도 좋습니다.


2. 연산자 (Operator)


In [8]:
age = 20
print(type(age))
print(age)


<class 'int'>
20

다시 age에 20을 할당 시켰던 문법을 다시 보도록 하겠습니다. 제가 강조해서 말하고 있는 것이바로 '할당하고 있다'라는 표현입니다. 즉 age = 20에서 =은 데이터를 할당하는 연산자라고 합니다.

2.1 숫자 연산


In [15]:
Image(filename='images/number_operator.png')


Out[15]:

In [36]:
print(3 + 4)


7

In [38]:
3 / 4


Out[38]:
0.75

In [37]:
3 // 4


Out[37]:
0

2.2 비교 연산


In [16]:
Image(filename='images/comparison_operator.png')


Out[16]:

In [4]:
1 < 2


Out[4]:
True

In [5]:
1 == 2


Out[5]:
False

In [6]:
"yes" != "no"


Out[6]:
True

2.3 확장 연산


In [66]:
Image(filename='images/extended_operator.png')


Out[66]:

In [70]:
a = 3
b = 2
a += b
print(a)  # a = a + b


5

2.4 문자열 포맷

우리는 위에서 숫자 연산과 비교 연산을 보았습니다. 그렇다면 문자가 연산이 있나요!? 없습니다. 대신에 문자끼리 합치는 것은 있겠죠!? 문자와 문자를 어떻게 합칠까요?

1) + (더하기)


In [29]:
question = "올해는 몇년도 인가요?"
answer = "2016"
print(question + answer + "년 입니다.")


올해는 몇년도 인가요?2016년 입니다.

문자를 합치는 방법 중 가장 쉬운 것은 + 를 사용하는 것입니다.


In [30]:
question = "올해는 몇년도 인가요?"
answer = 2016
print(question + answer + "년 입니다.")


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-30-9f58b1f8966a> in <module>()
      1 question = "올해는 몇년도 인가요?"
      2 answer = 2016
----> 3 print(question + answer + "년 입니다.")

TypeError: Can't convert 'int' object to str implicitly

그러나 + 을 사용하는 방법은 합치는 두 개의 데이터 타입이 같아야만 사용할 수 있습니다. 위에처럼 문자열과 숫자를 합치려고 할 때는 에러가 납니다.

잠깐!

올 해를 자동으로 알 수 있는 방법은 없나요? 잠깐 알아보고 넘어갑시다.


In [63]:
from datetime import datetime
print(str(datetime.today().year) + "년")
print(str(datetime.today().month) + "월")


2016년
3월

위에서 사용한 str()을 변환 함수라고 합니다. 문자열로 바꿔주는 기능이 있습니다.

2) % (나머지 연산자)


In [11]:
print("올해는 몇년도 인가요?")
print("%d년 입니다." % 2016)


올해는 몇년도 인가요?
2016년 입니다.

In [12]:
"%s 년 입니다." % "2016"


Out[12]:
'2016 년 입니다.'

제가 Python을 처음 공부했을 매우 이해가 안가고 당황했던 것이 바로 나머지 연산자를 사용하는 방법이었습니다. 저만 특이한 것일까요!?ㅎㅎ 이렇게 나머지 연산자를 통해 문자열이 합쳐질 때는 아래처럼 표현해야 합니다. 위를 예로 들면 '%d'라고 되어있는 부분이 변환 지정자이며, '년 입니다.'은 보통의 문자가 되는 것입니다.

포맷 문자열 = (보통의 문자 + 변환 지정자)

문자열 포맷 변환 문자


In [31]:
Image(filename='images/formatter.png')


Out[31]:

In [35]:
a = "hello"
b = "world"
print("%0.3s %s" % (a, b))


hel world

좀 복잡한 듯 보이지만 잘 보면 어렵지니 않습니다. %0.3s에서 s는 문자열인 것은 알겠는데 0.3이라는 것은 뭔가 특이하죠!? 문자열에 왠 상수값? 이상합니다. 0.3이 의미하는 바는 문자열 0번번째부터 시작하여 3번째 직전까지 잘라서(slicing) 표시하라는 뜻입니다. 이렇듯 Python은 0부터 시작한다는 것을 다시 한 번 알 수 있습니다.

3) format 함수 (치환자, formatter)


In [64]:
print("올 해는 {0}{1}월 입니다.".format(2016, 3))


올 해는 2016년 3월 입니다.

이건 또 도대체 무엇인가요. 함수에 대해서 공부한 적도 없는데 말이지요. 괜찮습니다. 이런게 있다는 것만 알고 넘어가겠습니다. 이 후에 함수를 배우게 되면 이런게 가능하다는 것을 알게 됩니다. 여기서 0과 1은 format 함수의 Argument 0번째 값과 1번째 값을 의미합니다.

formatter에서 지원하는 타입 코드


In [65]:
Image(filename='images/advanced_formatter.png')


Out[65]:

3. 프로그램 제어 흐름 (Control Flow)

3.1 조건문 (Conditionals)

Python에서의 조건문은 아주 간단합니다. 다른 언어에서처럼 Switch라던가 Case가 없고 if만 있습니다.


In [15]:
a = 3
b = 2

if a < b:
    print("Yes")
    print("a")
else:
    print("No")
    print("b")


No
b

In [74]:
suffix = "htm"

if suffix == "htm":
    content = "text/html"
elif suffix == "jpg":
    content = "image/jpeg"
elif suffix == "png":
    content = "image/png"
else:
    raise RuntimeError("Unknown content type")
print(content)


text/html

3.2 반복문 (Loops and Iteration)

1) while


In [1]:
answer1 = input("Enter password: ")
answer2 = input("Re-enter password: ")

while answer1 != answer2:
    print("does not match.")
    answer1 = input("Enter password: ")
    answer2 = input("Re-enter password: ")


Enter password: 1321
Re-enter password: 123
does not match.
Enter password: 123
Re-enter password: 123

2) for

for 문은 굉장히 중요합니다. 아래와 같이 사용합니다.

for i in s:
    statements

Python은 인간 친화적인 문법이 특징입니다. 여기서도 위의 문법을 인간미있게 읽어보도록 하곘습니다. "s 안에(in) 한 개를 꺼내서 i에 넣고 아래 문장을 실행하고, 아래 문장 실행이 다 끝났으면 다시 s 안에(in) 그 전에 꺼냈던 것 다음의 것을 꺼내어 다시 i에 넣고 아래 문장을 실행한다." s 안에서 한 개를 꺼낸다? 이게 무슨 말인지 아래를 보도록 하겠습니다.


In [5]:
for item in range(0, 4):
    print(item)


0
1
2
3

range()라는 함수는 0부터 4전까지 연속된 숫자를 만들어 List라는 타입으로 값을 반환해주는 함수입니다. 0부터 4전까지이므로 0, 1, 2, 3 이렇게 숫자 4개를 List라는 객체에 담아 표현해줍니다. 즉 for 반복문이 range(4) 함수를 통해 만들어진 값 안에서(in) 첫번째 값 0을 끄집어 내 item에 할당하고 아래 문장을 실행하는 것입니다. 이 후 두번째 값 1을 끄집어 내 item에 할당하고 다시 아래 문장을 실행하는 것입니다.

여기서 item라는 것은 변수입니다. 따라서 어떤 이름도 넣을 수 있습니다.

3) enumerate()

하아.. 이건 뭘까요?! 먹는건가요?ㅠ


In [91]:
s = "statement"
for i, x in enumerate(s):
    print(i, x)


0 s
1 t
2 a
3 t
4 e
5 m
6 e
7 n
8 t

Python은 몇 가지 내장 함수를 가지고 있습니다. 그 중에 enumerate()라는 함수는 어떤 객체의 인덱스 번호와 인덱스 번호에 해당하는 값까지 모두 반환해주는 역할을 합니다. 유용하게 쓰이니 잘 기억해 두시길 바랍니다.


4. 데이터 타입(Data Type)


In [8]:
age = 20
print(type(age))
print(age)


<class 'int'>
20

위에 age라는 변수에 할당된 값은 숫자 20입니다. 즉 20이라는 데이타의 타입은 정수 integer입니다. 그렇다면 Python에서의 데이터 타입에는 어떤 것들이 있을까요!?


In [14]:
Image(filename='images/data_type.png')


Out[14]:

숫자는 위에 나와있는 것만으로도 충분합니다. 뭔가 생소한 순서열부터 보도록 하겠습니다.

4.1 순서열 (Sequence)

순서열 이라는 것은 정수로 색인되어 순서있는 객체들의 모음을 말합니다.

1) 문자열 (String)

"python"이라는 단어를 우리가 볼 때는 그저 단순한 문자처럼 보이지만 Python은 "python"을 순서있는 객체들의 모음으로 인식합니다. 즉 글자 'p', 'y', 't', 'h', 'o', 'n' 하나 하나가 순서있게 모인 것이라고 생각하면 됩니다.


In [97]:
for char in "python":
    print(char)


p
y
t
h
o
n

In [100]:
for idx, char in enumerate("python"):
    print(idx, char)


0 p
1 y
2 t
3 h
4 o
5 n

Index 번호로 순서가 매겨져 있는 객체들의 모음이기 때문에 객체 하나 하나를 꺼내어 출력이 가능한 것입니다. Index 번호를 위와 같이 확인할 수 있습니다. 그렇다면 숫자는 어떨까요? 숫자도 순서가 매겨져 있는 객체들의 모음일까요?


In [101]:
for idx, char in enumerate(12345):
    print(idx, char)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-101-628e3d7c0b73> in <module>()
----> 1 for idx, char in enumerate(12345):
      2     print(idx, char)

TypeError: 'int' object is not iterable

아니네요. not iterable하다고 에러 메시지가 나옵니다.

메서드

메서드 설명
s.startswith(prefix) 문자열이 prefix로 시작하는지 검사
s.endswith(suffix) 문자열이 suffix로 끝나는지 검사
s.format(*args, **kwargs) s의 포맷을 지정한다.
s.join(t) s를 분리자로 사용해서 순서열 t에 들어있는 문자열들을 이어 붙인다.
s.replace(old, new, [,maxreplace]) 부분문자열을 대체한다.
s.split([sep]) sep를 구분자로 사용해서 문자열을 분할
s.strip([chars]) 앞이나 뒤에 나오는 공백이나 chars로 지정된 문자들을 제거

Python의 모든 것은 객체라고 했습니다. 이것은 Python을 이해하는데 있어 매우 중요합니다. 문자열도 마찬가지로 객체이기 때문에 위와 같이 사용할 수 있는 메서드(함수)가 있습니다. 다음 시간에 객체 지향 언어에 대해 자세히 살펴보도록 하겠습니다. 우선 위와 같은 메서드(함수)가 있다는 것을 확인하시기 바랍니다.


In [106]:
university = "kookmin"

In [107]:
university.startswith("k")


Out[107]:
True

In [108]:
university.endswith("e")


Out[108]:
False

In [115]:
".".join(university)


Out[115]:
'k.o.o.k.m.i.n'

In [122]:
universities = "kookmin yonse seoul"
print(universities.split())

universities = "kookmin-yonse-seoul"
print(universities.split("-"))


['kookmin', 'yonse', 'seoul']
['kookmin', 'yonse', 'seoul']

In [15]:
university = "kookmik"
print("  kookmin     university".strip())
print(university.strip("k"))


kookmin     university
ookmi

Data Structure

2) List와 Tuple

데이터 타입 중 List와 Tuple이라고 하는 것이 있습니다. 이 두개는 추가/수정/삭제가 되느냐 안되느냐와 모양새가 조금 다를 뿐 거의 비슷한 객체입니다.

List

  • 추가/수정/삭제 가능
  • ex) obj = [1, 2, 3,]

In [20]:
obj = [
    1,
    2,
    3,  # trailing comma
]
print(obj)


[1, 2, 3]
메서드 설명
list(s) s를 리스트로 변환
s.append(x) s의 끝에 새로운 원소 x를 추가
s.extend(t) s의 끝에 새로운 리스트 t를 추가
s.count(x) s에서 x가 출현한 횟수를 셈
s.insert(i, x) 색인 i의 위치에 x를 삽입
s.pop([i]) 리스트에서 원소 i를 제거하면서 i를 반환, i를 생략하면 마지막 원소가 제거되면서 반환
s.remove(x) x를 찾아서 s에서 제거
s.reverse() s의 항목들을 그 자리에서 뒤집음

In [22]:
cities = ['Seoul', 'Tokyo', 'New York',]
cities


Out[22]:
['Seoul', 'Tokyo', 'New York']

In [154]:
cities.append('Busan')
cities


Out[154]:
['Seoul', 'Tokyo', 'New York', 'Busan']

In [155]:
cities.extend(['London'])
cities


Out[155]:
['Seoul', 'Tokyo', 'New York', 'Busan', 'London']

In [156]:
cities.remove('Tokyo')
cities


Out[156]:
['Seoul', 'New York', 'Busan', 'London']

In [157]:
cities.append(['Daejeon', 'Yokohama'])
cities


Out[157]:
['Seoul', 'New York', 'Busan', 'London', ['Daejeon', 'Yokohama']]

In [24]:
cities.append(123)

In [28]:
cities.append(["123", "123", ["333", ],])

In [29]:
cities


Out[29]:
['Seoul', 'Tokyo', 'New York', 123, ['123', '123'], ['123', '123', ['333']]]

Tuple

  • 추가/수정/삭제 불가능
  • ex) obj = (1, 2, 3,)

In [104]:
obj = (1, 2, 3,)
print(obj)


(1, 2, 3)

왜 추가/수정/삭제를 불가능하게 했을까요?

떄론 데이터를 수정하면 안되는 것들이 있습니다. 그럴 때는 데이터가 수정되는 것을 방지하기 위해 Tuple로 데이터 수정 가능성을 원천 차단하는 것입니다.

4.2 매핑 (Mapping)

1) 사전 (Dictionary)

{key1: value1, key2: value2, .... }의 형태로 짝지어진 객체들의 모음입니다. 매우 유용하게, 그리고 자주 사용하니 꼭 익혀두시기 바랍니다. 후에 데이터를 가져오는 작업을 할 때 JSON이라는 형태로 많이 가져오는데 JSON이 Python의 Dictionary와 똑같이 생겼습니다.


In [30]:
final_exam = {
    "math": 100,
    "English": 90,
}

In [31]:
print(final_exam)


{'math': 100, 'English': 90}
항목 설명
m.clear() m에서 모든 항목 제거
m.copy() 복사본 생성
m.get(k [,v]) m[k]가 있으면 m[k]를 반환하고 아니면 v를 반환
m.items() m의 모든 (키, 값) 쌍들로 구성되는 순서열 반환
m.keys() m의 모든 키들의 순서열 바환
m.values() m에 있는 모든 값으로 구성되는 순서열 반환

In [160]:
final_exam.get("math")


Out[160]:
100

In [44]:
singer = {
    "Talyor Swift": {
                    "album": {
                            "1st_album": ['a1', 'b1', 'c1', ],
                            "2nd_album": ['a2', 'b2', 'c2', ],
                             },
                    "age": 123,
                    },
}

In [43]:
singer['Talyor Swift']['album']['1st_album']


Out[43]:
['a1', 'b1', 'c1']

In [45]:
singer['Talyor Swift']['age']


Out[45]:
123

In [34]:
print(singer)


{'2nd_album': ['a2', 'b2', 'c2'], 'name': 'Talyor Swift', '1st_album': ['a1', 'b1', 'c1']}

In [164]:
print(singer.get("2nd_album"))


['a2', 'b2', 'c2']

5. Practice Makes Perfect

5.1 띠

Year(ex) Animal Remain
2000 8
2001 9
2002 10
2003 11
2004 원숭이 0
2005 1
2006 2
2007 돼지 3
2008 4
2009 5
2010 호랑이 6
2011 토끼 7

위에 표에 나와있는 값을 이용해서 사용자가 입력한 년도에 해당되는 띠를 알려주세요. 사용자가 어떤 값을 입력해도 말이지요.


In [46]:
# Write your code below
year = input("년도를 입력하세요: ")


년도를 입력하세요: 2016

In [53]:
year = int(year)

In [54]:
if year % 12 == 0:
    print("원숭이")
elif year % 12 == 1:
    print("닭")


원숭이

5.2 Hashtag

요새는 Hashtag(#으로 시작되는 단어)를 소셜 미디어에 많이 사용하죠? 이거를 어떻게 추출할까요? 추출해서 List에 담아보세요.


In [59]:
# 게시글 제목
title = "On top of the world! Life is so fantastic if you just let it. \
I have never been happier. #nyc #newyork #vacation #traveling"

print(title)

# Write your code below.


On top of the world! Life is so fantastic if you just let it. I have never been happier. #nyc #newyork #vacation #traveling

5.3 Morse

모스 부호라는 것을 다들 알고 계실거라 생각합니다. 모스 부호를 사전형태로 가져왔는데요. 이 정보를 통해 암호를 풀어보도록 합시다.


In [60]:
# 모스부호
dic = {
    '.-':'A','-...':'B','-.-.':'C','-..':'D','.':'E','..-.':'F',
    '--.':'G','....':'H','..':'I','.---':'J','-.-':'K','.-..':'L',
    '--':'M','-.':'N','---':'O','.--.':'P','--.-':'Q','.-.':'R',
    '...':'S','-':'T','..-':'U','...-':'V','.--':'W','-..-':'X',
    '-.--':'Y','--..':'Z'
}
 
# 풀어야할 암호
code = '.... .  ... .-.. . . .--. ...  . .- .-. .-.. -.--'

# Write your code below.

5.4 카드 52장

카드가 총 52장이 있습니다. 스페이드, 하트, 다이아몬드, 클럽 이렇게 총 4가지 종류가 있고 각자 숫자 2부터 10까지 그리고 Jack, Queen, King, Ace가 있습니다. 즉 모든 카드는 아래처럼 두 개의 글자로 표현할 수 있습니다.

카드 약자
스페이드 잭 sJ
클럽 2 c2
다이아몬드 10 d10
하트 에이스 hA
스페이드 9 s9

위와 같이 두 개의 글자로 구성되게 52장의 카드를 만들어 하나의 List에 담아보세요.


In [174]:
# Write your code below.