5. Control Statement(if, while & for)
<If>
'if'는 '만약에~'라는 뜻을 가지고 있다.
간단한 예를 들면 다음과 같다.
'만약에 목적지가 3km 이하면 걸어간다.'
'만약에 목적지가 3km를 초과하면 버스를 탄다.' 혹은 '만약에 3km가 이하가 아니라면 버스를 탄다.'
이런 식으로 조건을 걸어주는 것이다.
destination = 2.5
if destination <= 3.0:
print("걸어가세요!")
else:
print("버스를 타세요!")
이런 식으로 말이다. 위의 결과는 '걸어가세요!'가 나올 것이다.
주의해야 할 것이 몇 가지 있다. "if 조건문:" 이처럼 조건문 뒤에 (:)을 적는 것을 잊지 말자.
또한 수행할 문장을 들여 쓰기를 해야 하는 것이다.
그렇지 않으면 오류가 난다. 쉽게 생각하면 if, elif, else의 위치를 맞춘다고 생각하면 된다.
파이 참 기준으로 엔터 치고 Tab키를 누르면 들여 쓰기가 된다.
하나 이 책과 파이썬 커뮤니티에서는 스페이스바 4번 치는 것을 권장한다.
Tab과 스페이스바 모두 사용 가능하지만 혼용해서 쓰지만 않으면 괜찮다는 것 같다.
x < y | x가 y보다 작다 |
x > y | x가 y보다 크다 |
x == y | x와 y가 같다 |
x != y | x와 y가 같지 않다 |
x >= y | x가 y보다 크거나 같다 |
x <= y | x가 y보다 작거나 같다 |
위에 적용된 비교 연산자도 정리해봤다.
참고하고 넘어가면 될 듯하다.
destination = -2
if destination <= 3.0 and destination >= -3.0:
print("걸어가세요!")
else:
print("버스를 타세요!")
x or y | x와 y 둘중에 하나만 참이어도 참이다 |
x and y | x와 y 모두 참이어야 참이다 |
not x | x가 거짓이면 참이다 |
위처럼 대표적인 조건 연산자인 and, or, not 도 적용해 보았다.
위처럼 설정하면 방향이 반대방향(음수)인 경우에도 적용이 가능하다.
card = True
pocket = ['money','paper','cellphone']
if 'money' in pocket:
print("택시를 타세요")
elif card:
print("택시를 타세요")
else:
print("걸어가세요")
x in 리스트 | x not in 리스트 |
x in 튜플 | x not in 튜플 |
x in 문자열 | x not in 문자열 |
파이썬은 위와 같은 조건을 걸 수도 있다. x in @@ 혹은 x not in @@이 참이 된다면 문장을 실행시킬 수 있는 것이다.
위 같이 elif를 적용해서 카드의 한도가 남아있을 때 택시를 타게 하는 것도 가능하다.
또한 elif는 개수의 제한 없이 사용 가능하다.
<While>
'while'은 '~동안'이라는 뜻을 가지고 있다.
프로그램에서 쓰는 뜻과 실제 우리가 사용하는 뜻을 적절히 섞어보면
'조건문이 참인 동안 반복적으로 실행한다.'라고 볼 수 있다.
treehit =0
while treehit<10:
treehit = treehit +1 #나무 찍는 횟수 추가
print("나무를 %d번 찍습니다." %treehit)
if treehit == 10:
print("나무 넘어갑니다.")
위 코딩은 이해하기 쉽고 간결하지만 많은 걸 알 수 있다.
우선 treehit은 나무를 찍는 횟수를 의미한다.
while 반복문의 조건에 따라 treehit == 10 이 되면 멈춘다.
처음에 treehit = 0 이므로 +1이 되어서 1번찍는다고 제일 먼저 나올 것이다.
그렇게 반복하다 보면 treehit = treehit(9) + 1 이 되는 시점이 올 것이다.
이때 treehit는 10이 되고 첫 번째 print문과 if문의 조건도 달성하기에
둘 다 실행할 것이다.
이때 treehit은 10이란 값을 가지고 있는 상태이기에 while문의 조건을 만족하지 못하기 때문에 while문을 탈출한다.
또한 'treehit = treehit+1'은 'treehit += 1' 이렇게도 사용이 가능하다.
a=0
while a!=5: #a는 5가 아닐동안 반복
print('1.add')
print('2.del')
print('3.list')
print('4.tuple')
print('5.exit')
a = int(input("번호를 입력하시오: ")) #정수입력 받는 기능
print("프로그램 끝!")
단순히 5번을 누르면 종료 기능만 구현한 간단한 프로그램이다.
이때 while a!=5는 a가 5가 아닐 때까지 반복한다는 의미이다.
따라서 5를 입력받으면 반복문을 탈출한다.
#음료수 자판기
a=6
while a!=5:
print("1.닥터페퍼 1200원")
print("2.코카콜라 1100원")
print("3.환타 1000원")
print("4.스프라이트 900원")
print("5.종료")
money = int(input("금액을 입력하세요: "))
a = int(input("원하는 음료수를 입력하세요: "))
c = int(input("갯수를 입력하세요: "))
if a==1:
if money-(c*1200) <0:
print("잔액이 부족합니다.")
else:
print("닥터페퍼 %d개 나왔습니다." %c)
print("잔액은 %d원입니다."%(money-1200*c))
money = money - 1200*c
elif a==2:
if money-(c*1100) <0:
print("잔액이 부족합니다.")
else:
print("코카콜라 %d개 나왔습니다." %c)
print("잔액은 %d원입니다."%(money-1100*c))
money = money - 1100 * c
elif a==3:
if money-(c*1000) <0:
print("잔액이 부족합니다.")
else:
print("환타 %d개 나왔습니다." %c)
print("잔액은 %d원입니다."%(money-1000*c))
money = money - 1000 * c
elif a==4:
if money-(c*900) <0:
print("잔액이 부족합니다.")
else:
print("스프라이트 %d개 나왔습니다." %c)
print("잔액은 %d원입니다."%(money-900*c))
money = money - 900 * c
elif a==5:
print("종료합니다.")
break
else:
print("오류 입니다. 음료수 번호를 다시 입력해주세요.")
음료수 자판기 프로그램을 예제로 적용해서 만들어 봤다.
if문과 while문을 중점적으로 사용했다.
위를 보면 'break' 기능이 있는데
'break'를 만나면 반복문을 강제로 탈출할 수 있다.
위의 경우는 5번을 입력하면 종료하면 반복문을 탈출할 수 있게 했다.
만약 항목에 없는 음료수를 고를 경우 다시 처음으로 돌아간다.
위 프로그램은 보충해야 할 부분이 몇 개 있다.
잔액이 남은 상태로 금액을 추가했을 때 남은 잔액에 새로 투입된 돈이 더해지도록 해야 하고
음료수 번호를 잘못 입력했을 때 금액 입력이 아닌 음료수 선택창으로 바로 가도록 하는 것이다.
Control Statement 단원이 끝나고 예제를 할 때 본격적으로 위 코드를 수정해 보겠다.
a =0
while a<10:
a=a+1
if a%2 == 0:
continue #짝수일경우 continue를 실행해서 반복문의 처음으로 돌아감
print(a) #홀수일경우 continue를 건너뛰고 조건문을 벗어나 a를 출력
1,3,5,7,9 가 출력될 것이다.
위 코드를 보면 'continue'라는 것을 볼 수 있다.
'if a %2 == 0'은 짝수일 때 조건문 안에 존재하는 실행하라는 뜻이다.
따라서 'continue'가 실행된다. 이 뜻은 while의 조건문으로 가라는 뜻이다.
즉, while이라는 반복문을 'continue' 계속해서 다시 한다는 것이다.
홀수일 경우 if 문을 벗어나서 print(a)를 실행한다.
if문이 조건이 안 맞을 경우 일반적으로 elif문이나 else가 나오지만
위의 경우 그 자리에 print(a)가 들어갔다고 생각하면 된다.
a =0
while 1: #무한루프 1,True, 위의 경우 a==0등 참인 명제는 모두 무한루프로 돌릴 수 있다.
print("무한루프")
위 코드는 무한루프를 구현한 것이다.
이 문장은 특별한 외력이 없는 한 계속 무한하게 출력된다.
항상 참이기 때문이다.
윈도에서는 Ctrl+c 를 통해서 빠져나갈 수 있다.
주석을 참고해보면 참인 조건에서는 항상 가능하다.
<For>
for은 무엇을 의미하는가?
아마 프로그래밍 언어에서는 ~동안 으로 해석하는 게 적절할 듯하다.
for문의 기본 구조는 다음과 같다.
for 변수 in 리스트(or 튜플, 문자열):
수행할 문장 1
수행할 문장 2
....
해석하면 "리스트 안의 요소를 변수에 맞게 다 넣는 동안 문장을 수행해라!"이다.
test_list = ['one', 'two', 'three'] #1 리스트를 통한 기본 예제
for i in test_list:
print(i)
a = [(1,2), (3,4), (5,6)] #2 2가지 이상의 요소도 대입 가능 예제
for (first, last) in a:
print(first + last)
위는 아래와 같은 결과가 나온다.
one
two
three
3
7
11
첫 번째를 보면 test_list의 요소 값을 차례대로 i에 넣고 print(i) 연산을 수행한다.
test_list의 요소가 전부 들어가면 반복문이 끝나게 된다.
두 번째도 첫 번째와 비슷하다.
a라는 리스트에 요소 값으로 튜플이 들어가 있기 때문에 튜플을 담아줄 튜플을 (first, last)로 만들어줬다.
a안의 요소를 차례로 first, last에 담고 print(first+last) 연산을 한다.
요소 값을 전부 쓰게 되면 for문을 끝낸다.
for i in range(2,10): # i에 2부터 10-1까지 대입할때 까지 반복
for j in range(1,10): #j에 1부터 10-1까지 대입할때 까지 반복
print(i*j,end=" ") #i*j 출력, 'end'는 j에 대한 반복문 끝날때 까지 띄어쓰기 및 한줄에 쓰도록함
print('') #i에 대한 반복문이 끝나면 줄바꿈(엔터 치는것과 같은 기능)
위는 아래와 같은 결과가 나온다.
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
우선 range를 보자.
range는 범위를 의미한다.
i in range(2,10)라는 의미는 2 ~ 9까지 i에 대입하고 i에 10이 들어가는 순간 반복문을 탈출해라!라는 의미와 같다.
우선 i에 2가 들어가고 밑에 j에 대한 반복문으로 넘어간다. j가 1~9까지 대입하면서 곱의 출력을 반복한다.
이때 end=" "는 j에 대한 반복문이 끝날 때까지 줄 바꿈을 하지 말고 출력할 때마다 " " 즉 띄어쓰기를 함께 출력하라는 것이다.
print(' ')는 줄 바꿈을 의미한다. j에 대한 반복문이 다 끝나면 print(' ')가 실행되고 i에는 3이 들어갈 것이다. 위 과정이 i가 10이 되는 순간
끝난다. 여담으로 print(' ')이 아닌 print('\n')을 삽입하게 되면 다음 줄에 출력이 아닌 한 줄 더 띄어서 출력이 된다.
서로 다른 기능을 하는 것이니 잘 알아두도록 하자.
a = [1,2,3,4,5]
result = []
for num in a:
result.append(num*4)
print(result)
위의 연산 결과는 다음과 같다.
[4, 8, 12, 16, 20]
아주 직관적인 예제이다. a라는 리스트를 만들고 result라는 빈 리스트를 만든다.
a의 요소가 num에 순차적으로 전부 한 번씩 들어갈 때까지 reuslt 리스트에 num*4를 추가한다.
이런 의미이다. 그러나 위의 예제를 리스트 내포와 range를 이용해서 한 줄로 압축할 수 있다.
reuslt = [num*4 for num in range(1,6)]
print(reuslt)
위의 결과도 동일하다.
[4, 8, 12, 16, 20]
순서를 생각해보면 다음과 같다.
1. result라는 리스트를 만들고 안에 num*4를 수행하라고 한다.
2. 근데 언제까지 하느냐? num안에 range(1,6) 즉 1~5까지 순차적으로 한 번씩 들어갈 때까지.
3. 연산 결과를 result라는 리스트에 순차적으로 저장한다.
4. print(result)를 통해서 출력한다.
numbers = [1,2,3,4,5,6,7,8]
result = [n*3 for n in numbers if n%2 == 0]
print(result)
위의 결과는 다음과 같다.
[6, 12, 18, 24]
리스트 내포를 이용하면서 동시에 조건문(if)을 사용할 수 있다.
이때 조건문의 변수는 for문에서 사용되는 변수와 동일해야 한다.
결국 numbers는 비교 값일 뿐이고 조건에 따라 연산을 당하는 객체는
n이기 때문이다. n에 조건도 걸어주고 연산도 하는 것이다.
reuslt = [i*j for i in range(2,10)
for j in range(1,10)]
print(reuslt)
위처럼 리스트 내포는 반복문을 두 개 이상 사용하는 것도 가능하다.
구구단 예제에 리스트 내포를 이중으로 적용해 보았는다.
그러나 출력을 깔끔하게 해 주기 위해선 추가 작업이 필요하다.
위처럼 리스트 내포가 항상 유리한 것만은 아니니 상황에 맞게 잘 사용할 수 있도록 익숙해지는 것이 중요한 것 같다.