
제어문
제어문이란, 프로그램의 기본 흐름을 변경하는 Python의 문법입니다.
if~ else , match ~ case를 사용한 조건문과 for, while를 사용한 Loop 순환문이 있습니다.
먼저 조건문은 if~ elif ~ else 패턴으로 작성됩니다.
첫번째로 if 안에는 참일 때의 조건과 참일 때 수행할 문장과 else 안에는 거짓일 때의 조건과 거짓일 때 수행할 문장을 적습니다.
a = 10
if (a % 2 == 0) {
print('짝수')
} else {
print('홀수')
}두번째로 조건을 여러가지로 나눌 때 if ~ elif ~ else 패턴을 사용합니다.
score = 74
if score >= 90:
print('A')
elif score >= 80:
print('B')
elif score >= 70:
print('C')
elif score >= 60:
print('D')
else
print('F')앞서 살펴본 dict 자료구조를 응용하여 사용한다면, 키값에 조건을 붙여 접근할 수도 있습니다.
아래 예시는 튜플에서 언패킹해서 적용했을 때의 원리입니다.
age = 56
gender = 'M'
result = {
(True, 'M'): 'MAN',
(True, 'F'): 'WOMAN',
(False, 'M'): 'BOY',
(False, 'F'): 'GIRL'
}
print(result[age >= 20, gender]) # MANPython에서는 조건식에서 참, 거짓 판정을 할 때, bool 타입 외에도 조건식에서 참, 거짓 판정이 되는데
이것을 truthy한 값과 falsy한 값이라고 합니다.
첫번째, 숫자에서는 0이 아닌 타입은 True로 판정되고, 0은 False로 판정됩니다.
두번째, 문자열에서는 빈 문자열이 False로 판정되고, 그 이외에는 True로 판정됩니다.
세번째, 리스트에서는 빈 리스트가 False로 판정되고, 그 이외에는 True로 판정됩니다.
네번째, 튜플에서는 빈 튜플이 False로 판정되고, 그 이외에는 True로 판정됩니다.
다섯번째, 딕셔너리에서는 빈 딕셔너리가 False로 판정되고, 그 이외에는 True로 판정됩니다.
여섯번째, None 타입은 무조건 거짓입니다.
또한, Python에서는 논리 연산자 and, or를 통해 SCE(Short-Circuit Evaluation) 연산을 할 수 있습니다.
or 연산의 경우 왼쪽이 True인 경우, 왼쪽의 수행 결과값을 리턴하고, 왼쪽이 False인 경우, 오른쪽 수행 결과값을 리턴합니다.
and 연산의 경우 왼쪽이 True인 경우, 오른쪽 수행 결과값을 리턴하며, 왼쪽이 False인 경우 왼쪽 수행 결과값 리턴합니다.
또한, if-else 문을 편하게 작성하기 위해 삼항 연산자를 제공합니다.
result = '5의 배수' if n % 5 == 0 else '5의 배수 아님'순환문 (loop)
while 순환문의 경우 조건식이 참일 동안, 수행문장을 반복 수행합니다.
아래 예에서는 순환되는 동안 num 값은 0부터 9까지 출력이 되고, 순환이 끝난 후 num 값은 10입니다.
num = 0
while (num < 10):
print(num)
num += 1
# 0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9예시로, while 순환문 중첩을 사용하여 구구단 전체를 출력해보겠습니다.
a = 2
b = 1
while a <= 9:
while b <= 9:
print(f"{a} * {b} = {a * b}")
b += 1
a += 1break 문법은 순환문(for, while)에서 순환문을 강제로 종료시키거나, 빠져나오는 키워드입니다.
break는 감싸고 있는 가장 가까운 순환문을 종료합니다.
n = 1
while n <= 100:
print(n, end=' ')
if n == 10:
break
n += 1
# 1 2 3 4 5 6 7 8 9 10continue 문법은 해당 부분을 건너뛰고, 순환문 처음으로 돌아갑니다. 순환문은 종료하지 않고 해당 부분만 skip합니다.
num = 1
while num <= 10:
num += 1
if num % 3 == 0:
continue
print(num, end=' ')
# 2 4 5 7 8 10 11for 순환문은 (for 변수 in 이터러블 객체) 구조로 문법을 가집니다.
이터러블 객체는 range(숫자), str, list, set, tuple, dictionary 등이 있습니다.
for i in range(5, 8):
print(i) # 5, 6, 7enumerate 함수는 (인덱스, 데이터) 쌍의 튜플로 구성된 이터러블 객체를 리턴합니다.
animals = ['dog', 'cat', 'bird', 'puppy', 'kitty']
for x in enumerate(animals):
print(x) # (0, 'dog'), (1, 'cat'), (2, 'bird'), (3, 'puppy'), (4, 'kitty')enumerate 함수가 튜플로 구성된 이터러블 객체를 리턴하므로 그것을 for 순환문으로 돌리면 언패킹하여 데이터를 뽑습니다.
for index, data in enumerate(animals):
print(index, data, end=" ") # 0 'dog' 1 'cat' 2 'bird' 3 'puppy' 4 'kitty'zip() 함수는 매개변수 iterable 데이터들의 각 아이템들을 묶은 튜플들의 iterable 객체를 생성합니다.
print(list(zip([10, 20, 30], ('a', 'b', 'c'))))
# [(10, 'a'), (20, 'b'), (30, 'c')]zip() 함수를 이용해 만든 iterable 객체를 for 순환문을 통해 돌리면 각 튜플 값을 순환하여 리턴받습니다.
for x in zip([10, 20, 30], ('a', 'b', 'c')):
print(x) # (10, 'a') (20, 'b') (30, 'c')컴프레헨션 (Comprehension)
각 List, Tuple, Set, Dictionary 안에 for 문을 포함시켜 그 타입대로 변수를 생성하는 방식을 말합니다.
리스트 컴프레헨션은 [ 표현식 for 항목 in 반복가능객체 (if 조건) ] 방식으로 구성합니다.
a = [1, 2, 3, 4]
b = [num * 3 for num in a] # [3, 6, 9, 12]세트 컴프레헨션은 { 표현식 for 항목 in 반복가능객체 (if 조건) } 방식으로 구성합니다.
a = { num % 3 for num in range(0, 9) }
# { 0, 1, 2 }딕셔너리 컴프레헨션은 { key: 표현식 for 항목 in 반복가능객체 (if 조건) } 방식으로 구성합니다.
a = { num: num + 1 for num in range(0, 10) }
# { 0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10 }딕셔너리 컴프레헨션은 앞서 배운 items() 메소드 통해 받는 리턴값을 언패킹하여 구성하는 것이 파이썬다운 방식입니다.
fruits = {"peach": 10000, "apple": 4000, "banana": 6000 }
dict = { k:v for k,v in fruits.items() if k != 'banana' }
# { "peach": 10000, "apple": 4000 }