본문 바로가기

Programming Language/Python

파이썬_기초단계 알아보기_ep.3 만나려면 조건이 맞아야지

320x100
ep.3 파이썬의 다양한 제어문

Python을 마스터하기 위한 3번째 계단
고지가 얼마 남지 않았습니다.
파이썬의 if, for, while문을 통해 제어문을 학습합니다.

 

인생의 많은 부분은 선택에 달려있습니다. 

 

"오늘 아침에 일찍 일어날까, 늦게 일어날까"와 같은 일상적인 선택부터

"시험 점수를 몇 점 이상 맞아야 좋을까", "어떤 배우자를 찾아야 할까"

"내가 살 집은 어떤 것이 좋을까"," 자식은 어떻게 공부시켜야 할까"

와 같은 중요한 선택들까지 말입니다.

 

 

그리고 우리의 선택들은 어떠한 조건에 따라 달라집니다.

 

"몇 시에는 일어나야 일찍 갈수 있을까, 7시?"

"시험은 90점 이상은 넘고, 95점 이하 정도면 좋지 않을까?"

"배우자는 키는 170 이상은 되야하고, 그래도 차는 1대 있어야 되지 않을까?"

"내가 살 집의 평수는 40평 쯤은 되야겠고, 침대도 있어햐 하지 않나?"

"자식은 무조건 서울권 안에 있는 대학은 보내야하지 않을까?"

등등 일정한 조건을 걸어주면 선택이 더 수월해집니다.

 

 

인생의 중요한 선택에 있어서 정답이 있을까요?

 

 

어떠한 선택을 하든 여러분의 인생은 정답일 것입니다.

그것의 옳음은 여러분의 삶이 증명하는 것입니다.

 

 

하지만 컴퓨터의 경우, 옳고 그른 것은 무조건 결정해주어야 합니다^^

컴퓨터는 조건에 따라 맞는 것은 맞고, 틀린 것은 무조건 틀리다고 하는

단순한 사고밖에 할 줄 모르기 때문이죠.

 

 

이러한 제어문을 설정해 주는 것이 if와 for, while 문 입니다.

 

5장 제어문

5.1 조건에 따라 분기하는 if문

 

1) 단일 조건에 따른 분기(if)

형식은?

 

if<조건문> :
   <코드 블록>

If는 뒤에 서술하는 조건으로 인해, 일치할 경우 하단의 데이터를 반환하는 조건문 입니다.

 

파이썬에서는 콜론(:)과 들여쓰기로 코드의 구조를 결정합니다. 스페이스바나 Tab으로 조절합니다.

 

여기서부터, 들여쓰기의 중요성은 두 번 말하면 입아플 정도입니다.

단순한 Tab 한번이나, 스페이스바 한 번이 코드를 완전히 꼬이게 할수도 있습니다.

 

때문에, 되도록이면 코드를 쓰면서 tab으로 들여쓰기를 구분하는 것을 추천드립니다.

 

 

아래는 간단하게, x값이 9이하일 경우 Pass를 출력하는

if 조건문 입니다.

 

조건문

 

x = 0
if x <= 9:
    print("Pass")

 

해석

 

Pass

 

x =  9인 경우,

 Pass를 반환하는 것을 알 수 있습니다.

 

사실 if 하나만으로는 디테일한 조건을 걸 수 없습니다.

그래서 조건에서 벗어나는 경우, 조건 이외의 또다른 조건이 있는 경우

어떤 값을 반환할 지 설정해 주어야 합니다.

 

 

그중 해당 조건이 아닐경우를 지시해 주는 방법인 else 문이 있습니다.

 

단일 조건 및 그외 조건에 따른 분기 (if ~else)

 

if<조건문>:
    <코드블록1>

else:
    <코드블록2>

다음 예시를 살펴보겠습니다.

 

x = 75
if x >= 90 :
    print("Pass")
else:
    print("Fail")               
    # 코드상에서는 항상 조건에 맞는값이 아닌 벗어난 값을 일부러 도출하는 경우도 있습니다.

 

조건문을 작성한 후, else 구문을 따로 작성해서 Pass가 아닌

Fail이 생기는 경우를 만들어보았습니다.

 

해석
Fail

위에서는 x가 90보다 크거나 같을 경우 Pass를 반환하지만

x가 75이므로, Fail을 반환하게 되었습니다.

 

 

다음으로, 여러가지 조건을 만들 수 있는 elif 조건입니다.

 

여러 조건에 따른 분기(if ~ elif ~ else)

if<조건문1>:
   <코드블록1>
elif<조건문2>:
   <코드블록2>
elif<조건문N>:
   <코드블록N>
else:                             #생략가능
   <코드블록N>

 

if와 elif 그리고 else 까지 혼합하면 더욱 상세하고 

통제 안돼는 변수를 줄이는 조건문을 만들 수 있습니다.

 

예시로 두가지 조건을 만들어 보겠습니다.

x가 90이상일 경우, Very good을 반환하고, x가 90미만이고

80이상일 경우 Good을 반환하면서 80 미만일 경우는

Bad를 반환하도록 말입니다.

 

x= 80

if x >= 90:
    print("Very good")
    
elif  x>= 80 and x<90: # and 조건과 or 조건에 차이가 생깁니다.
    print("Good")

else:
    print("Bad")
해석

 

Good

위처럼, x가 80으로 설정됬습니다. 출력된 값으로 Good을 반환하는 것을 보아

잘 도출되었습니다.

 

다른 예시

 

이번엔 x값을 79로 바꿔보겠습니다.

x = 79

if x >= 90:
   print("Very Good")

elif 90 > x >= 80:
   print("Good")

else:
   print("Bad")

 

해석

 

Bad

 

자, 이러한 경우 어떻게 될까요?

> x가 첫번째 조건도, 두번째 조건 안에도 해당되지 않기 때문에

80미만이므로 Bad 를 반환하게 됩니다.

이를 응용해보겠습니다.

 

중첩 조건에 따른 분기

 

if<조건문1>:
    if<조건문2>:
        <코드블록1>
    else<코드블록2>
elif<조건문3>:
     <코드블록>
else:(생략)
     <코드블록4>

 

위와 비슷하게 점수별 합격점수를 주는 사례로

예시를 한번 만들어 보겠습니다.

 

x = 90

if 90 <= x :
    if x >= 100:
       print("Perfect")
    else :
       print("Very Good")
elif ( x >= 80) and ( x < 90) :
       print("Good")
else:
       print("Bad")

 

해석

 

Bad

 

이번에는 x가 90점 이상이면서 100점 이상일 경우

Perfect, 90점 이상일 경우 Very Good, x가 80이상이면서 90미만일 경우

Good, 어느 것에도 속하지 않을 경우 Bad가 반환되는 코드가 되었습니다.

 

이때 x >= 80 and x <90 은 80<= x < 90 과 같은 의미로 적용됩니다.

 


# 아직 if 함수를 완성하지 못하고 나중에 구현하고 싶을 때,

일단 잠시 Pass를 활용합시다.

 

<참조>
x = 75
if x >= 80:
   pass
else:
   pass

 

 

다음은 반복문 for 입니다.

 

 

 

위 이미지는 똑같은 금형 작업을 반복해서 만든, 동남아시아풍의 한 사원 모습입니다.
질서정연하게 반복된 구조의 아름다움을 볼 수 있습니다.


이렇게 똑같은 작업을 계속하기 위해선, 어떤 방법을 써야 할까요?

 

5.2 지정된 범위만큼 반복하는 for 문

반복문의 필요성

 

0
1
2
3
4
5

 

만약 위와 같이 0부터 5까지 순서대로 숫자가 증가하는 데이터가

필요하다고 가정해봅시다. 어떻게 구해야 할까요?

 

1번 노가다
a = 0 # 변수 a를 0으로 초기화
print(a) # 변수 a 출력

a = a+1  # 변수 a에 1을 더한 후, 다시 a에 대입
print(a) # 변수 a 출력

a = a+1 # 코드 반복
print(a) # 코드 반복

a = a+1 # 코드 반복
print(a) # 코드 반복


a = a+1 # 코드 반복
print(a) # 코드 반복

a = a+1 #코드 반복
print(a) #코드 반복
2번 반복문을 이용하기
for a in [0,1,2,3,4,5] :
    print(a)

 

자, 정답은 2번이었겠죠?

일정한 형식에 따라 지정한 횟수만큼 반복하는 것이

반복문 for 입니다.

 

for 문의 구조

for <반복 구조> in <반복 범위>: <코드 블록>

 

자. in 앞에는 어떻게 반복되어야 할지, 구조(횟수)를 설명해주세요.

그리고 in 뒤에는 반복 범위(반복하는 어떤 것)를 설명해주세요.

 

 

이렇게 문자열도 가능합니다.

 

myFriends = ['Ace', 'R', 'Lisa' , 'Mary']  # 리스트를 변수에 할당합니다.
for myFriends in myFriends:
        print(myFriends)

 

해석

 

Ace
R
Lisa
Mary

 

왜 이렇게 4개가 출력됬을까요?

리스트 myFriends 가 문자열이 4개 존재했기 때문입니다.

그래서 4개의 이름들이 순서대로 출력된 것입니다.

 

range( ) 함수 이용

 

for문에서 활용할 수 있는 숫자가 일정하게 올라가는
함수 range입니다. 어떻게 쓰는지 알아볼까요?

 

range(start, stop, step) = (시작점, 도착점, 점프스텝)

 

예컨대, 1부터 9까지 출력합니다.

 

print(list(range(0,10,1)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

반복문에도 활용할 수 있습니다.

 

for a in range(0,9,1):
    print(a)
0
1
2
3
4
5
6
7
8

 

이번엔 문자열을 순서대로 입력하려고 합니다.

 

clack

wayne

arthur

 

어떻게 할 수 있을까요?

 

a = range(0,10,1)
myfriends = ['clack', 'wayne', 'arthur']
for myfriends in a:
    print(myfriends)

 

좋은 접근이었지만, 아닙니다.

a 의 리스트만 출력하게 됩니다.

 

0
1
2
3
4
5
6
7
8
9

 

다른 방법을 취해봅시다.

 

a = range(0,10,1)
myfriends = ['clack', 'wayne', 'arthur']
for a in myfriends:
    print(a)

 

이렇게 서술했습니다.

clack
wayne
arthur

다행히 정확히 출력됬습니다.

a가 1,2,3,4,5, ... 이렇게 증가하고, myfriends 리스트는

clack, wayne, arthur을 갖고있기 때문이죠?

그리고 a를 출력하면 반복된 문자열들이 나오겠죠.

 

마지막 단계에 있는 인수는 스텝을 뛰는 범위를 의미합니다.

for a in range(3,7,2):
    print(a)
3
5

이와 같은 경우, 3부터 3,4,5,6, 까지 생성하지만,

두 칸씩 건너뛰기 때문에, 3과 5가 출력됩니다.

 

range의 모든 인수들은 생략가능

 

print(list(range(0,10,1)))
print(list(range(0,10)))
print(list(range(10)))

 

이 리스트들을 모두 형태는 다르지만, 같은 데이터를

반환할 수 있습니다.

 

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 

마찬가지로 양수가 아니어도 가능합니다.

 

print(list(range(0,20,5))) #Line 1
print(list(range(-10,0,2))) #Line 2
print(list(range(3,-10,-3))) #Line 3
print(list(range(0,1,1)))  #Line 4
[0, 5, 10, 15]
[-10, -8, -6, -4, -2]
[3, 0, -3, -6, -9]
[0]

 

중첩 for 문

 for<반복 변수1> in < 반복 범위 1> :

 for<반복 변수 2> in < 반복 범위 2> :
    <코드 블록>

 

안에서 반복되는 문장을 알아보겠습니다.

 

x_list = ['x1', 'x2']
y_list = ['y1', 'y2']

print('x  y')
for x in x_list: 
    for y in y_list:
        print(x,y)

 

🐶🍯팁. 파이썬 튜터

for문이 중복되기 시작하면, 이것을 머릿속으로
바로 이해하는 것은 쉽지 않습니다.

여 기 서 (!!) 🎉
파이썬이 구동하는 과정을 순서대로 보여주는
편리한 사이트를 소개합니다.

파이썬 튜터
 https://pythontutor.com/render.html
바로 복잡하거나 과정이 긴 for, while 문을 사용할때
이것이 실제로 어떻게 들어가는지 이해할 수 있습니다.
👍

 

 

어느정도 이해해 도움이 됬기를 바랍니다.

 

x  y
x1 y1
x1 y2
x2 y1
x2 y2

 

이제 순서대로 x1, y1, x2,y2 들이 반환되었습니다.

 

이번엔 더욱 복잡한 중첩문을 알아보기 위해서

세가지 인수들을 이용해서, for문을 써보겠습니다.

 

x_list = ['x1','x2']
y_list = ['y1','y2']
z_list = ['z1','z2']

print('x','y','z')
for x in x_list:
    for y in y_list:
        for z in z_list:
            print(x,y,z)

 

자 이번에도 쉽지 않습니다.

 

x의 리스트부터 시작해서, y 리스트, z 리스트까지

모두 진행이 되어야 되겠죠?

 

x y z
x1 y1 z1
x1 y1 z2
x1 y2 z1
x1 y2 z2
x2 y1 z1
x2 y1 z2
x2 y2 z1
x2 y2 z2

 

한번 들어가면 바로 빠져나오지 않고, 맨 뒤의 것부터 다 돌아간 후에

왼쪽 변수로 빠져 나옵니다.

 

여러 개의 리스트 다루기

 

몇몇 학생들이 어떠한 성적을 갖고 있는지

매칭하는 구문을 만들어보겠습니다.

 

list(range(4)) # range 는 0부터 x까지 숫자를 셉니다

names = ['James', 'Robert', 'Lisa', 'Mary']
scores = [95, 96, 97, 94]

for k in range(len(names)): #len : 리스트의 길이를 알아낸다.
    print(names[k],scores[k])
James 95
Robert 96
Lisa 97
Mary 94

 

zip 메서드

zip : 같은 길이의 데이터끼리 묶어줍니다.

 

한꺼번에 for의 변수를 2개 작성해도 무방합니다

for name, score in zip(names,scores):
    print(name, score)
James 95
Robert 96
Lisa 97
Mary 94

 

for문을 활용한 다양한 예제 중 유명한 것으로

구구단을 제작하는 경우가 있습니다.

 

이때는 format 메서드를 활용해야 합니다.

 

format 메서드

'{0}*{1}={2}'.format(i,j,i*j)

 

이제 간단하게 말하자면, format(1,2,3)처럼 안에 있는 인수를

'{ }, { }, { }' 중괄호 안에 서술하도록 하는

형식을 만들어 주는 메서드입니다.

 

구구단을 for문으로 제작

for i in range(2,10,1):
    for j in range(1,10,1):
        print('{0}*{1}={2}'.format(i,j,i*j))

 

여기서 결과는 i와 j의 인수,

i와 j를 곱한 인수가 공식에 맞게 서술되게 됩니다.

 

1~9까지의 i가 들어가기 때문에

1단부터 9단까지 모두 반환합니다(길어요)

 

2*1=2
2*2=4
2*3=6
2*4=8
2*5=10
2*6=12
2*7=14
2*8=16
2*9=18
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27
4*1=4
4*2=8
4*3=12
4*4=16
4*5=20
4*6=24
4*7=28
4*8=32
4*9=36
5*1=5
5*2=10
5*3=15
5*4=20
5*5=25
5*6=30
5*7=35
5*8=40
5*9=45
6*1=6
6*2=12
6*3=18
6*4=24
6*5=30
6*6=36
6*7=42
6*8=48
6*9=54
7*1=7
7*2=14
7*3=21
7*4=28
7*5=35
7*6=42
7*7=49
7*8=56
7*9=63
8*1=8
8*2=16
8*3=24
8*4=32
8*5=40
8*6=48
8*7=56
8*8=64
8*9=72
9*1=9
9*2=18
9*3=27
9*4=36
9*5=45
9*6=54
9*7=63
9*8=72
9*9=81

 

이제 조건에 따라 반복하는 조건문을 알아보겠습니다.

 

5.3 조건에 따라 반복하는 while문

while 문의 구조

while <조건문>:
  <코드 블록>

 

기본 형태를 알아보겠습니다.

 

i = 0   #초기화
sum = 0 #초기화

print("i sum")
while (sum < 20) : # 조건 검사
    i = i+1        # i를 1씩 증가 ( = 0+1을 i에다 넣어라)
    sum = sum+i    # 이전의 sum과 현재 i를 더해서 sum을 갱신
    print(i,sum)   # i와 sum을 출력

 

i와 sum은 상호간의 영향을 끼치게 됩니다.

 

i sum
1 1
2 3
3 6
4 10
5 15
6 21

 

하지만 while에 대한 조건을 잘못 설정한 경우

이럴때는 어떻게 될까요?

 

while True:
    print('while Test')

 

오류는 아니지만, 정말 말 그대로 무한한 값을 반환하게 됩니다.

 

while Test
while Test
while Test
while Test
while Test
while Test
while Test
while Test
while Test
while Test
while Test
while Test
while Test
while Test
.......

 

만약 복사하신다면, 중간에 닫거나 jupyter를 쓰신다면

클릭해서 M 키를 누르면 코딩모드에서 필기모드로 바뀌므로

M 키를 눌러 끝내시길 바랍니다.

 

이러한 경우를 막거나, 이용하는 경우도 존재합니다.

 

5.4 반복문을 제어하는 break와 continue

반복문을 빠져나오는 break

k = 0
while True:
    k = k+1  # k는 1씩 증가
    
    if (k>3): # k가 3보다 크면
        break # break로 while 문을 빠져나옴
        
    print(k)  # k 출력

출력화면

1
2
3

 

다음으로 continue가 있습니다.

 

다음 반복을 실행하는 continue

특정 조건에만 안찍히고 계속 진행됩니다.

for k in range(5):
    if(k==2):
        continue
    
    print(k)

출력화면

0
1
3
4

 

5.5 간단하게 반복하는 한 줄 for 문

컴프리헨션(Comprehension)의 기본 구조

*다른 언어에서는 지원하지 않는다고 합니다.

리스트 컴프리헨션

 

구조

[<반복실행문> for <반복변수> in <반복범위>]

사용안했을 때의 예제 (numbers에 따른

한 변의 길이에 대한 정사각형의 넓이를 구합니다)

numbers = [1,2,3,4,5]
square = []

for i in numbers:
    square.append(i**2)
    
print(square)

출력화면

[1, 4, 9, 16, 25]

 

리스트 컴프리헨션 사용할 때의 예제

numbers = [1,2,3,4,5]
square = [i**2 for i in numbers]
print(square)

 

확연한 차이가 느껴지시나요?

이를 떠올리는 것이 쉽다면, 시간을

획기적으로 줄일 수 있을 겁니다.

 

[1, 4, 9, 16, 25]

 

조건문을 포함한 리스트 컴프리헨션

구조

[<반복실행문> for <반복변수> in <반복범위> if <조건문>]

 

사용 안했을때의 예제 (numbers에 따른 변의 길이가

3 이상의 정사각형 넓이를 구합니다)

 

numbers = [1,2,3,4,5]
square = []

for i in numbers:
    if i >= 3:
        square.append(i**2)

print(square)

출력화면

[9, 16, 25]

 

 

사용 했을때의 예제

numbers = [1,2,3,4,5]
square = [i**2 for i in numbers if i>=3]

print(square)

출력화면

[9, 16, 25]

 

자 이렇게 까지 해서, if문과 for문, while문의 기본적인

규칙과 사용방식까지 알아 보았습니다.

 

이번에는 이번 2022 카타르 월드컵과 관련된 우리나라

팀과, 경기에 관한 간단한 예문을 만들었습니다.

 

이를 소개하면서, 이번 Python의 제어문을 마칩니다.

 

if 문

korea_team = ['손흥민','황희찬','황의조','정우영']


if '이승우' in korea_team and '손흥민' in korea_team :
    print("100% korea go 16 league")

elif '손흥민'in korea_team :
    print("korea go 16 league")
    
else:
    print("korea can't go")

출력화면

korea go 16 league

 

for 문

my_emotion = ['angry', 'fight_with_Paulobento', 'crying_like_baby', 'buying_a_soju','very angry']  # 감정의 종류둘
korean = ["\nvery","→"]             # 반복의 재료
worldcup_result = "if korea Lose " # 16강 진출의 결과

print(worldcup_result)                            
print ("my_emotion" + " Algorithm ▼")
for my_emotion in my_emotion:
        for korean in korean :
            print(korean , my_emotion)

출력화면

if korea Lose 
my_emotion Algorithm ▼

very angry
→ angry
→ fight_with_Paulobento
→ crying_like_baby
→ buying_a_soju
→ very angry

 

while 문

a = 0

print("< KOREA Win_score >\n")
while True:
    
    a = a + 1
    if a == 3:
        print("Baaaam")
        continue
    if a == 5:
        print("Dammmmmm")
        continue    
    if a == 7:
        print("Son_is_god")
        continue
    if a >9:
         break        
        
    print(a)
< KOREA Win_score >

1
2
Baaaam
4
Dammmmmm
6
Son_is_god
8
9

이상입니다.

 

다음단계 배우기 : https://astart.tistory.com/10
728x90