파이썬에서 가장 중요한 문법인 반복문과 조건문에 대해서 다루어보도록 하겠음!
A if 조건식 else B
: 조건식이 True면 A를 , False면 B를 실행한다.# 기본적인 조건식
num1 = 10
num2 = 50
print(f"num1 = {num1}, num2 = {num2}")
'''
num1 = 10, num2 = 50
'''
# 변수로 할당하여 출력하는 방법
num1_is_greater = True if (num1 > num2) else False
print(f"num1 > num2 : {num1_is_greater}")
'''
num1 > num2 : False
'''
# 실행문을 나누어 출력하는 방법
print('num1은 num2보다 크다.') if (num1 > num2) else print('num1은 num2보다 크지 않다.')
'''
num1은 num2보다 크지 않다.
'''
if 조건식:
로 조건식을 명시하고, 다음 줄에서는 들여쓰기를 통해 실행문을 담아주어야 함;
으로 개행 없이도 표현할 순 있지만, 그다지 권장하진 않음# if문 (참인 경우에만 실행시킨다) - 실행코드가 간단하면 개행 없이도 사용 가능
if 10 > 5 : print('10은 5보다 크다.'); print('5는 10보다 작다.')
'''
10은 5보다 크다.
5는 10보다 작다.
'''
# if문의 일반적인 들여쓰기 문법 - 이 방법이 가독성면에서도 더 좋으므로 권장함
if 10 > 5 : #True
print('10은 5보다 크다.')
print('5는 10보다 작다.')
'''
10은 5보다 크다.
5는 10보다 작다.
'''
# 80점 이상이면 pass를, 그렇지 않으면 fail을 출력하는 조건문
pass_score = 80
# 간단한 함수를 통해 조건문을 정의하고 실행해보도록 하자 (들여쓰기에 주의)
def pass_or_fail(score):
print('-'*10)
if score >= 80:
print('pass')
else:
print('fail')
lack_score = pass_score - score
print(f'{lack_score}점이 부족합니다.')
print('-'*10)
# 70점인 경우 : fail
pass_or_fail(70)
'''
----------
fail
10점이 부족합니다.
----------
'''
# 90점인 경우 : pass
pass_or_fail(90)
'''
----------
pass
----------
'''
A_score = 80
B_score = 70
# elif를 쓰지 않은 다자 택일 조건문
def grade(score):
if score >= A_score:
print(score, end=', ')
print('Grade : "A"')
else:
if score >= B_score:
print(score, end=', ')
print('Grade : "B"')
lack_A = A_score - score
print('A 기준과의 차이 : {}점'.format(lack_A))
else:
print(score, end=', ')
print('Grade : "C"')
lack_B = B_score - score
print('B 기준과의 차이 : {}점'.format(lack_B))
print()
grade(85)
grade(75)
grade(60)
'''
85, Grade : "A"
75, Grade : "B"
A 기준과의 차이 : 5점
60, Grade : "C"
B 기준과의 차이 : 10점
'''
# elif를 활용한 다자 택일 조건문
def grade(score):
if score >= A_score:
print(score, end=', ')
print('Grade : "A"')
elif score >= B_score:
print(score, end=', ')
print('Grade : "B"')
lack_A = A_score - score
print('A 기준과의 차이 : {}점'.format(lack_A))
else:
print(score, end=', ')
print('Grade : "C"')
lack_B = B_score - score
print('B 기준과의 차이 : {}점'.format(lack_B))
print()
grade(85)
grade(75)
grade(60)
'''
85, Grade : "A"
75, Grade : "B"
A 기준과의 차이 : 5점
60, Grade : "C"
B 기준과의 차이 : 10점
'''
# 입력이 숫자형이 아닌 경우를 예외처리하고, 숫자형이면 조건에 따라 실행하는 조건문
def grade(score):
if type(score) in [int,float]:
if score >= 80:
print('score : {}, grade : A'.format(score))
elif score >= 70:
print('score : {}, grade : B'.format(score))
else:
print('score : {}, grade : C'.format(score))
else:
print('잘 못 입력하셨습니다. 숫자를 입력해주세요.')
grade('문자')
grade(85)
grade(75.5)
grade(60)
grade(True)
'''
잘 못 입력하셨습니다. 숫자를 입력해주세요.
score : 85, grade : A
score : 75.5, grade : B
score : 60, grade : C
잘 못 입력하셨습니다. 숫자를 입력해주세요.
'''
for문
과 while문
이 있음for 변수 in 이터레이터:
형태로 반복문을 지정하고, 들여쓰기를 통해 반복 실행할 명령문을 정의함# 구구단 출력
print('구구단 2단')
for i in range(1, 9+1): # 1부터 9까지 1의 간격으로 i를 설정해 반복함
print(f"2 * {i} = {2*i}")
'''
구구단 2단
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
'''
# list
data = [90, 45, 32, 44]
for i in range(len(data)):
print(data[i], end=' ')
'''
90 45 32 44
'''
# tuple
data = (90, 45, 32, 44)
for i in range(len(data)):
print(data[i], end=' ')
'''
90 45 32 44
'''
# 일반적인 반복문
a = [1,2,3,4,5]
b = [10,20,30,40,50]
for i in range(len(a)):
print(a[i],b[i])
'''
1 10
2 20
3 30
4 40
5 50
'''
# zip함수 활용
a = [1,2,3,4,5]
b = [10,20,30,40,50]
c = zip(a,b)
print(list(c))
'''
[(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]
'''
# zip 함수 + 반복문
a = [1,2,3,4,5]
b = [10,20,30,40,50]
c = [100,200,300,400,500]
for x,y,z in zip(a,b,c):
print(x,y,z)
'''
1 10 100
2 20 200
3 30 300
4 40 400
5 50 500
'''
# enumerate 함수
b = [10,20,30,40,50]
c = enumerate(b)
print(c)
for i in c:
print(i)
'''
<enumerate object at 0x000002B1EEE7B8B8>
(0, 10)
(1, 20)
(2, 30)
(3, 40)
(4, 50)
'''
# enumerate 함수 + 반복문 활용
b = [10,20,30,40,50]
for i, x in enumerate(b):
print(f"index '{i}' 값은 '{x}' 입니다")
'''
index '0' 값은 '10' 입니다
index '1' 값은 '20' 입니다
index '2' 값은 '30' 입니다
index '3' 값은 '40' 입니다
index '4' 값은 '50' 입니다
'''
# enumerate을 활용해 (zip 함수 + 반복문) 결과 재현하기
b = [10,20,30,40,50]
c = [100,200,300,400,500]
for i, v in enumerate(zip(b,c)): # index, (b,c)
x, y = v # (b,c) -> x, y
print(i+1, x, y)
'''
1 10 100
2 20 200
3 30 300
4 40 400
5 50 500
'''
# 딕셔너리 정의
dict_data = {
"id": 1,
"first_name": "kj",
"last_name": "Cheong",
"email": "dankool@naver.com",
"gender": "Male",
"ip_address": "123.123.123.23"
}
# key값 출력하기 (바로 돌리면 key값만 반환함)
for x in dict_data:
print(x)
'''
id
first_name
last_name
email
gender
ip_address
'''
# .keys()로 key값 반복문 실행
for x in dict_data.keys():
print(x)
'''
id
first_name
last_name
email
gender
ip_address
'''
# .values()로 value값 반복문 실행
for x in dict_data.values():
print(x)
'''
1
kj
Cheong
dankool@naver.com
Male
123.123.123.23
'''
# .items()로 key, value의 튜플을 반환
for x in dict_data.items():
print(x)
'''
('id', 1)
('first_name', 'kj')
('last_name', 'Cheong')
('email', 'dankool@naver.com')
('gender', 'Male')
('ip_address', '123.123.123.23')
'''
# .items()로 key, value를 따로 저장해 출력
for k,v in dict_data.items():
print("Key: {:15s} Value: {}".format(k,v))
'''
Key: id Value: 1
Key: first_name Value: kj
Key: last_name Value: Cheong
Key: email Value: dankool@naver.com
Key: gender Value: Male
Key: ip_address Value: 123.123.123.23
'''
# *의 갯수가 늘어나는 반복문을 작성해보기
for i in range(1, 5+1): # i : 1 ~ 5
for _ in range(i): # i번 반복수행
print('*', end='')
print() # 개행(enter)
'''
*
**
***
****
*****
'''
list_i = []
for x in range(1, 19+1, 2): # 1부터 19까지 2의 간격으로
list_i.append(x) # append로 리스트에 값을 추가
print(list_i)
'''
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
'''
# 컴프리헨션 (한줄로 간략하게)
list_i = [x for x in range(1,19+1,2)]
print(list_i)
'''
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
'''
# 조건문과 결합한 컴프리헨션
list_even = [x for x in range(1, 20+1) if x % 2 == 0]
print(list_even)
'''
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
'''
# 두개의 변수를 조합한 컴프리헨션(중첩반복문)
list_xy = [x+y for x in range(1,6+1) if x % 3 == 0 for y in range(1,10+1) if y % 3 == 1]
# x = [3, 6], y = [1, 4, 7, 10]
print(list_xy)
'''
[4, 7, 10, 13, 7, 10, 13, 16]
'''
# 조건문을 먼저 쓰는 컴프리헨션 (else도 써줘야함)
numbers = {'amy': 7, 'jane': 9, 'sophia': 5, 'jay': 10}
pas = {name: 'PASS' if number > 8 else 'NO PASS' for name, number in numbers.items()}
print(numbers)
print(pas)
'''
{'amy': 7, 'jane': 9, 'sophia': 5, 'jay': 10}
{'amy': 'NO PASS', 'jane': 'PASS', 'sophia': 'NO PASS', 'jay': 'PASS'}
'''
continue
: 실행을 생략하고 다음 반복 실행문으로 넘어감break
: 반복을 멈추고 바로 빠져나옴# continue
list_int = [1,2,3,4,5,6,7]
for i in list_int:
if i % 3 == 0: # 3의 배수인 경우 실행 건너뛰기
continue
else:
print(i)
'''
1
2
4
5
7
'''
# break
list_int = [1,2,3,4,5,6,7]
for i in list_int:
if i % 3 == 0: # 3의 배수를 만나면 반복문 종료
break
else:
print(i)
'''
1
2
'''
# else문이 실행되는 경우(끝까지 돌았다!)
for i in range(3):
print('loop : ', i) # 1) 루프반복수행
else:
print('break가 실행되지 않았습니다.') # 2) else 구문 추가수행
'''
loop : 0
loop : 1
loop : 2
break가 실행되지 않았습니다.
'''
# else문이 실행되지 않는 경우(break로 빠져나왔다!)
for i in range(3):
print('loop : ', i)
if i == 1:
break
else:
print('break가 실행되지 않았습니다.')
'''
loop : 0
loop : 1
'''
while문
은 조건이 참(True)인 경우에 실행문을 반복 실시하고, 조건이 거짓(False)이 되는 경우에 반복을 중지하게 됨while문
을 이용하는 것이 좋음# while문의 기본 활용법 1 (boolean을 활용하기)
num = 0
sum_num = 0
flag = True
while flag == True:
num += 1
sum_num += num
print(f"{num}까지의 합은 {sum_num}이다.")
if sum_num >= 100: # 종료조건
flag = False
'''
1까지의 합은 1이다.
2까지의 합은 3이다.
3까지의 합은 6이다.
4까지의 합은 10이다.
5까지의 합은 15이다.
6까지의 합은 21이다.
7까지의 합은 28이다.
8까지의 합은 36이다.
9까지의 합은 45이다.
10까지의 합은 55이다.
11까지의 합은 66이다.
12까지의 합은 78이다.
13까지의 합은 91이다.
14까지의 합은 105이다.
'''
# while문의 기본 활용법 2 (조건을 바로 넣어주기)
num = 0
sum_num = 0
while sum_num <= 100: # 실행 및 종료 조건
num += 1
sum_num += num
print(f"{num}까지의 합은 {sum_num}이다.")
'''
1까지의 합은 1이다.
2까지의 합은 3이다.
3까지의 합은 6이다.
4까지의 합은 10이다.
5까지의 합은 15이다.
6까지의 합은 21이다.
7까지의 합은 28이다.
8까지의 합은 36이다.
9까지의 합은 45이다.
10까지의 합은 55이다.
11까지의 합은 66이다.
12까지의 합은 78이다.
13까지의 합은 91이다.
14까지의 합은 105이다.
'''
# 서로소 판별 문제
p_a = 9
p_b = 4
# 2부터 하나씩 더해 i가 5이상인 경우에 중단
i = 2
while i < min(p_a,p_b)+1:
print('testing ...', i)
if p_a % i == 0 and p_b % i == 0 :
print('서로소가 아닙니다.')
i += 1
else: # while문이 False일때 실행됨
print('서로소입니다.')
'''
testing ... 2
testing ... 3
testing ... 4
서로소입니다.
'''
# 서로소가 아닌 경우라면?
p_a = 6
p_b = 4
i = 2
while i < min(p_a,p_b)+1:
print('testing ...', i)
if p_a % i == 0 and p_b % i == 0 :
print('서로소가 아닙니다.')
i += 1
else: # while문이 False일때 실행됨
print('서로소입니다.')
'''
testing ... 2
서로소가 아닙니다.
testing ... 3
testing ... 4
서로소입니다.
'''
# 서로소가 아닌 경우에 멈추지 않고 계속 실행되므로 제어가 필요함
# 서로소가 아닌경우 break를 실행하도록 수정하기
p_a = 6
p_b = 4
i = 2
while i < min(p_a,p_b)+1:
print('testing ...', i)
if p_a % i == 0 and p_b % i == 0 :
print('서로소가 아닙니다.')
break # break를 통한 제어 (else문은 실행되지 않는다)
i += 1
else: # while문이 False일때 실행됨
print('서로소입니다.')
'''
testing ... 2
서로소가 아닙니다.
'''
IndentationError
: 들여쓰기 오류SyntaxError
: 문법 오류 (콤마를 안찍거나 오타가 있는 경우 자주 발생)KeyboardInterrupt
: 함수 작동중에 강제로 멈추면 발생함(무한루프를 강제종료하는 경우 등등)TypeError
: 데이터 타입이 충돌하여 메소드를 쓸 수 없는 경우ValueError
라는 형태로 에러가 표시되기도 함ZeroDivisionError
: 0으로 나누려 하는 경우 발생하는 오류# 0으로 나누는 경우 (ZeroDivisionError)
def my_devide():
x = input('분자의 숫자를 입력 : ')
y = input('분모의 숫자를 입력 : ')
return int(x)/int(y)
print(my_devide())
'''
분자의 숫자를 입력 : 5
분모의 숫자를 입력 : 0
ZeroDivisionError: division by zero
'''
raise문
: raise Exception(’안내 문구')assert문
: assert 조건식, '안내 문구'# raise문
a = '1'
if type(a) != int:
raise Exception('a must be int type')
'''
Exception: a must be int type
'''
# assert문
a = '1'
# 거짓이면 문장 출력
assert type(a) == int, 'a must be int type'
'''
AssertionError: a must be int type
'''
# 참이면 문장 출력
assert not type(a) != int, 'a must be int type'
'''
AssertionError: a must be int type
'''
def my_devide():
try:
x = input('분자의 숫자를 입력 : ')
y = input('분모의 숫자를 입력 : ')
return int(x)/int(y)
except:
# 문제 발생시 실행됨
return '나누기를 실행 할 수 없음'
print(my_devide())
'''
분자의 숫자를 입력 : 5
분모의 숫자를 입력 : 0
나누기를 실행 할 수 없음
'''
def disneyland():
try:
age = int(input("나이를 입력: "))
except:
print("숫자로 나이를 입력해주세요.")
else:
# 3세 미만은 공짜
if age < 3:
fee = 0
# 3세~9세: 50,000
elif age >= 3 and age < 10:
fee = 50000
else:
fee = 100000
return fee
disneyland()
'''
나이를 입력: 훗
숫자로 나이를 입력해주세요.
'''
disneyland()
'''
나이를 입력: 22
100000
'''
def disneyland():
try:
age = int(input("나이를 입력해주세요: "))
except ValueError as e:
print("숫자로 나이를 입력해주세요.")
print(e)
else:
# 3세 미만은 공짜
if age < 3:
fee = 0
# 3세~9세: 50,000
elif age >= 3 and age < 10:
fee = 50000
else:
fee = 100000
return fee
finally:
print("디즈니 랜드에 오신 것을 환영합니다~!")
disneyland()
'''
나이를 입력해주세요: 훗
숫자로 나이를 입력해주세요.
invalid literal for int() with base 10: '훗'
디즈니 랜드에 오신 것을 환영합니다~!
'''
if문
, for문
, while문
, try문
에 대해서 살펴보았음if문
에서는 elif
, else
를 통해 예외 처리를 해주는 것이 효율적이고, 조건이 여러개인 경우엔 때로는 중첩조건문
을 통해 접근하는 것이 더 효율적인 경우도 있으므로, 경우에 따라서 잘 판단해서 사용하면 될 듯for문
과 while문
에서는 횟수에 의한 반복인 경우엔 for문을 쓰는 것이 더 효율적이고, 조건에 의한 반복인 경우엔 while문을 쓰는 것이 좋음break
를 통해 반복문을 빠져나올 수 있고, for문에서는 continue
를 통해 건너뛰는 것도 가능함else
문을 활용하여 break가 수행되지 않은 경우에 대한 실행문을 설정할 수 있음try문
을 통해 코드를 실행해보고 오류가 발생하면 except문
을 실행하도록 할 수 있고, 오류가 발생하지 않은 경우엔 동일한 들여쓰기 위치에서 else문
을 실행시킬 수 있었고 오류여부와 관계없이 finally문
을 실행시키는 것도 가능함
잘 봤습니다. 내용이 아주 알차고 정리가 잘 되어 있네요.