In [13]:
from IPython.display import Image
NOTE: 이 문서에 사용되는 표(숫자 연산, 비교 연산, 문자열 포맷 변환 문자, 확장 연산, formatter에서 지원하는 타입 코드)는 인사이트 출판사에서 나온 파이썬 완벽 가이드에서 발췌했음을 알려드립니다.
+
(더하기)%
(나머지 연산자)변수(Variable)라는 것은 데이터를 담는 그릇입니다. 그리고 이 데이터를 담는 그릇에는 담겨진 내용물의 유형(type)을 가지고 있습니다. 즉 아래와 같이 세 개로 나눠져 있다고 생각하시면 됩니다.
말은 어렵지만 아래의 간단한 예제를 보도록 하겠습니다. age라는 그릇(identifier)에 데이터 유형(type)이 정수(int)인 20을 넣은 것 뿐입니다. 자료구조 관점으로 보면 좀 더 복잡하긴 합니다. 20이라는 데이터를 저장하는 곳을 가리킨다고 보면 되지만 거기까지는 다루지 않겠습니다.
In [2]:
age = 20
print(type(age))
print(age)
위의 예제를 봐서 알겠지만 Python은 변수의 타입을 미리 선언하지 않습니다. 미리 선언하는 언어가 있지요. 하지만 Python은 변수의 타입 선언에 매우 자유롭습니다. 또한 PEP8에 의해 age=20
이라고 하지 않고 age = 20
이라고 표현한 것을 눈여겨 보시면 좋겠습니다. 처음 공부할 때 부터 바른 습관을 갖는 것도 좋습니다.
In [8]:
age = 20
print(type(age))
print(age)
다시 age에 20을 할당 시켰던 문법을 다시 보도록 하겠습니다. 제가 강조해서 말하고 있는 것이바로 '할당하고 있다'라는 표현입니다. 즉 age = 20
에서 =
은 데이터를 할당하는 연산자라고 합니다.
In [15]:
Image(filename='images/number_operator.png')
Out[15]:
In [36]:
print(3 + 4)
In [38]:
3 / 4
Out[38]:
In [37]:
3 // 4
Out[37]:
In [16]:
Image(filename='images/comparison_operator.png')
Out[16]:
In [4]:
1 < 2
Out[4]:
In [5]:
1 == 2
Out[5]:
In [6]:
"yes" != "no"
Out[6]:
In [66]:
Image(filename='images/extended_operator.png')
Out[66]:
In [70]:
a = 3
b = 2
a += b
print(a) # a = a + b
우리는 위에서 숫자 연산과 비교 연산을 보았습니다. 그렇다면 문자가 연산이 있나요!? 없습니다. 대신에 문자끼리 합치는 것은 있겠죠!? 문자와 문자를 어떻게 합칠까요?
In [29]:
question = "올해는 몇년도 인가요?"
answer = "2016"
print(question + answer + "년 입니다.")
문자를 합치는 방법 중 가장 쉬운 것은 +
를 사용하는 것입니다.
In [30]:
question = "올해는 몇년도 인가요?"
answer = 2016
print(question + answer + "년 입니다.")
그러나 +
을 사용하는 방법은 합치는 두 개의 데이터 타입이 같아야만 사용할 수 있습니다. 위에처럼 문자열과 숫자를 합치려고 할 때는 에러가 납니다.
잠깐!
올 해를 자동으로 알 수 있는 방법은 없나요? 잠깐 알아보고 넘어갑시다.
In [63]:
from datetime import datetime
print(str(datetime.today().year) + "년")
print(str(datetime.today().month) + "월")
위에서 사용한 str()
을 변환 함수라고 합니다. 문자열로 바꿔주는 기능이 있습니다.
In [11]:
print("올해는 몇년도 인가요?")
print("%d년 입니다." % 2016)
In [12]:
"%s 년 입니다." % "2016"
Out[12]:
제가 Python을 처음 공부했을 매우 이해가 안가고 당황했던 것이 바로 나머지 연산자를 사용하는 방법이었습니다. 저만 특이한 것일까요!?ㅎㅎ 이렇게 나머지 연산자를 통해 문자열이 합쳐질 때는 아래처럼 표현해야 합니다. 위를 예로 들면 '%d'
라고 되어있는 부분이 변환 지정자이며, '년 입니다.'
은 보통의 문자가 되는 것입니다.
포맷 문자열 = (보통의 문자 + 변환 지정자)
In [31]:
Image(filename='images/formatter.png')
Out[31]:
In [35]:
a = "hello"
b = "world"
print("%0.3s %s" % (a, b))
좀 복잡한 듯 보이지만 잘 보면 어렵지니 않습니다. %0.3s
에서 s는 문자열인 것은 알겠는데 0.3
이라는 것은 뭔가 특이하죠!? 문자열에 왠 상수값? 이상합니다. 0.3
이 의미하는 바는 문자열 0번번째부터 시작하여 3번째 직전까지 잘라서(slicing) 표시하라는 뜻입니다. 이렇듯 Python은 0부터 시작한다는 것을 다시 한 번 알 수 있습니다.
In [64]:
print("올 해는 {0}년 {1}월 입니다.".format(2016, 3))
이건 또 도대체 무엇인가요. 함수에 대해서 공부한 적도 없는데 말이지요. 괜찮습니다. 이런게 있다는 것만 알고 넘어가겠습니다. 이 후에 함수를 배우게 되면 이런게 가능하다는 것을 알게 됩니다. 여기서 0과 1은 format 함수의 Argument 0번째 값과 1번째 값을 의미합니다.
In [65]:
Image(filename='images/advanced_formatter.png')
Out[65]:
Python에서의 조건문은 아주 간단합니다. 다른 언어에서처럼 Switch라던가 Case가 없고 if만 있습니다.
In [15]:
a = 3
b = 2
if a < b:
print("Yes")
print("a")
else:
print("No")
print("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)
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: ")
for 문은 굉장히 중요합니다. 아래와 같이 사용합니다.
for i in s:
statements
Python은 인간 친화적인 문법이 특징입니다. 여기서도 위의 문법을 인간미있게 읽어보도록 하곘습니다. "s 안에(in) 한 개를 꺼내서 i에 넣고 아래 문장을 실행하고, 아래 문장 실행이 다 끝났으면 다시 s 안에(in) 그 전에 꺼냈던 것 다음의 것을 꺼내어 다시 i에 넣고 아래 문장을 실행한다." s 안에서 한 개를 꺼낸다? 이게 무슨 말인지 아래를 보도록 하겠습니다.
In [5]:
for item in range(0, 4):
print(item)
range()라는 함수는 0부터 4전까지 연속된 숫자를 만들어 List라는 타입으로 값을 반환해주는 함수입니다. 0부터 4전까지이므로 0, 1, 2, 3
이렇게 숫자 4개를 List라는 객체에 담아 표현해줍니다. 즉 for 반복문이 range(4) 함수를 통해 만들어진 값 안에서(in) 첫번째 값 0을 끄집어 내 item에 할당하고 아래 문장을 실행하는 것입니다. 이 후 두번째 값 1을 끄집어 내 item에 할당하고 다시 아래 문장을 실행하는 것입니다.
여기서 item라는 것은 변수입니다. 따라서 어떤 이름도 넣을 수 있습니다.
하아.. 이건 뭘까요?! 먹는건가요?ㅠ
In [91]:
s = "statement"
for i, x in enumerate(s):
print(i, x)
Python은 몇 가지 내장 함수를 가지고 있습니다. 그 중에 enumerate()라는 함수는 어떤 객체의 인덱스 번호와 인덱스 번호에 해당하는 값까지 모두 반환해주는 역할을 합니다. 유용하게 쓰이니 잘 기억해 두시길 바랍니다.
In [8]:
age = 20
print(type(age))
print(age)
위에 age라는 변수에 할당된 값은 숫자 20입니다. 즉 20이라는 데이타의 타입은 정수 integer입니다. 그렇다면 Python에서의 데이터 타입에는 어떤 것들이 있을까요!?
In [14]:
Image(filename='images/data_type.png')
Out[14]:
숫자는 위에 나와있는 것만으로도 충분합니다. 뭔가 생소한 순서열부터 보도록 하겠습니다.
순서열 이라는 것은 정수로 색인되어 순서있는 객체들의 모음을 말합니다.
"python"이라는 단어를 우리가 볼 때는 그저 단순한 문자처럼 보이지만 Python은 "python"을 순서있는 객체들의 모음으로 인식합니다. 즉 글자 'p', 'y', 't', 'h', 'o', 'n' 하나 하나가 순서있게 모인 것이라고 생각하면 됩니다.
In [97]:
for char in "python":
print(char)
In [100]:
for idx, char in enumerate("python"):
print(idx, char)
Index 번호로 순서가 매겨져 있는 객체들의 모음이기 때문에 객체 하나 하나를 꺼내어 출력이 가능한 것입니다. Index 번호를 위와 같이 확인할 수 있습니다. 그렇다면 숫자는 어떨까요? 숫자도 순서가 매겨져 있는 객체들의 모음일까요?
In [101]:
for idx, char in enumerate(12345):
print(idx, char)
아니네요. 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]:
In [108]:
university.endswith("e")
Out[108]:
In [115]:
".".join(university)
Out[115]:
In [122]:
universities = "kookmin yonse seoul"
print(universities.split())
universities = "kookmin-yonse-seoul"
print(universities.split("-"))
In [15]:
university = "kookmik"
print(" kookmin university".strip())
print(university.strip("k"))
데이터 타입 중 List와 Tuple이라고 하는 것이 있습니다. 이 두개는 추가/수정/삭제가 되느냐 안되느냐와 모양새가 조금 다를 뿐 거의 비슷한 객체입니다.
In [20]:
obj = [
1,
2,
3, # trailing comma
]
print(obj)
메서드 | 설명 |
---|---|
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]:
In [154]:
cities.append('Busan')
cities
Out[154]:
In [155]:
cities.extend(['London'])
cities
Out[155]:
In [156]:
cities.remove('Tokyo')
cities
Out[156]:
In [157]:
cities.append(['Daejeon', 'Yokohama'])
cities
Out[157]:
In [24]:
cities.append(123)
In [28]:
cities.append(["123", "123", ["333", ],])
In [29]:
cities
Out[29]:
In [104]:
obj = (1, 2, 3,)
print(obj)
왜 추가/수정/삭제를 불가능하게 했을까요?
떄론 데이터를 수정하면 안되는 것들이 있습니다. 그럴 때는 데이터가 수정되는 것을 방지하기 위해 Tuple로 데이터 수정 가능성을 원천 차단하는 것입니다.
{key1: value1, key2: value2, .... }의 형태로 짝지어진 객체들의 모음입니다. 매우 유용하게, 그리고 자주 사용하니 꼭 익혀두시기 바랍니다. 후에 데이터를 가져오는 작업을 할 때 JSON이라는 형태로 많이 가져오는데 JSON이 Python의 Dictionary와 똑같이 생겼습니다.
In [30]:
final_exam = {
"math": 100,
"English": 90,
}
In [31]:
print(final_exam)
항목 | 설명 |
---|---|
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]:
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]:
In [45]:
singer['Talyor Swift']['age']
Out[45]:
In [34]:
print(singer)
In [164]:
print(singer.get("2nd_album"))
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("년도를 입력하세요: ")
In [53]:
year = int(year)
In [54]:
if year % 12 == 0:
print("원숭이")
elif year % 12 == 1:
print("닭")
요새는 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.
모스 부호라는 것을 다들 알고 계실거라 생각합니다. 모스 부호를 사전형태로 가져왔는데요. 이 정보를 통해 암호를 풀어보도록 합시다.
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.
카드가 총 52장이 있습니다. 스페이드, 하트, 다이아몬드, 클럽 이렇게 총 4가지 종류가 있고 각자 숫자 2부터 10까지 그리고 Jack, Queen, King, Ace가 있습니다. 즉 모든 카드는 아래처럼 두 개의 글자로 표현할 수 있습니다.
카드 | 약자 |
---|---|
스페이드 잭 | sJ |
클럽 2 | c2 |
다이아몬드 10 | d10 |
하트 에이스 | hA |
스페이드 9 | s9 |
위와 같이 두 개의 글자로 구성되게 52장의 카드를 만들어 하나의 List에 담아보세요.
In [174]:
# Write your code below.