Input 함수파이썬에서는 단 하나 input이라는 메소드를 호출함으로써 값의 입력을 받는 단계를 모두 끝낼 수 있다. 자바에서 사용하는 Scanner도 복잡한 것은 아니지만 이렇게 쉽게 만드는 것은 어떨까라는 아쉬움이 있다. 사실 가장 큰 이유는 Python은 변수를 특정 타입으로 선언할 필요가 없어서 모든 처리들이 심플해진다. Show
위와 같이 input 이후 메세지를 입력하면, 메세지가 나오고 값을 입력 받을 수 있다. 그리고 그 값은 변수에 저장이 되는데 저 라인이 다이다. 예시를 좀 더 가시적으로 확인해보기 위해서 jupyter에서 실행한 화면을 올려보도록 한다. (소스 코드는 포스팅 하단) Input 예제 (구구단 출력)input으로 name과 구구단의 단을 입력받는 예제위 내용은 input으로 우선 사용자의 이름을 입력 받고, name이라는 변수에 저장한다. 그리고 출력하고 싶은 구구단의 단을 입력 받고, 이를 dan이라는 변수에 저장하는데 이때, 숫자를 입력해도 기본적으로 문자라고 인식되기에 int로 input을 감싸서 형변환을 수행한다.
그 이후 for문으로 1~9을 차례대로 반복하며 지정한 단수와 곱한 값을 출력하는 예제이다. input이 어떻다라는 것은 더이상 설명할 필요는 없을 것 같다. 그렇다면 다중 값을 입력받고 싶을 때 어떻게 해야 될 것인가? input 다중값 처리사실 다중값을 처리하는 방법은 매우 다양하다. input에서 값을 받고 나중에 입력 받은 값을 split등의 라이브러리를 활용하여 처리할 수도 있고, 문자열을 자르는 등의 방식을 써서 처리하는 방법들이 있다. 여기서는 split을 한 후 2개의 값을 변수에 저장해 보도록 한다. 다중 값을 입력받은 예제
input 값으로 위 예시에서는 "2 5"를 입력하였고 이 값을 split 메소드를 호출하여 분리 후 각각 dan1과 dan2에 저장한다. 이때 map() 함수는 지정된 형으로 변환하여 각각 변수에 저장하는 역할을 수행한다. 최종적으로는 이를 각각 구구단에 해당하는 단을 곱하는 for문을 실행하면서 프로그램을 종료한다. 아직 split()과 map()에 대해서 공부를 안한 사람이라면 이 포스팅은 헷갈릴 수 있다. 다만 split의 역할을 값을 분리하는 역할이고 map()으로 형변환을 해주어 각각 변수들에게 전달했다는 생각만 가지고 있으면 된다. 포스팅에 사용한 전체 코드
연관 포스팅2020/12/19 - [Language/Python] - [Python] 파이썬의 반복문(for문)
9.3.1 예외 처리란 무엇인가예외(exception)란 프로그램이 정상적으로 실행될 수 없는 상황을 뜻한다. 항상 동일하게 발생하는 오류는 프로그램을 고쳐 해결하면 된다. 하지만 프로그램 외부의 요인(사용자가 입력한 데이터·프로그램이 실행되는 환경 등)으로 발생하는 실행 오류는 어떻게 해결해야 할까? 입력 데이터와 실행 환경은 프로그램을 사용하는 사람에게 달려있다. “F1 키를 절대 누르지 마시오”, “프로그램 사용중 인터넷 연결을 끊지 마시오”라고 경고해본들, 문제는 여전히 일어날 수 있다. 외부 요인을 통제할 수 없다면, 프로그램 안에 예외 상황에 대한 대응책을 마련해두어야 한다. 이를 예외 처리(exception handling)라고 한다.
이 조리법은 조리도구와 식재료가 갖추어져 있을 것을 전제로 한다. 만약 냄비가 없다면 “냄비가 없다”라는 예외 상황이 발생하여 조리를 수행할 수 없을 것이다. 조리법을 수정하여 이 예외를 처리해보자.
수정한 조리법은 “냄비가 없다”라는 예외를 처리할 수 있다. “만약 냄비가 없을 경우 …” 라는 표현에서 알 수 있듯이, 예외 처리는 어떤 ‘조건’에 따라 실행할 지시를 ‘선택’하는 것이다. if 문으로 예외 처리를 해 보고, 더 나은 방법도 알아볼 것이다.
9.3.2 if 문으로 예외 처리하기사용자로부터 수를 입력받아 나누는 프로그램을 예로 들어 보자. 코드 9-17 예외 처리가 필요한 프로그램
이 프로그램은 사용자가
코드 9-18 if 문으로 예외 처리하기
수정한 프로그램은 ❶ if 문으로 사용자가 입력한 값을 검사하여 잘못된 값이 계산에 사용되는 것을 방지한다. if 문의 본문에는 예외를 감지한 경우의 대처법이 포함된다. 사용자가 다시 (올바른) 값을 입력하도록 요구할 수도 있고, 문제점을 알려준뒤 프로그램을 종료할 수도 있다. ❷ 코드 9-19 두 가지 예외 처리하기
사용자가 잘못된 값을 입력했을 때 입력을 다시 요청하는 것도 좋은 생각이다. 올바른 데이터를 입력할 때까지 계속 입력을 요청하도록 해야 한다면 while 문을 함께 활용하면 좋다. 코드 9-20 올바른 값이 입력될 때까지 반복 입력하기
코드 9-20은 ❶ while 문을 이용한 무한 반복 블록 안에서 입력과 예외 처리를 계속 반복한다. 잘못된 값이 입력됐을 때는 ❷ continue 문으로 반복 블록을 처음부터 다시 수행하도록 하여 값을 다시 입력받는다. 올바른 값이 입력됐을 때는 ❸ break 문으로 반복을 중지한다. 실행 결과:
9.3.3 if 문을 이용한 예외 처리의 한계if 문을 이용해 예외 처리를 하면 몇 가지 문제점이 있다.
오류 코드와 정상 값을 구별하는 문제함수 안에서 예외 처리를 할 때는 생각해 보자. 함수는 return 문을 이용해 결과를 반환한다. 그런데 함수 호출 도중에 예외가 발생한다면, 예외가 발생한 사실을 함수 밖으로 어떻게 알릴 수 있을까? 코드 9-21은 네트워크에 연결된 컴퓨터와 신호를 주고받는 데 걸리는 시간을 측정하여 반환하는 함수다. 정상적인 경우에는 응답에 걸린 시간을 수로 반환할 것이다. 하지만 서버에 접속할 수 없는 경우에는 어떤 값을 반환해야 할까? 코드 9-21 함수 밖으로 예외 전달하기
위 코드의 오류 코드는 함수마다 제각각 정의하게 될 가능성이 높다. 오류 코드는 ‘비정상적인 반환값’이어야 하는데, 그런 값은 함수마다 다를 수밖에 없기 때문이다. 예컨대 양수를 반환하는 함수는 음수를 오류 코드로 약속할 수 있겠지만, 음수를 반환하는 함수는 그렇게 할 수 없다. 모든 함수에서 사용할 수 있는 통일된 오류 코드를 만들기 어렵다. 함수를 연달아 호출할 때, 예외 처리를 중복으로 해야 하는 문제함수를 연달아 호출할 때, 함수 밖으로 오류 코드를 전달하려면 호출되는 함수들 속에서 예외 처리를 중복으로 해야 한다. 앞의 코드 9-22 함수 밖으로 전달된 예외를 더 바깥으로 전달하기
에외를 미리 검사해야 하는 문제다음 두 지시를 비교해 보자.
둘다 냄비가 없는 상황을 상정한 조리법이지만 접근법이 다르다. 1은 먼저 허락을 구한 뒤에 일을 하는 방법이다. 2는 일을 먼저 하고, 문제가 생기면 다른 용서를 구하는 방법이다. 1은 확인을 한 직후에 순식간에 상황이 바뀌어 버리면(확인할 때는 냄비가 있었는데, 조리할 때는 사라진 경우) 예외 처리를 할 수 없다는 단점이 있다. 9.3.4 try 문: 잠재적인 예외 처리하기파이썬에서 예외 처리를 올바르게 하는 방법은 try 문을 사용하는 것이다. try 문을 사용하면 다음과 같은 장점이 있다.
이 세 장점은 모두 앞에서 살펴본 if 문의 한계를 해결한 것이다. try 문과 except 절try 문은 except 절과 함께 사용한다. ‘try’는 ‘시도하라’라는 뜻이다. try 문의 본문 블록에 예외 발생 가능성이 있는 코드를 기술하여, 코드를 일단 ‘시도해’ 보도록 한다. ‘except’는 ‘~를 제외하고’라는 뜻이다. except 절에는 처리할 예외의 종류와 처리 방법을 기술한다. 예외의 종류에 따라 그 대처법도 다를 것이므로, 하나의 try 문은 여러 개의 except 절을 포함할 수 있다. 하지만 예외를 하나도 처리하지 않는다면 try 문 자체가 필요 없을 것이므로, except 절이 최소한 하나는 있어야 한다.
‘예외종류’란 예외를 나타내는 클래스다. 파이썬에는 다양한 예외 상황이 클래스로 정의되어 있다. 발생한 예외가 어떤 예외인지 알기 위해서는 오류 메시지를 확인하면 된다. 예를 들어, 0으로 나누는 오류의 메시지를 대화식 셸로 확인해 보면 다음과 같은 오류 메시지를 얻을 수 있다. 코드 9-23 0으로 나누는 오류의 오류 메시지
오류 메시지의 마지막 행이 오류의 종류와 내용을 알려주는 행이다. 여기서 콜론( try 문을 이용해 0으로 나누는 오류와 사용자가 입력한 값을 정수로 변환할 수 없는 오류를 처리해 보자. 코드 9-24 0으로 나누는 오류의 오류 메시지
if 문을 이용한 코드 9-18에서는 계산을 실행하기에 앞서 값이 정수로 변환할 수 있는 문자열인지, try 문을 사용할 때도, 사용자가 올바른 값을 입력할 때까지 계속 반복 입력받도록 할 수 있다. try 문 전체를 while 문으로 감싸고 정상 실행되었을 때 break 문으로 반복 블록을 빠져나오면 된다. 코드 9-25 올바른 입력을 반복하여 요구하기
try 문의 본문을 실행하는 도중 예외가 발생한 경우에는 본문의 나머지 내용을 실행하지 않고, 그 예외를 처리할 수 있는 except 절을 실행한다. 따라서 코드 9-25에서
try 문의 else 절try 문에도 else 절을 작성할 수 있다. else 절에 작성한 코드는 try 문의 본문을 다 실행할 때까지 예외가 발생하지 않은 경우에 실행된다. try 절의 작성 양식에 else 절을 추가해 두자.
else 절을 이용하면 코드 9-25를 다음과 같이 수정할 수 있다. 코드 9-26 try 문에서 else 절 사용하기
try 절의 본문에 작성하지 않고 else 절에 코드를 작성하는 이유는 의도하지 않은 예외 처리를 방지하기 위해서다. 예외 처리의 대상이 되는 코드와 이어서 수행될 코드를 명시적으로 구별하는 것이다. 처리되지 않은 예외의 전파try 문은 except 절에 처리할 예외를 명시한다. except 절에서 처리하지 않은 예외가 발생한다면 어떤 일이 일어날까? 직접 확인해보자. 코드 9-26를 실행하고, 수를 입력하는 대신 실행 결과 (
파이썬 프로그램 실행중에 Ctrl + C 키를 입력하면 try 문을 빠져나온 예외는 그 바깥쪽의 try 문으로도 처리할 수 있다. 코드 9-27 try 문을 빠져나온 예외 처리하기
코드 9-27을 실행하고 Ctrl + C 키를 입력해보면 세번째 블록인 안쪽 try 문에서 예외가 발생했지만 try 문 블록과 while 문 블록을 빠져나가 바깥쪽 try 문에서 처리되는 것을 확인할 수 있다. 실행 결과 (
예외가 코드 블록 안에서 발생하는 경우 예외 객체는 가장 가까이 있는 try 문이 처리할 때까지 코드 블록을 차례대로 빠져나간다. 이 특징을 이용하면 함수 호출 안에서 일어난 예외를 함수 호출 밖에서 처리할 수 있다. 코드 9-28 함수 연쇄 호출 속의 오류
위 코드는 사용자가 무엇을 입력하느냐에 따라 정상 실행될 수도, 오류를 일으킬 수도 있다. 그런데 예외 처리를 어디에서 해야 할까? 코드 9-29 함수 연쇄 호출 속의 오류 처리하기 (불필요한 방법)
위 코드와 같이 모든 함수에서 예외를 처리할 필요는 없다. try 문을 사용하면 안쪽에서 발생한 오류를 바깥에서 처리할 수 있다. 예외가 실행 흐름을 따라 밖으로 빠져나오는 경우, 그 사이의 한 지점에서 한 번만 예외를 처리해주면 된다. 코드 9-30 함수 연쇄 호출 속의 오류 처리하기
위 코드는 try 문을 사용하는 방식을 if 문을 사용할 때와 비교해 보자. if 문을 사용할 때는 코드를 실행하기 전에 예외 상황을 미리 검사해야 했다. 그리고 예외 정보를 함수 밖으로 전달하기 위해 return 문과 오류 코드를 써야 했다. try 문을 사용할 때는 예외 상황을 미리 검사하지 않는다. 예외는 함수 호출과 코드 블록을 저절로 빠져나오며, 원하는 위치에서 처리할 수 있다. try 문을 이용하면 if 문보다 편리하고 정확하게 예외 처리를 할 수 있다. 실행시간 오류는 try 문으로 예외 처리하는 것을 기억하자.
연습문제연습문제 9-3 사칙연산 예외 처리 연오는 사용자로부터 수 두 개를 입력받아 사칙연산 결과를 화면에 출력하는 프로그램을 다음과 작성했다.
이 프로그램을 실행하고, 두번째 수에 0을 입력하면 오류가 발생한다. 실행 결과:
이 프로그램을 try 문을 이용해 수정해라. 사용자가 두번째 수에 0을 입력했을 때, 오류를 일으키지 말고 나눗셈 연산의 결과가 None이 되도록 한다. 올바른 실행 결과:
|