학습 내용 요약
- 조건문
- 반복문
- 예외 처리
- 함수
조건문은 특정 조건에서 수행되는 연산을 구성한 것이라고 할 수 있겠다. 조건문에 쓰이는 특수한 문구가 if, elif, else가 있는데, elif는 해당 조건을 만족하면 다른 조건은 연산하지 않고 넘어가는 특징이 있다. 코드를 직접 보면서 이해하는 것이 낫겠다.
기본 구조
def 함수명(매개변수):
수행문
money = 1000
if money > 10000:
print('차 빌리자!')
elif money > 4000: -> 조건 만족하면 다른 if, elif, else 무시
print('택시 타자')
elif money > 1200:
print('버스 타자')
else:
print('걸어가자...')
만약 이럴 경우
if money > 10000:
print('차 빌리자!')
if money > 4000: -> 조건 만족해도 다른 if, else도 연산
print('택시 타자')
if money > 1200:
print('버스 타자')
else:
print('걸어가자...')
두 번째 경우처럼 하면, 모든 if에 대해 비교 연산을 수행하니 시간도 더 걸리고, 결과도 제대로 나오지 않기 때문에, 웬만하면 저렇게 만들지 말자.
반복문은 같은 연산을 원소별로 반복하면서 출력하도록 구성된다. 반복문을 수행하기 위해서는 반복 가능한 자료형이 필요한데, 리스트, 딕셔너리, 튜플, 집합, 문자열, range 등이 있다. 코드를 보자.
기본 구조
for 변수 in 반복 가능 자료형:
수행문
for i in range(10): -> range는 범위를 나타내는 함수로 맨 끝 숫자는 제외한다.
print(i)
fruits = ['귤','복숭아','청포도','딸기','레드향','망고']
for i, fruit in enumerate(fruits): # 인덱스, 값 동시에 가져옴
print(i, fruit)
if i == 3:
break -> 연산을 강제 종료하고 끝냄
for i, fruit in enumerate(fruits): -> enumerate는 값의 인덱스 번호, 값을 함께 반환한다.
if len(fruit) == 3:
continue -> 연산을 넘기고 반복문 첫줄로 돌아감
else:
print(i,fruit)
프로그래밍을 하다보면 여러 오류가 발생하는데, 오류를 무시하거나 적절한 처리 방식을 설정할 수 있다. 이를 위해 작업하는 것이 예외 처리이다. (그러나, 실제 코딩할 때는 어디서 오류가 났는지 찾기 어려울 수 있기 때문에 잘 사용하지 않는 때가 많다고 한다.)
1) 어떤 오류가 있지?
- 없는 파일을 여는 경우 (FileNotFoundError)
- 0으로 나눈 경우 (ZeroDivisionError)
- 인덱스 오류 (IndexError)
- ...
위와 같은 경우 외에도 무수히 많다. 물론 모두 외울 수는 없고 에러가 발생했을 때 잘 대처하는 방법을 배워놓자.
2) 처리 기법
오류를 처리하는 구문을 살펴보자. 생각보다 간단하다.
기본 구조
try:
수행문
except:
수행문
for person in people:
try:
if person['age'] > 20:
print(person['name'])
except:
name = person['name']
print('{}님 자료는 오류입니다.'.format(name))
미리 정해놓은 에러 발생 시 except문이 수행되도록 할 수도 있다.
try:
4 / 0
except ZeroDivisionError as e: -> 특정 에러일 때 발생 + 에러 메시지 표시
print(e)
try문에는 무조건 실행되는 finally절도 쓸 수 있다. 이는 오류 발생 여부 상관없이 무조건 실행되는데, 보통 리소스를 닫을 때 사용한다.
f = open('foo.txt', 'w')
try:
수행문
finally:
f.close()
오류를 그냥 넘기는 방법도 있다. 아직 정확히 어떨 때 쓰면 좋은지 모르겠지만, 다음과 같이 쓸 수 있다.
try:
f = open("나없는파일", 'r')
except FileNotFoundError:
pass -> 에러가 발생했지만, 일단 넘김
이외에 에러를 일부러 발생시키거나, 사용자 정의의 에러를 만들어서 사용하기도 하는데 이는 다음에 살펴보도록 하자.
함수는 반복해서 쓰는 코드들에 이름을 붙인 것인데, 연산의 반복되는 부분을 묶어서 쓰기 간편하게 만든 것이 함수이다. 코드를 보며 구조를 익히자.
기본 구조
def 함수명(매개변수):
수행문
def check_gender(pin):
back_num = pin.split('-')[1]
if int(back_num[0]) % 2 == 1:
return '남자'
else:
return '여자'
sex = check_gender('200101-3012345')
print(sex)
이런 경우는 어떤가?
def cal(a,b):
return a+b
def cal(a,b):
print(a+b)
위의 경우는 return이라는 결과값이 있는 것이고, 아래는 함수 내에 수행문이 있는 경우이다. 즉, 결과값이 없는 경우이다. 따라서 아래 함수를 print 해보면 결과값이 없다는 None을 출력한다.
이처럼 결과값이 없는 함수가 있고, 입력값이 없는 함수도 있다. 물론 둘 다 없는 함수도 만들 수 있다.
def hi():
return 'hi'
def hi():
print('hi')
함수를 호출할 때 매개변수를 지정해서 호출할 수도 있다.
def cal(a,b):
return a+b
sum = cal(b=6, a=5)
print(sum)
함수의 결과값은 언제나 하나다. 따라서, return을 여러개를 써도 맨 처음의 것만 출력한다.
def cal(a,b):
return a+b
return a/b
아래의 경우는 어떨까?
def cal(a,b):
return a-b, a/b
result = cal(4,2) -> result = (2,2)
result1, result2 = cal(4,2) -> result1, result2 = (2,2)
위처럼 return에 한 줄로 써주면, 하나로 묶어서 반환해 준다.
더 많은 함수의 특징은 다음에 추가로 살펴보기로 하고, 이번에 배운 특정 함수 몇 개를 살펴보고 넘어가자.
기본 구조
list(map(함수, 반복 가능 자료형))
people = [{"name":'bob','age': 20},
{'name':'carry','age':21},
{'name':'john','age':26},
{'name':'smith','age':15},
{'name':'ben','age':34}]
def check_adult(person):
return ('성인' if person['age'] > 20 else '청소년')
result = list(map(check_adult,people))
-> ['청소년','성인','성인','청소년','성인']
map함수는 어떨 때 사용하면 좋을까? 아마 일일이 원소별로 함수를 적용해 하나씩 추가해서 다시 리스트로 만드는 긴 과정을 축약하는데 쓰면 좋을 것이다.
a_list = [1,2,3,4,5]
b_list = []
for i in a_list:
i += 1
b_list.append(i)
def add_one(i):
return i+1
result = list(map(add_one,a_list))
기본 구조
list(filter(함수, 반복 가능 자료형))
target = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def is_even(n):
return True if n % 2 == 0 else False
result = list(filter(is_even, target))
-> [2,4,6,8,10]
기본 구조
lambda 매개변수: 수행문
lambda x: x+1
(lambda x: x+1)(3) -> 이처럼 정의 후 바로 사용할 수 있다.
people = [{"name":'bob','age': 20},
{'name':'carry','age':21},
{'name':'john','age':26},
{'name':'smith','age':15},
{'name':'ben','age':34}]
result = list(map(lambda x: '성인' if x['age'] > 20 else '청소년',people))
기본적인 사용법은 대략적으로 이해했다. 하지만, 조건문, 반복문, 함수 등을 적절히 섞어서 활용하는 것과 각각의 심화적인 내용을 풀어내기에는 아직 역부족이라는 것을 문제를 풀 때마다 느낀다. 계속 생각하고, 풀어보고, 돌아보고 하는 과정을 반복하면 어느새 응용도 잘하는 개발자가 되지 않을까 싶다.