Python

Python 스터디 3장 - 프로그램의 구조를 쌓는다! 제어문

공대생철이 2023. 6. 26. 22:31
728x90

제어문은 크게 if 문, while 문, for 문 3가지가 있다.

다른 프로그램이 언어와 다르지 않다.

 

문법은 오히려 다른 언어들부터 더 간단하다는 느낌이였다.

(괄호를 안 쓴다던지, 실행문도 괄호로 안 감싸고 그냥 들여쓰기로 나타내던지)

 

money = True
if money:
    print("택시를 타고 가라")
else:
    print("걸어간다")


money = 2000
card = True
if not money >= 3000:
    print("택시타")
else:
    print("걸어가")

if 문의 사용은 간단하다.

if (조건) : 

    (실행문)

else :

    (실행문)

 

조건의 참 거짓 유무에 따라 어떤 실행문을 실행할 지 결정한다.

 

첫번쨰 예시의 경우 money가 True이므로 "택시를 타고 가라"가 출력될 것이고

두번째 예시의 경우 money가 3000보다 작으므로 걸어가라는 결론이 나올 것이다. 

 

저번에 살펴봤던 불 자료형이 이 조건문에서 쓰인다.

비교 연산자를 통한 참, 거짓 뿐만 아니라 빈 리스트, 문자열 등의 확인도 가능하다.

 

조건문을 쓸 때 주의해야하는 것은 바로 '들여쓰기'이다.

money = True
if money:
	print('택시를')
    print('타고')
    	print('가라')

이런 식으로 들여쓰기가 들쭉날쭉으로 되면 unexpected indent 라는 에러를 출력하면서 실행되지 않는다.

들여쓰기와 더불어 항상 콜론(:)을 쓰는 것도 절대 까먹지 말자.

if 뿐만 아니라 while, for, def, class도 콜론(:)이 들어가므로 실수하지 않도록 유의하자.



조건을 판단하기 위한 연산자로는 비교 연산자 뿐만 아니라 and, or, not이 있다.

 

x or y x와 y 둘 중 하나만 참이어도 참이다.
x and y x와 y 모두 참이어야 참이다.
not x x가 거짓이면 참이다.
money = 2000
card = True
if money>=3000 or card:
	print('택시를 타고 가라')
else:
	print('걸어가라')

// 택시를 타고 가라

둘 다 참이기에 조건문은 참을 반환하고 if의 실행문을 실행한다. or 대신 and가 와도 참이다.

 

여기까지는 그래도 다른 언어들과 거의 똑같다.

근데 이번에 살펴볼 연산자는 다른 언어들에서는 보기 어려운 재미있는 조건문이다.

바로 in 과 not in이다.

1 in [1,2,3]
// True
1 not in [1,2,3]
// False

리스트, 튜플, 문자열에서 어떤 원소나 문자가 있는지 없는지 확인하는 조건문이다.

다른 언어에서는 내장함수로 하는 경우가 많은데 파이썬은 이렇게 in, not in 연산자를 활용하여 편리하게 포함 여부를 확인할 수 있었다.

 

가끔은 조건문의 참, 거짓에 따라 아무 행동도 하지 않게 설정할 필요가 있다. 이 때는 pass를 활용하면 된다.

pocket = ['money', 'paper','cellphone']
if 'money' in pocket:
	pass
else:
	print('카드를 꺼내라')

이렇게 pass를 하게 되면 아무런 결과값도 보여주지 않고 if 문을 빠져나오게 된다.

 

if else만 사용하기에는 조건이 복잡한 경우가 실제로 훨씬 많다.

이를 위해 elif를 활용한다.

pocket = ['paper','cellphone']
card = True
if 'money' in pocket:
	print('택시를 타고 가라')
elif card:
	print('택시를 타고 가라')
else:
	print('걸어가라')

if의 첫 조건문을 확인하고 false라면 뒤에 elif로 이동하여 조건을 또 확인한다. 그리고 나서 거짓이라면 else에 있는 실행문을 실행한다.

 

위에 있는 조건문들을 활용해서 조건부 표현식을 쓸 수 있다.

message = 'success' if score >= 60 else 'failure'

message라는 변수에 score가 60 이상이면 success 아니라면 failure 값을 대입해주는 식이다.

조건에 따른 변수 값 할당을 한 줄로 작성할 수 있어 매우 유용하다.

 

다음 살펴볼 제어문은 while문이다.

while문은 문장을 반복해서 수행해야할 경우 사용한다.

 

기본 구조는

while 조건문:
	수행할_문장
    	.
    	.
    	.

열 번 찍어 안 넘어가는 나무 없다는 속담을 파이썬으로 나타내면 이렇게 나타낼 수 있다.

treeHit = 0
while treeHit < 10:
    treeHit += 1
    print("나무를 {}번 찍었습니다".format(treeHit))
    if treeHit == 10:
        print("나무 넘어갑니다.")

나무를 10번 미만으로 찍었다면 계속해서 찍는 반복문이다.

 

만약 반복문을 중간에 강제로 빠져나가고 싶다면 어떻게 해야될까?

이 때는 break를 사용하면 된다.

coffee = 10
money = 300
while money:
    print("돈을 받았으니 커피를 줍니다.")
    coffee -= 1
    print("남은 커피의 양은 {}입니다.".format(coffee))
    if coffee == 0:
        print("커피가 다 떨어졌습니다. 판매를 중지합니다.")
        break

자판기에서 팔 수 있는 커피가 10잔 밖에 없다는 상황이 있을 때 자판기 동작에 대한 파이썬 코드이다.

money 값은 300으로 고정이므로 while문에서 조건은 항상 참이다.

하지만 커피가 다 떨어지면 돈을 넣어도 커피를 뽑을 수가 없다. 그러므로 조건문이 참임에도 불구하고 break을 통해서 자판기의 동작을 중지시켜야한다.

 

이번에는 while문을 수행할 때 while문을 빠져나가지 않고 다시 조건문으로 돌아가게 만들어보자.

이때는 continue를 사용하면 된다.

a = 0
while a < 10:
    a += 1
    if a % 2 == 0:
        continue
    print(a)

10이하의 자연수 중에서 홀수만 출력하는 코드이다.

a를 1씩 증가하면서 while문을 수행하는데 짝수라면 print를 하기 전에 continue를 수행하여 다시 a<10 조건으로 돌아간다.

 

다음 살펴볼 제어문은 for 문이다. 

while문과 비슷하게 반복문인 for 문은 구조가 한 눈에 파악하기 더 쉬워서 사용빈도가 while보다 더 높을 것이다.

 

for 변수 in 리스트(또는 튜플, 문자열):
	수행할 문장
    	.
        .
        .

for과 in을 활용하는 것이 기본적인 구조이다.

test_list = ["one", "two", "three"]
for i in test_list:
    print(i)


a = [(1, 2), (3, 4), (5, 6)]
for first, second in a:
    print(first * second)

이런 식으로 활용이 가능하다.

 

for문에서도 while과 동일하게 continue을 사용할 수 있다.

marks = [90, 25, 67, 45, 80]
number = 0
for i in marks:
    number += 1
    if i < 60:
        continue
    print("{}번 학생은 합격입니다. 축하드립니다.".format(number))

이렇게 되면 i<60일때는 조건문으로 다시 돌아가서 print문은 실행되지 않는다.

 

for 문왁 함께 자주 사용되는 함수가 있다.

바로 range함수이다.

add = 0
for i in range(1, 101):
    add += i
print(add)

range 함수를 활용해서 1부터 100까지의 합을 구하는 코드이다.

range(1,101)이면 1부터 100까지, 즉 두번째 수는 포함하지 않는 정수 범위를 말한다. 

 

for i in range(2, 10):
    for j in range(1, 10):
        print(i * j, end=" ")
    print(" ")

이건 for 문과 range를 활용한 구구단 코드이다.

for문을 중첩해서 사용할 수 있다.

 

리스트 안에 for 문을 포함하는 리스트 컴프리헨션을 사용하면 좀 더 편리하고 직관적으로 코드를 짤 수 있다.

a = [1, 2, 3, 4]
result = [num * 3 for num in a if num % 2 == 0]

조금 복잡한 예시이긴 하나 for + if로 리스트 컴프리헨션을 활용한 것이다.

1. a 리스트에 대해서 반복문을 도는데

2. 짝수인 num에 대해서만

3. 3을 곱해준 리스트이다.

따라서 결과로는 [6,12]가 출력된다.

 

result = [x * y for x in range(2, 10) for y in range(1, 10)]

구구단의 결과를 담은 리스트를 한 줄로 표현한 것이다.

1. range(2,10)에 있는 x에 대해서 반복문을 도는데

2. 각 x에 대해서 range(1,10)에 있는 y를

3. 곱해준 값이 들어있는 리스트이다.

[2,4,......72,81]까지 구구단의 모든 결과가 들어있는 리스트가 출력되게 된다.

 

728x90