Chapter5

중고등학생을 위한 머신러닝

Chapter 5: 프로그래밍의 시작 for , if ,while

이전까지 집합과 출력, List를 배웠어요. 집합과 List의 필요를 간단히 이야기하고 for,if,while로 넘어가볼게요.

In [1]:
a= range(1,101) ; b=range(51,151); c=range(101,201);
d=a+b+c
len(d)
Out[1]:
300
d는 리스트이기 때문에 100+100+100개의 원소를 갖고 있죠. 그러나 우리에게 여기안에 있는 데이터가 무엇무엇이 필요한 지 알고 싶다면 어떻게 해야 할까요? 정답은 집합이에요.
In [2]:
setd=set(d)
len(setd)
Out[2]:
200
In [3]:
print d[0]
print d[-1]
1
200
우리는 1~100,51~150,101~200의 데이터를 생성했지만 그 데이터간에는 겹치는(리스트간의 교집합) 데이터가 있을 수밖에 없고, 실질적으로 d에 어떤 데이터가 있는 지 알고싶다면 집합을 이용해야 하는거죠. 반면, 우리가 모은 데이터 중에서 무엇이 몇 개씩 있는 지 알고싶다면, 집합 대신 리스트를 이용해야 하죠. 이제 그 차이를 알겠죠?!

for : ~엔,If : ~면, while : ~동안

이 용법들을 사람이 이해하기 쉬우면 영어로 대입해서 생각하면 좋아요. 먼저 for부터 시작하죠.

for문

In [4]:
for i in range(1,11):
    print i
1
2
3
4
5
6
7
8
9
10
위의 문장을 해석해볼게요. range(1,11): [1,2,3,4,5,6,7,8,9,10]의 원소안에(in) 있는 i엔 print i를 하라는 말이에요. 여기서 :은 조건식, 그리고 : 이후는 실행하라는 선언문이에요.
In [5]:
for x in range(1,11):
    print x
1
2
3
4
5
6
7
8
9
10
여기서 i,x는 그냥 사용자 편의에 의해서 설정하는 불러오는 이름이고, 그 i나 x값들은 range(1,11)안에있는(in) 값들인거죠.
In [6]:
num=0
for i in range(1,11):
    num=num+1
print num
10
위의 경우에는 i엔 num=num+1을 하라는거죠. 그럼 어떻게 10번이 더해지는 걸까요? 왜냐하면 [1,2,3,4,5,6,7,8,9,10]의 안에있는(in) 모든 원소들을 하나하나씩 불러와 실행을 하기 때문이죠.
In [7]:
num=0
for i in range(1,11):
    num+=1
print num
10
num+=1 은 정확히 num = num +1이라는 같은 말이에요
In [8]:
l=[]
for i in range(1,11):
    l.append(2*i)
print l
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

Q1: range(1,11)과 for문을 이용하여 3의 배수들을 생성해보세요.

In [ ]:
 

If문 : else:(아니면), elif:(아니고 ~면)

In [9]:
num = 5
if num >=5:
    print "yes"
else: print "no"
yes
In [10]:
num = 4
if num>=5:
    print "yes"
else: print "no"
no

num이 5에요 근데 문장은 5보다 크거나 같으면 "yes"를 출력하라 였으니, "yes"의 결과를 낳은거죠. 반대로 4면 no가 출력이 되는거죠

In [11]:
num = 5
if num >=5:
print "yes"
else: print "no"
  File "<ipython-input-11-6e10dccbe616>", line 3
    print "yes"
        ^
IndentationError: expected an indented block

파이썬은 공간을 인식해요. 조건식과 문장이 같은 위치에 있으면 같은 식으로 여겨 동시에 실행하려고 한다고 이해하면 돼요. 그런데 for,if,while은 조건식이 맞는 지 먼저 확인한 후 실행하고 싶은 문장들을 실행하기 때문에 조건식 뒤에 있어야 하는거죠

In [12]:
for i in range(1,11):
    if i>=5:
        print "yes"
    else: print "no"
no
no
no
no
yes
yes
yes
yes
yes
yes

위에 있는 두 개를 결합하면 이런식이겠죠? 문장을 실행하는 선언문은 print "yes"와 print "no"밖에 없다는 것을 먼저 확인해볼게요. :뒤에 있는 문장이니깐요?! 그럼 구조를 분석해볼게요. range(1,11) 안에있는(in) i엔 뒤의 문장을 실행하라고 했어요. 근데, 뒤의 문장엔 i가 5보다 크거나 같으면 'yes'아니면 'no'라고 했으니 i가 1,2,3,4일 때는 no를 5보다 크거나 같은 값들은 'yes'를 출력하게 되는거죠

In [13]:
for i in [2,5,6,1,7,2,8,9,0]:
    if i>=5:
        print "yes"
    else: print "no"
no
yes
yes
no
yes
no
yes
yes
no
In [14]:
for i in [2,5,6,1,7,2,8,9,5]:
    if i>=6:
        print "it is bigger than 5"
    elif i<=4: print "smaller than 5"
    else: print "i must be 5"
smaller than 5
i must be 5
it is bigger than 5
smaller than 5
it is bigger than 5
smaller than 5
it is bigger than 5
it is bigger than 5
i must be 5

elif는 else if의 준말이에요. 위 문장을 결과값을 비교하면서 해석하고자 하면, 실력이 껑충 늘거에요!

In [15]:
for i in [2,5,6,1,7,2,8,9,5]:
    if i>=6:
        print "it is bigger than 5"
    elif i>=8: print "bigger than 8"
    else: print "smaller than 5"
smaller than 5
smaller than 5
it is bigger than 5
smaller than 5
it is bigger than 5
smaller than 5
it is bigger than 5
it is bigger than 5
smaller than 5
어라? 이 경우에는 어떻게 된걸까요? 분명히 8보다 크면 8보다 크다라고 말하라고 했는데 왜 5보다 크다고 이야기하는 걸까요? 그 이유는 컴퓨터 입장에서 생각해보면 쉬워요. 우리가 문장을 위에서 아래로 읽는 것처럼 컴퓨터도 그러한데, 6보다 크거나 같으면 5보다 크다라고 말하라고 했으니 위에서부터 걸리게 되는거죠.

Q2: 위의 문장을 8보다 크다라고 출력할 수 있게끔 바꾸어 보세요

In [ ]:
 

while문

while은 ~하는 동안이잖아요? 마찬가지에요. 어느 경우에 쓰는 지 한번 살펴볼까요?
In [16]:
num = 0
while num <5:
    print "smaller than 5"
    num+=1
smaller than 5
smaller than 5
smaller than 5
smaller than 5
smaller than 5

쉽게 해석하자면, num이 5보다 작은 동안 5보다 작다고 말해달라는 문장인거죠.

while과 if와 섞게 되면 이런식으로 할 수도 있죠

In [17]:
x=1
num=0
while x==1:
    print "okay"
    num+=1
    if num ==5:
        break
okay
okay
okay
okay
okay

x는 문장에서 변화시켜줄 요인이 전혀없기 때문에 항상 1일거에요.(만약 if문장이 없었다면 이런 문장은 무한번 실행되는 무한루프가 돼요! 절대로 실행하지 마세요...ㄷㄷ). 문장이 돌아가는 동안 num을 1씩 더하라고 했는데, 만약 5와 같으면 break(쉬다,끝내다): 문장을 끝내라는거죠.

In [18]:
x=1
num=0
while x==1:
    num+=1
    if num ==5:
        continue
    elif num ==10:
        print "okay"
        break
    else: print "okay"
okay
okay
okay
okay
okay
okay
okay
okay
okay

아까처럼 했으면 okay가 10번 실행되었어야 했는데, continue때문에 9번으로 준것을 볼 수 있어요. continue(계속하다)라는 말이죠? 5일때 아무것도 안 한 후 "계속해!"라고 했으니 1번은 'okay'를 출력 안 하게 되는거죠.

그럼 데이터를 분류하는 작업을 해볼까요? (빅데이터시대니??....)

In [19]:
import random
data=[]
for i in range(1000):
    data.append(random.randint(1,100))
%여기서 random.randint(1,100)이라는 함수는 1에서 100까지의 수중 아무 수나 추출하라는 말이에요. 이 데이터는 1에서부터 100까지 수가 몇 개씩 있는 데이터죠.(랜덤 데이터이니 실행할 때마다 바뀌어요) 근데 우리가 50보다 큰 List와 작은 List로 나누고 싶다면 어떻게 해야 할까요? 이럴 때 사용해야 하는 구조가 프로그래밍이에요.
In [20]:
les50 =[]
lar50 =[]

for i in data:
    if i>=50:
        lar50.append(i)
    elif i<50:
        les50.append(i)
len(les50)+len(lar50)==len(data)
print set(les50)
print set(lar50)
set([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])
set([50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100])
만약 수가 적은 데이터면 우리가 일일이 분류할 수 있게지만, 빅데이터시대에 관심있는 데이터를 분류해야 하는 작업이 많은데 이럴 때 사용해야 하는 것이 프로그래밍 작업인거죠. 나중에 이렇게 분류된 데이터를 통해 시각화하여 데이터의 히스토그램이나 분포를 쉽게 볼 수 있고, 데이터 간의 관계성까지 찾아갈 수 있는거죠.
In [21]:
%%html
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Black_cherry_tree_histogram.svg/220px-Black_cherry_tree_histogram.svg.png" height=200 width=300><img src="http://www.idlcoyote.com/cg_tips/scatter2d_1.png" height="300" width="400">
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Black_cherry_tree_histogram.svg/220px-Black_cherry_tree_histogram.svg.png" height=200 width=300>

Q3: range(1,101)에서 짝수와 홀수를 List로 각각 나누어 볼까요?? 이 문제는 생각 많이 해보고 푸세요!

In [ ]:
 
프로그래밍 같은 경우 문제들도 많으니 아래 사이트에서 문제들을 풀어가며 프로그래밍 실력을 늘려봐요! 오른쪽 마우스 새 탭으로 해서 들어가세요^^
In [22]:
%%html
<a href="http://euler.synap.co.kr/">오일러 프로젝트</a>&
<a href="http://codingdojang.com/">코딩도장</a>

답안지

In [ ]:
#Q1:
a=[]
for i in range(1,11):
    a.append(3*i)
#Q2:
for i in [2,5,6,1,7,2,8,9,5]:
    if i>=8:
        print "bigger than 8"
    elif i>=6: print "it is bigger than 5"
    else: print "smaller than 5"
#Q3:
odd=[]
even=[]
for i in range(1,101):
    if i%2==0:
        even.append(i)
    else: odd.append(i)

good

In [ ]: