Media Log

1. 예외 처리(Exception Handling)


오늘은 예외 처리(Exception Handling)에 대해 알아보려고 합니다. 여기서 '예외(Exception)'란 어떤 것일까요? 우리가 프로그램을 사용하다 보면 예기치 못한 상황으로 에러가 발생하여 비정상 종료되는 경험을 해보신적이 있으신가요? 예를 들어, 프로그램 내에서 존재하지 않는 파일을 열려고 한다던가 피제수를 0으로 나누려고 하는 등 런타임 도중 발생하는 에러를 예외라고 하며, 이는 프로그램의 작업 수행을 막아버리는 존재입니다. 우선 예외가 발생하는 상황을 한번 보도록 하겠습니다.

>>> 2013 * (1229/0)
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    2013 * (1229/0)
ZeroDivisionError: division by zero
>>> open('notfind.txt', 'r')
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    open('notfind.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'notfind.txt'
>>> lst = [1, 2, 3, 4]
>>> lst[5]
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    lst[5]
IndexError: list index out of range

위를 보시면, 피제수를 0으로 나누려고 하니 ZeroDivisionError란 예외가 발생하고, 존재하지 않는 파일을 열려고 하니 FileNotFoundError란 예외가 발생하며, 위치(index)가 범위를 벗어나면 IndexError란 예외가 발생합니다. 이 밖에도 예외는 여러가지가 있으며 파이썬에서는 이런 예외를 처리하여 실행 도중에 에러가 발생해도 예외를 무시하거나 따로 처리할 수 있도록 try와 except란 녀석을 지원합니다. 한번 보도록 할까요?


2. try~except


파이썬에서 예외를 처리하기 위해서는 try~except절을 사용할 수 있는데, 아래는 이 절의 기본적인 형태입니다.

try:
   예외를 유발할 수 있는 구문
except <예외 종류>:
   예외 처리를 수행하는 구문

위의 형태를 한번 봐보시면, try절의 영역에는 예외가 발생할 수 있는 구문이 들어가며 except절의 영역에서는 try절에서 예외가 발생하였을때 잡아서 처리를 수행하는 구문이 들어갑니다. 우선은 먼저 try~except절이 사용된 예제를 보고 설명해드리도록 하겠습니다. (예외 구조도를 참고하시려면 여기를 클릭하세요)

>>> try:
	a = 10 / 0
except ZeroDivisionError:
	print('제수는 0이 될 수 없습니다!')

제수는 0이 될 수 없습니다!

위의 예제를 보시면, try절의 영역 내에서 ZeroDivisionError 예외가 발생할 때 그 예외를 잡아 처리하는 문장입니다. 피제수를 제수로 나눌 때, 제수가 0일 경우 '제수는 0이 될 수 없습니다!'라는 문장을 출력합니다. 이번에는 다른 예제를 보도록 하겠습니다.

>>> try:
	a = int(input("첫번째 숫자를 입력하세요: "))
	b = int(input("두번째 숫자를 입력하세요: "))
	print("a + b = ", a + b)
except ValueError:
	print('값이 적절하지 않습니다.')

첫번째 숫자를 입력하세요: 50
두번째 숫자를 입력하세요: 이십
값이 적절하지 않습니다.

위 예제에서는 input 내장 함수로 입력받은 값이 적절하지 않은 값이라면 ValueError 예외가 발생하여 '값이 적절하지 않습니다.'라는 문장을 출력시킵니다. 위에서는 a에 50이란 정상적인 값이 들어갔지만, b에는 '이십'이란 문자열을 입력받아 이를 정수로 변환시키려 하니 에러가 발생한 것입니다. 이제는 위 예제들을 적절히 섞어서 여러 개의 예외를 처리하는 예제를 한번 보도록 하겠습니다.

>>> try:
	a = int(input("피제수를 입력하세요: "))
	b = int(input("제수를 입력하세요: "))
	print("a / b = ", a / b)
except ValueError:
	print('값이 적절하지 않습니다.')
except ZeroDivisionError:
	print('제수는 0이 될 수 없습니다!')
	
피제수를 입력하세요: 10
제수를 입력하세요: 0
제수는 0이 될 수 없습니다!

위 예제를 보시면 except절은 한번만 사용될 수 있는게 아니라, 여러번 등장이 가능합니다. 위와 같이 예외 처리 영역을 나눌 수도 있지만, 아래와 같이 예외 처리 영역을 합칠 수도 있습니다.

>>> try:
	a = int(input("피제수를 입력하세요: "))
	b = int(input("제수를 입력하세요: "))
	print("a / b = ", a / b)
except (ValueError, ZeroDivisionError):
	print('제수가 0이거나 값이 적절하지 않습니다.')

피제수를 입력하세요: 10
제수를 입력하세요: 영
제수가 0이거나 값이 적절하지 않습니다.

위 예제에서는 소괄호를 사용하여 튜플을 이용해 예외를 처리합니다. 만약 try절의 영역 내에서 ValueError가 발생해도 예외가 처리되며, ZeroDivisionError가 발생해도 except절의 예외 처리 영역으로 이동합니다. 이 말은 즉슨, 튜플 내에 명시된 에러를 모두 처리하겠다는 말이 됩니다. 한마디로 말하자면 에러를 묶어서 처리하는 방법입니다. 마지막으로, 예외 인스턴스 객체를 통한 예외를 처리하는 방법을 보도록 하겠습니다.

>>> try:
	a = 50 / "이십"
except TypeError as e:
	print('예외:', e.args[0])
	
예외: unsupported operand type(s) for /: 'int' and 'str'

위 예제를 보시면, 에러 메시지를 담은 예외 인스턴스 객체를 e로 받아서 사용하는데 이 변수를 통해서 추가적인 정보를 출력해낼 수 있습니다. 위에선 정수와 문자열 간의 나눗셈 연산은 지원하지 않는다는 에러 메시지가 출력됩니다. 여기까지 잘 따라오셨나요? 그럼 다음으로 넘어가겠습니다.


3. else


except절이 예외가 발생하면 처리하는 영역이라면, else절은 예외가 발생하지 않았을 경우에 작업이 수행되는 영역입니다. 이 else절은 모든 except 절의 가장 마지막에 등장하여야 하며, 필요에 의해 else절을 달 수도 있고 달지 않을 수도 있습니다. 한마디로 선택적으로 사용할 수 있다는 것입니다. 우선은 try~except~else절의 기본적인 형태를 보도록 하겠습니다.

try:
   예외를 유발할 수 있는 구문
except <예외 종류>:
   예외 처리를 수행하는 구문
else:
   예외가 발생하지 않을 경우 수행할 구문

위 try절의 영역에서 예외가 발생하면, except절의 예외 처리 영역으로 이동하지만 예외가 발생하지 않는다면 else절의 영역으로 이동합니다. 우선은 예제를 먼저 보도록 하겠습니다.

>>> try:
	f = open('test.txt', 'r')
except IOError:
	print('파일을 열지 못했습니다.')
else:
	print('test.txt:', f.read())
	f.close()

test.txt: 테스트 파일!

위 예제는 test.txt 파일을 읽기 모드로 여는데 I/O에 관련된 예외가 발생하면 '파일을 열지 못했습니다.'라는 문장이 출력되고, 예외가 발생하지 않았다면 그 파일의 내용을 출력하고 파일을 닫습니다. 간단하죠? 


4. finally


finally절은 예외가 발생하든 말든 실행되는 영역입니다. try 영역이 실행되고 나서, 예외 발생여부와 상관없이 무조건 수행되는 영역입니다. 이 finally절도 else절과 같이 선택적으로 사용할 수 있는 영역입니다. 우선은 try~except~finally절의 기본적인 형태를 보도록 하겠습니다.

try:
   예외를 유발할 수 있는 구문
except <예외 종류>:
   예외 처리를 수행하는 구문
finally:
   예외 발생 여부과 상관없이 항상 실행되는 구문

위 try절의 영역에서 예외가 발생하든 발생하지 않든 finally절 영역의 구문이 실행됩니다. 간단하게 한번 예제를 보도록 하겠습니다.

>>> try:
	a = 10 / 0
except ZeroDivisionError:
	print('제수는 0이 될 수 없습니다!')
finally:
	print('무조건 실행되는 영역!')

제수는 0이 될 수 없습니다!
무조건 실행되는 영역!

위 예제에서는 try절의 영역에서 ZeroDivisionError 예외가 발생하지만, 그것과는 관계없이 finally절의 영역으로 들어가는 것을 보실 수 있습니다. 직접 예제에서 제수가 0이 아닌 다른 수로 바꾸어 예외가 발생하지 않게 되더라도 finally절 영역으로 들어가서 '무조건 실행되는 영역!'이라는 문장을 출력합니다.


5. raise


예기치 못한 상황으로 예외가 발생하는 경우도 있지만, 의도적으로 개발자가 예외를 발생시켜야 할 경우도 있습니다. 이럴 경우 raise 구문을 통하여 해당하는 예외를 강제로 발생시킬 수 있습니다. raise 구문을 사용하는 방법은 아래와 같습니다.

raise [예외]
raise [예외(데이터)]

예를 들어서 'raise TypeError'는 TypeError 예외를 강제적으로 발생시키게 하는 것이고, 'raise NameError("데이터!")'는 TypeError 예외를 강제로 발생시키면서 '데이터!'를 예외의 인자로 지정하는 것입니다. 우선은 먼저 예제를 보고 raise문이 어떤 역할을 하는지 보도록 하겠습니다.

>>> raise NameError
Traceback (most recent call last):
  File "<pyshell#116>", line 1, in <module>
    raise NameError
NameError
>>> raise NameError('예외 발생!')
Traceback (most recent call last):
  File "<pyshell#117>", line 1, in <module>
    raise NameError('예외 발생!')
NameError: 예외 발생!

위 예제를 보시면, raise 구문을 통해 NameError 예외를 강제로 발생시키고 있습니다. 두번째 raise 구문은 예외의 인자를 지정해 준 것으로써, 지정한 인자와 함께 같이 출력이 되는 것을 확인하실 수 있습니다. 다른 예제를 한번 보시죠.

>>> try:
	a = int(input('피제수를 입력하세요: '))
	b = int(input('제수를 입력하세요: '))
	if a <= 0 or b <= 0:
		raise ArithmeticError('피제수 혹은 제수가 0 이하일 수 없습니다.')
except ArithmeticError as e:
	print('예외 발생:', e.args[0])

피제수를 입력하세요: 2030
제수를 입력하세요: -10
예외 발생: 피제수 혹은 제수가 0 이하일 수 없습니다.

위 예제에서는 피제수 혹은 제수가 0 이하일 경우 ArithmeticError 예외를 발생시키도록 하였습니다. 피제수는 0 초과니 조건 성립이 되지 않았지만, 제수가 -10로 0 이하의 수니 조건문이 실행되어 예외를 발생시킨 것입니다. 이해가 되시나요? 아직 이해가 되지 않으신것 같다면 위에 있는 예제들을 응용하여 코드를 여러번 작성하여 보도록 해보세요. 계속 경험과 노력이 쌓이다 보면 그에 따른 좋은 결과가 있으리라 믿습니다.

저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2014.01.02 07:12 신고 [edit/del]

    예외처리 잘 배웠습니다. 감사합니다. ^^

    Reply
  2. YOONKIM at 2014.03.05 10:13 신고 [edit/del]

    이제 시작하는 입장에서
    정말 좋은 정보 감사드립니다~

    Reply
  3. purble place at 2014.03.26 15:42 신고 [edit/del]

    취미로 배우고있는데 감사합니다.
    IDLE (Python GUI) 기본사용법중에 몇가지 질문드려요.

    1.줄번호표시법
    2.화면청소법(새글로 만들면 메모장이되고, Ctrl+F6은 청소없이 리스타트만되더군요.)

    Reply
  4. dltn at 2014.05.13 21:06 신고 [edit/del]

    우와,...책쓰셔도되겟네요..다음강의빨리업뎃됫으면 ㅠ

    Reply
  5. 이제시작 at 2014.06.02 19:49 신고 [edit/del]

    마지막 강의까지 잘 봤습니다., 이 정도면 기초프로그래밍 단계에 해당되는건 다 본게 맞나요?

    Reply
    • BlogIcon EXYNOA at 2014.06.03 16:42 신고 [edit/del]

      네, 기초 프로그래밍 단계에 있는건 어느정도 아시는 수준이 되신 것이 맞습니다. 그렇지만, 제 강좌가 내용이 부실하여 책 혹은 다른 강좌를 통해서 내용을 보태주시는게 좋습니다.

  6. BlogIcon 김모 at 2014.06.12 17:28 신고 [edit/del]

    휴 이제야 다 봤네요.
    도움 많이 됐습니다. 감사합니다 ^^

    Reply
  7. 민씨 at 2014.08.22 16:28 신고 [edit/del]

    글 너무 잘보았습니다. 정말 중요한 내용 위주로 쉽게 설명해주셔서 감탄했습니다.

    아래 예제를 실행해보았는데요.
    오류가 나네요. 왜 그런지 알 수 있을까요?

    try:
    a = int(input("피제수를 입력하세요: "))
    b = int(input("제수를 입력하세요: "))
    print("a / b = ", a / b)
    except (ValueError, ZeroDivisionError):
    print('제수가 0이거나 값이 적절하지 않습니다.')

    피제수를 입력하세요: 1
    Traceback (most recent call last):
    File "<pyshell#57>", line 2, in <module>
    a = int(input("피제수를 입력하세요: "))
    TypeError: 'str' object is not callable

    Reply
  8. Mini at 2014.09.23 22:51 신고 [edit/del]

    안녕하세요, 좋은 강좌 처음부터 끝까지 정말 잘 보고 갑니다.

    강좌를 보고 따라하는 도중 이런 에러가 뜨는데, 어째서인지 알 수 있을까요?

    >>> try:
    a = int(input("피제수를 입력하세요 : ")
    b = int(input("제수를 입력하세요 : ")

    SyntaxError: invalid syntax

    a 까지는 되는데 b 값을 입력하는 소스를 치면 에러가 나네요..

    Reply
    • BlogIcon EXYNOA at 2014.09.24 01:49 신고 [edit/del]

      괄호가 끝까지 입력되지 않았습니다. 아래와 같이 수정하세요.

      try:
      a = int(input("피제수를 입력하세요 : "))
      b = int(input("제수를 입력하세요 : "))
      ..

  9. j ha at 2014.11.19 18:27 신고 [edit/del]

    끝까지 다 봤네요. 정말 감사합니다. 복받으세요^^

    Reply
  10. 탈출77 at 2015.01.01 17:20 신고 [edit/del]

    안녕하세요 Python 초보자 입니다.
    강의 잘보고 있습니다. 문의 사항이 있습니다.

    try:
    a = int(input("Input First Num : "))
    b = int(input("Input Second Num : "))
    print("a + b = ", a + b)
    except ValueError:
    print('Not Proper')

    위 코드를 실행 후 입력을 'a' 문자로 주면 except 로 잡혀야 되는데요
    아래 처럼 나옵니다. 대신 ValueError 을 제거 하면... 동작 하던데요.
    Python 2.7 에서 실행 했습니다. 다른 무언가가 있는 가요???

    Input First Num : a
    Traceback (most recent call last):
    File "C:\workspace\PYTHON\Hellow\src\exception.py", line 2, in <module>
    a = int(input("Input First Num : "))
    File "C:\eclipse\plugins\org.python.pydev_3.9.0.201411111611\pysrc\pydev_sitecustomize\sitecustomize.py", line 141, in input
    return eval(raw_input(prompt))
    File "<string>", line 1, in <module>
    NameError: name 'a' is not defined

    Reply
    • BlogIcon EXYNOA at 2015.01.04 23:01 신고 [edit/del]

      2.7에서는 python builtin 중 input()이 eval(raw_input())와 같은 기능을 하기 때문에 a라는 변수가 정의되지 않았다고 eval에서 에러를 내뱉는 것입니다. input()를 raw_input()으로 바꾸어서 사용하세요.

  11. at 2015.08.11 12:53 신고 [edit/del]

    안녕하세요! 프로그래밍을 처음 접하는데 글들이 많은 도움이 되었습니다. 감사합니다^^
    질문이 있는데 어디다가 해야할지 몰라서 올려봅니다(실례가된다면 지우겠습니다..)
    파이썬 3.4버전에서
    현재 시간을 표시하려면
    >>>import time
    >>>time.asctime()
    인데
    이걸 IDLE 대화식 인터프리터에서 치면 잘 실행이 됩니다.
    그런데 IDLE 상단메뉴 file 에서 new file 을 만들어
    >>>가 뜨지않는 창에서 작성한 후 ti.py로 저장한 후
    run module 을 누르면 초기 IDLE창에 RESTART만 뜨고 시간이 안뜹니다..

    또 도스창에서 cd C:\
    cd Ptyhon34
    Python ti.py 를 쳐도 실행이 안되구요...
    그냥 바로 ti.py파일을 더블클릭해 실행하면 수행 후 곧바로 도스 창이 닫히니까
    input('Type Enter key..')를 마지막에 치고 저장하면
    도스창에 Type Enter key.. 만 떠요

    그렇다고 대화형 인터프리터에서(>>>가 뜨는창) 저 모든걸 치면 창내에서 줄 바꿀때마다 시간이랑 결과는 바로바로 뜨는데
    저장했을시 더블클릭해 실행하거나 도스창에서 실행하거나 IDLE에서 import ti.py로 실행하거나 Run Module을 하면
    File "ti.py", line 1
    Python 3.4.3 <v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40> [MSC v.1600 64 bit <AMD64>] on win34
    ^
    SyntaxError: invalid syntax
    라면서 오류가 나구요..

    달력 띄우는 것인
    import calendar
    calendar.prmonth(2015,8)
    로 똑같이 했을땐 도스창에서 디렉토리로 이동해서 수행하는것도 잘 되고,
    저장한 파일 더블클릭해서 수행하는것도 바로 안꺼지고 달력과 함께 Type Enter key 뜨면서 잘되고
    IDLE에서 RUN MODLUE해서 하는것도 잘되는데... (아 그리고 대화형 인터프리터에서 import cal 쳤을때두요)

    뭐가 문제일까요? ㅠㅠ

    Reply
    • BlogIcon EXYNOA at 2015.11.13 17:16 신고 [edit/del]

      print 함수를 통해 time.asctime()로 반환되는 값을 출력해보시기 바랍니다.
      print(time.asctime())로 수정해보시고 다시 한번 답글 달아주세요.

      두번째 질문은 실행하려는 파이썬 스크립트의 내용이 구체적으로 어떤 것인지 확인할 필요가 있습니다.

  12. 그레이트 at 2015.11.10 10:51 신고 [edit/del]

    감사하네요.
    파이썬에서 ᅟmodule 이름을 어떻게 알아야 되는가요?
    기정으로 제공하는 module은 뭔지 설명해주시면 감사하겠네요.

    Reply
  13. swyshy at 2017.01.25 13:42 신고 [edit/del]

    e.arg[0]는 무슨 용도로 쓰인 것 인가요?

    Reply
  14. lee at 2017.02.02 01:12 신고 [edit/del]

    자세한 설명 감사합니다. 종종 방문하겠습니다 ^^

    Reply

submit

1. 파일 입출력(File Input/Output)

 

오늘은 파일 입출력에 대해서 알아보도록 하겠습니다. 전 강좌에서는 화면에서 출력하고 입력하는 방법을 알아봤다면, 이번에는 파일에 출력하고 입력하는 것을 알아보도록 하겠습니다. 파일을 읽고, 쓰고, 덧붙이는 등 세밀하게 작업을 위해 파이썬에서는 open이란 함수를 지원하는데 이 함수의 기본형은 아래와 같습니다.

파일객체 = open(file, mode)

기본적으로 들어가는 두 인자 중 file이란 인자에는 파일 이름이 이곳에 들어가고, mode에는 파일을 열 때 사용하는 모드를 말합니다. 여기서 파일을 열 때 사용하는 모드란 쓰기 모드, 읽기 모드 등과 같이 파일에 무언가를 쓸때는 쓰기 모드, 무언가를 읽어들일 때는 읽기 모드를 사용합니다. 아래에 mode에 들어갈 수 있는 것을 표로 정리해 두었습니다.

 

모드

설명

r

읽기 모드 (디폴트)

r+

읽기 + 쓰기 모드

w

쓰기 모드

a

쓰기 + 이어쓰기 모드

t

텍스트 모드 (디폴트)

b

바이너리 모드

 

위에 있는 모드들은 독립적으로 사용되는게 아니라, 서로 모드를 조합해서 사용이 가능합니다. 예를 들면, 'wb'는 바이너리 쓰기 모드가 되며 'rb'는 바이너리 쓰기 모드가 되는 것입니다. 파일을 쓰기 모드로 개방하여 임의의 문자열을 작성해보도록 할까요? 아래 예제를 보면서 open 함수를 통해 파일을 어떻게 만들고 쓰는지 알아보도록 합시다.

>>> f = open('t.txt', 'w')
>>> f.write('abcdefghijk')
11
>>> f.close()

위 예제의 1행을 보시면 't.txt란 파일을 쓰겠다'라는 의미가 됩니다. 이렇게 파일을 쓰기 모드로 열게 되면, 현재 디렉토리에 t.txt란 파일이 없다면 t.txt 파일을 새로 만들게 됩니다. 만약 이미 존재한다면 내용을 모두 지우고 새로 쓰게 되는 것입니다. 이어서 2행에서는 write란 함수를 통해서 파일에 임의의 문자열을 쓸 수 있는데, 이 write 함수는 말 그대로 파일에 문자열을 쓰고 싶을때 이용하는 함수입니다. 3행에서는 write 함수를 호출하여 몇 바이트나 썼는지 정수로 반환해준 값이 나온 것입니다. 마지막으로 4행에서는 파일의 사용이 모두 끝났으므로 파일 객체를 닫는 close 함수를 호출함으로써 마무리를 하게 됩니다. 이번에는 방금 쓴 파일을 읽어보도록 하겠습니다.

>>> f = open('t.txt', 'r')
>>> f.read()
'abcdefghijk'
>>> f.close()

위 예제의 1행에서는 't.txt란 파일을 읽겠다'라는 의미가 되며, 2행에서는 read란 함수로 파일을 모두 읽어들인 후, 읽은 데이터를 반환합니다. 3행에서는 close 함수로 파일을 닫습니다. 간단하죠? 이번에는 여러 줄을 파일에 써보도록 하겠습니다. 구구단 중 2단만 간단히 텍스트 파일에 작성해보도록 합시다.

>>> for i in range(1, 10):
	data = "2 * %d = %d\n" % (i, 2 * i)
	f.write(data)	
10
..
11
>>> f.close()

그리고 파일에 우리가 예상한 값이 쓰였는지 확인을 해보도록 합시다. 이번에는 read 함수가 아니라 readline이란 함수를 사용하여 파일을 읽어들여 보도록 하겠습니다. 아래를 한번 봅시다.

>>> f = open('gugudan.txt')
>>> line = f.readline()
>>> while line:
	print(line, end='')
	line = f.readline()
	
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
>>> f.close()

위 예제에서의 1행에서 mode가 비었는데, 읽기 모드가 기본값이므로 파일 이름만 명시해준 것입니다. 2행에서는 readline 함수를 사용하여 한번에 한줄씩 읽어들일 수 있습니다. 3행에서는 while문으로 반복을 하게 되는데, 이 때 line이 빈 문자열일 경우 즉, 더이상 읽어들인 문자열이 없을 경우에 반복문을 벗어나게 됩니다. 4행에서는 읽어들인 문자열에 이미 \n가 있기 때문에 끝문자(end)를 비워주는 것입니다. 5행에서는 현재 위치에서 다음 줄을 읽어들이기 위함이구요. 정상적으로 결과물이 출력됨을 확인한 후에, 파일 객체인 f를 닫습니다. 이 방법 말고도 또 파일을 읽어들이는 방법이 있는데, readline이 아니라 이번에는 readlines이란 함수를 이용하는 방법입니다. 한번 보시죠.

>>> f = open('gugudan.txt')
>>> lines = f.readlines()
>>> for line in lines:
	print(line, end='')
	
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
>>> f.close()

위 예제의 2행에서는 readlines 함수를 사용하여 파일의 내용 전체를 줄 단위로 잘라서 리스트에 저장하여, 저장한 리스트를 반환시켜서 lines에 넣습니다. 3~4행에서는 for문을 이용하여 리스트를 순차적으로 읽고 출력하는 것을 보실 수 있습니다. 역시 마지막은 close 함수를 통해 마무리를 짓습니다. 이번에는 파일 입출력에서 빠질 수 없는 tell과 seek 함수에 대해서 보도록 하겠습니다. tell 함수는 현재 파일의 위치를 반환하고, seek 함수는 현재 파일의 위치를 지정한 곳으로 이동시킵니다.

>>> f = open('hangul.txt', 'w')
>>> f.write('가나다\n라마바\n사아자\n차카타\n파하')
18
>>> f.close()

위의 파이썬 코드로 쓰여진 텍스트 파일을 한번 읽어보면서 seek와 tell 함수를 사용하여 보도록 하겠습니다.

>>> f = open('hangul.txt', 'r')
>>> f.tell()
0
>>> f.read()
'가나다\n라마바\n사아자\n차카타\n파하'
>>> f.tell()
36
>>> f.seek(0)
0
>>> f.tell()
0
>>> f.readline()
'가나다\n'
>>> f.tell()
8
>>> f.close()

위 예제의 2행에서는 tell 함수가 사용되었는데, tell 함수의 반환값이 0입니다. 이는 현재 파일의 위치가 0에 있음을 나타내며, 파일 위치는 현재 파일에서 어디까지 읽거나 썼는지를 나타내는 위치입니다. 4행에서 파일에 있는 내용을 모두 읽어들이고, 6행에서 tell 함수를 사용하여 위치를 확인해 보았더니 36이란 값이 나왔습니다. 그 후에 8행에서 seek 함수를 통해 파일 위치를 0으로 지정하고, 다시 tell 함수를 사용해 위치를 확인해 보았더니 0이란 값이 나왔습니다. 이어서 12행의 readline 함수를 사용한 뒤에, 14행에서 tell 함수를 사용해 보았더니 파일의 위치가 8임을 알 수 있었습니다. 이해 되시죠? 이쯤이면 파일을 읽거나 쓰는법, 그리고 파일 위치(파일 포인터)를 어느정도 응용하여 사용할 수도 있을 것입니다.

저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2013.12.23 18:27 신고 [edit/del]

    좋은 강좌 감사합니다. ^^*

    Reply
  2. 파이쑨 at 2014.01.03 19:14 신고 [edit/del]

    정말잘배우고 있습니다. ㄳ

    Reply
  3. 디렉토리 at 2014.01.08 12:53 신고 [edit/del]

    현재 디렉토리에서 파일을 연다고 했는데 c드라이브가 아닌 휴대용 장치(ex,핸드폰,mp3)에서의 파일은 열수가 없나요?없다면 열 수 있는 다른 방법이 없을 까요??

    Reply
  4. dimebagg at 2014.04.27 12:03 신고 [edit/del]

    안녕하세요 강좌 감사합니다 그런데 혹시 데이터 파싱 코드에서 한 폴더 안에 있는 많은 파일들을 반복적으로 열게 해주는 방법이 있나요?? 그러니까 만약 데이터 파일이 data-1, data-2, ... ,data-100까지 있을 때 저렇게 파일을 열어 원하는 데이터를 뽑고 다른 형식으로 저장하려고 하는데 이런 상황에서 반복문을 쓸 수 있나요??

    Reply
    • BlogIcon EXYNOA at 2014.04.28 19:23 신고 [edit/del]

      가능합니다. 반복문을 통해 특정한 형식을 띄는 여러개의 파일을 내장 함수 open를 통해 열고 작업할 수 있습니다.

    • dimebagg at 2014.04.28 20:46 신고 [edit/del]

      답변 감사합니다! 그럼 혹시 이런 방법으로 해도 될까요??
      for i in range(1,100)
      f = open('data-i', 'rb')
      ....
      여기서 open 함수 안의 파일명에 변수 i를 넣어서 해도 적용되는지가 궁금합니다

    • BlogIcon EXYNOA at 2014.04.28 22:11 신고 [edit/del]

      네, 물론 그런식으로 코드를 작성하시면 됩니다. 편한 방법으로 코드를 기술하시어 작업하시면 되겠습니다.

      for i in range(1, 100):
         f = open("data-{0}.data".format(i), 'rb')
         ...

  5. dimebagg at 2014.04.30 13:31 신고 [edit/del]

    답변 감사합니다! 많은 도움이 되었네요 ㅎㅎ

    Reply
  6. version(3.4.1) at 2014.06.04 11:04 신고 [edit/del]

    혹시 제글 지우셧나요?제가 테스트하다가 잘못알아서 지울려고했는데..;

    Reply
  7. 김수희 at 2014.10.13 21:51 신고 [edit/del]

    저가지금 가오스조던 forworld 엘리미네이션 코드를 짜고싶은데요 혹시 강좌나 쪽지남겨주실수있나요?

    Reply
  8. 오류 at 2014.12.28 15:57 신고 [edit/del]

    f = open('setting.txt','r') 이부분에서
    an integer is required(got type str) 이오류가 떠요;;
    뭐하라는 뜻인가요?

    Reply
    • BlogIcon EXYNOA at 2014.12.29 18:24 신고 [edit/del]

      내장 open 함수가 아닌 os 모듈의 open 함수를 사용하시고 계신 것 같습니다. 두번째 매개변수에서 플래그를 받고 있는데, 문자열이 대신 넘어가니 그런 오류가 발생하시는 것 같습니다.

      https://docs.python.org/2/library/os.html#os.open

  9. kim at 2015.01.07 16:16 신고 [edit/del]

    f = open("aaa.txt")
    라고 했을때 aaa.txt 와 같은 폴더 내에 있어야 하는데
    다른 폴더 안에 있는 파일을 읽을때는 어떻게 해야하나요?

    Reply
  10. chang at 2015.04.23 13:03 신고 [edit/del]

    잘 배우고 있습니다만
    프린터로 결과를 출력하려면 어떻게 해야 하는지요?

    Reply
  11. danis0411 at 2016.01.07 12:18 신고 [edit/del]

    >>> f = open('C:\t.txt', 'r')

    Traceback (most recent call last):
    File "<pyshell#1>", line 1, in <module>
    f = open('C:\t.txt', 'r')
    OSError: [Errno 22] Invalid argument: 'C:\t.txt'
    무슨오류죠??

    Reply
  12. dkn1993 at 2016.01.18 01:50 신고 [edit/del]

    안녕하세요 파이썬을 이제야 배우기 시작해서 강의 정말 잘 보고 있습니다!

    위 코드 중

    for i in range(1,10):
    data = "2*%d = %d\n" % (i, 2*i)

    라고 하면 data에 오직 2*9 = 18 밖에 안 쓰이네요 ㅠㅠ
    이건 어떻게 해결해야 할까요

    Reply
  13. 김아스 at 2016.01.29 10:29 신고 [edit/del]

    FILE을 R모드로 OPEN할때, 해당 파일을 열고 있으면 락이 걸려서 못읽는 사태가 발생하는데 이를 무시하고 강제로 여는 방법은 없을까요? 구글링에도 딱히 안나오네요;;

    Reply
  14. Data at 2016.03.24 13:53 신고 [edit/del]

    잘 배우고 있습니다

    Reply

submit

1. 출력(Output)


오늘은 입력과 출력에 대해서 간단히 알아보도록 하겠습니다. 먼저 출력에 대해서 알아보도록 하겠는데요, 우리는 이미 화면에 무언가를 출력할 때 사용하는 함수는 'print' 함수 라는 것을 알고 있습니다. 이전 강좌에서는 간단히 화면을 출력하는 기능을 담당하는 함수라고 알고 있었지만, 이번에는 더 자세히 파고들어 보도록 하겠습니다.

>>> print(3.14)
3.14
>>> print('Hello, World!')
Hello, World!
>>> t = 'variable'
>>> print(t)
variable

위 예제 그대로 print 함수에 넘겨주는 인자를 출력하고 있음을 확인하실 수 있습니다. 우리는 문자열과 문자열을 서로 연결하고 싶을때는 공백을 사용해서 연결할 수 있었는데, '+' 연산자를 사용해서도 문자열을 서로 연결할 수 있습니다. 아래의 두 방식은 완전히 동일한 결과값을 보여줍니다.

>>> print('Hello,' ' World!')
Hello, World!
>>> print('Hello,' + ' World!')
Hello, World!

만약에, 두 문자열 사이에 띄어쓰기를 넣고 싶다면 콤마(,)를 이용하셔도 동일한 결과값을 보여줍니다. 이 경우는 구분자(sep)의 기본값이 공백이라 따로 sep를 지정하지 않는 이상 콤마를 사용한 곳에 공백이 들어가는 것입니다.

>>> print('Hello,', 'World!')
Hello, World!

우리가 직접 구분자를 바꿀수도 있으며, 아래와 같이 구분자 말고도 끝에 들어가는 문자를 변경할 수 있습니다. 기본적으로 구분자는 위에서 말했듯이 공백이 기본으로 들어가며, 끝문자는 기본적으로 줄바꿈(\n)이 들어갑니다.

>>> print('안녕하세요', '반갑습니다', sep='~', end='!')
안녕하세요~반갑습니다!

이 강좌글을 읽고 계시는 독자분들 사이에서, C언어를 이미 공부하신 분들도 있으실텐데 C언어의 형식으로 출력하고 싶으시다면 아래와 같이 '%'를 사용해주시면 됩니다.

>>> print('%d*%d=%d' % (10, 20, 10*20))
10*20=200
>>> print('%d/%d=%d' % (100, 30, 100/30))
100/30=3

 

2. 입력(Input)

 

이어서 입력(Input)에 대해서 알아보도록 하겠습니다. 위에선 화면에 출력하는 방법을 알아보았다면, 이번에는 입력하는 방법을 알아보도록 할텐데 파이썬에서는 'input'이란 함수를 사용하여 입력을 받을 수 있습니다. 이 함수의 반환값은 사용자가 입력한 문자열 객체가 반환되며, 인자로는 프롬프트(prompt)라고 해서 화면에 출력될 문장을 지정할 수 있는데 이것은 생략 가능한 인자로써 생략해도 상관이 없습니다.

>>> inp = input('input: ')
input: exynoa
>>> print(inp)
exynoa

위에서 말했듯이, 인자를 생략해도 결과에는 변함이 없습니다.

>>> inp = input()
exynoa
>>> print(inp)
exynoa


저작자 표시 비영리 변경 금지
신고
  1. 신유림 at 2013.12.15 01:28 신고 [edit/del]

    많이 배유가겠습니다!! 짱잘하세요 설명ㅎㅎ!!

    Reply
    • BlogIcon EXYNOA at 2013.12.15 12:51 신고 [edit/del]

      과찬의 말씀 감사합니다 (_ _).. 미숙한 실력이라 제가 다른분들을 가르친다는 것에는 많은 무리가 있는것 같습니다. 강좌 게시글에서 부족한 부분이 있다면 언제나 댓글로 말씀해주시면 감사하겠습니다.

  2. ZiNee at 2013.12.23 18:01 신고 [edit/del]

    잘 배웠습니다. 감사합니다. '메리 크리스마스'입니다.

    Reply
  3. 김태윤 at 2014.01.21 12:23 신고 [edit/del]

    잘배웠습니다.
    그런데 2개이상의 데이터를 입력을 받아 각각 2개의 변수에 입력을 받을려면 어떻게 해야하나요?

    Reply
  4. BlogIcon 김동호 at 2014.02.10 21:19 신고 [edit/del]

    앞서 물어 볼것이 있습니다
    저기 위에 보면
    t = 'variable'인데
    여기서 이 t부분을
    kim dong ho = '김동호'를 하고 싶은데
    띄어쓰기를 할떄마다 오류가 납니다
    아 방법을 알려 주십시요

    Reply
  5. 고맙습니다 at 2014.03.06 11:18 신고 [edit/del]

    최고!!!!!

    Reply
  6. 김동호 at 2014.03.17 19:20 신고 [edit/del]

    위에 물어본 사람이지만 알려주시면 감사하겟습니다

    Reply
    • BlogIcon EXYNOA at 2014.03.17 20:39 신고 [edit/del]

      변수명은 언더바, 문자, 숫자로만 입력이 가능합니다. 띄어쓰기는 사용이 불가능 하다는 거죠. 오류가 나는게 정상인겁니다.

  7. 독학생 at 2014.09.18 23:46 신고 [edit/del]

    안녕하세요. 한참전에 4강까지 봤다가 이제서야 여기까지 공부했네요. 이제 몇개 더 공부하면 파이썬의 기초를 덕분에 한번 훑게 되는데요. 파이썬에 대해 심도있게 공부해보고 싶은데, 추천해주실 만한 자료가 있으신가요? 책이든 강의든. 올해에 파이썬 강좌를 새로 올리신다고 하셨는데, 그 계획은 어떻게 되어가고 있는지 궁금합니다 ^^;

    Reply
    • BlogIcon EXYNOA at 2014.09.24 01:45 신고 [edit/del]

      학업에 치우쳐 블로그에 글을 올리고 싶으나 뜻대로 되질 않네요.. 파이썬은 검색을 통해서 괜찮은 강좌를 볼 수도 있고, 파이썬 3.2 프로그래밍이나, 파이썬 3 바이블 책도 괜찮게 본 것 같습니다.

submit

최근 블로그 상황.

2013.11.22 19:00 | 잡담

자격증 시험이나 학교 내에서 기말고사나 사전평가 등 때문에 블로그에 글을 올리는게 너무 뜸해졌네요.

 

요즘에는 블로그에 파이썬 강좌를 이어나가거나, 다른 분들 요청대로 기존에 있는 강좌를 이어서 올릴 생각을 하고 있었는데 일정때문에 조금 힘들것 같습니다.

 

틈나서 글을 작성하고 있긴 하지만, 글을 올리는 텀이 1주~2주정도로 길어져서 강좌를 계속 보고 계셨던 분들은 상당히 불편해 하시고 계신것 같은데 상당히 죄송하다는 말씀을 올립니다.

 

지금 하고 있는 일들을 우선 먼저 끝내고, 파이썬 강좌를 마친 뒤에 또다시 새로운 강좌나 유익한 정보로 찾아뵙도록 노력하겠습니다. 글이 올라오는 시간이 조금 길어도 양해해 주시면 정말 감사하겠습니다.

저작자 표시 비영리 변경 금지
신고
  1. 유학생 at 2013.11.23 12:28 신고 [edit/del]

    영어라 가뜩이나 힘든 파이썬..이 블로그 덕에 포기하지 않고 하고있습니다..

    여러가지로 감사드립니다..프로그램 짜는거 못하는건 여전하지만 기본 개념이라도 익히려고 항상 들르네요

    Reply
  2. ZiNee at 2013.11.23 13:38 신고 [edit/del]

    바쁘게 사는것이 여러 모로 좋지요. 노아님 기말이나 다른 것 잘 되시길 기원합니다.

    Reply
  3. parming2 at 2013.12.02 17:47 신고 [edit/del]

    파이썬 강좌 잘 보고 있습니다!! 대학에서 교수님이 설명해주시는 내용을 듣다가 여기 있는 강좌까지 병행해서 들으니 정말 이해가 쏙쏙 됩니다 ㅠㅠ!!

    Reply
  4. BlogIcon 바퀴러쉬 at 2013.12.11 20:14 신고 [edit/del]

    어떤 자격증 준비하세요?

    Reply

submit

1. 모듈(Module)

 

이번에는 모듈(Module)에 대해서 알아보도록 하겠습니다. 파이썬에서의 모듈이란 변수, 클래스, 함수 등과 같은 여러 코드를 한곳에 모아놓은 코드의 모음이라고 할 수 있습니다. 이런 모듈이라는 것을 만들어 놓으면 계속 사용할 수 있으므로 코드의 재사용성을 극대화 시킬 수 있으며, 연관성이 있는 것들을 모듈 단위로 분리하여 효율성을 높일 수 있습니다. 모듈의 장점에 대해서는 차차 알아가보도록 하고, 먼저 모듈을 불러오는 방법부터 알아보도록 하겠습니다. 이 모듈이라는 것을 가져오려면 'import'라는 키워드를 통해 모듈을 불러올 수 있습니다. 아래와 같이 말입니다.

import 모듈명

우리가 직접 모듈을 만들어 보기 전에, 파이썬에 기본으로 내장된 모듈을 불러와, 그 모듈의 기능을 한번 이용해보도록 합시다. 한번, math라는 내장 모듈을 불러와서 dir 함수를 아래와 같이 사용해보세요.

>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'hypot', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc']

위와 같이 math라는 내장 모듈을 불러오고 나서, dir 함수를 사용하면 그 모듈 내에있는 여러가지 데이터라던지 함수를 알아낼 수 있습니다. 우선은 눈에 보이는 함수 이름들 중 몇가지만 한번 사용해보도록 합시다. 모듈 내에 있는 함수를 사용하려면 '모듈명.함수명'과 같이 사용합니다. 아래를 한번 보시죠.

>>> math.sin(90)
0.8939966636005579
>>> math.pow(2, 10)
1024.0
>>> math.pi
3.141592653589793
>>> 

위를 보시면 알겠지만, 우리가 함수를 직접 정의하지 않아도 math라는 모듈을 불러와 그 모듈에 있는 함수들을 그대로 사용할 수 있다는 사실을 알 수 있습니다. 모듈이란 녀석이 상당히 편리하지 않습니까? 파이썬에서는 이런 수학과 관련된 모듈만이 존재하는게 아니라, 시간, 파일 등과 관련된 다양한 모듈이 존재합니다. 위와 같이 내장되어 있는 모듈도 있지만, 당연하게도 우리가 직접 모듈을 만들어서 불러와 사용할 수 있습니다. 이제는 직접 여러 개의 모듈을 만들어 보도록 하는 경험을 가져보도록 할 것 입니다.

 

2. 모듈의 정의

 

우리가 직접 모듈을 정의하여 불러내어 봅시다. 파이썬의 모듈은 사실 파일(.py)로 저장되어 있으며 우리가 위에서 사용한 내장 모듈도 파이썬이 설치되어 있는 디렉터리 내의 lib이라는 디렉터리에서 찾으실 수 있습니다. 간단하게 말하면, 파이썬에서 모듈을 정의한다는 것은 파일을 만든다는 의미입니다. 우선은 간단하게 사칙연산을 지원하는 모듈을 만들어 보도록 합시다. 이 모듈의 이름은 arithmetic로 하도록 합시다. 우선은 윈도우에 기본으로 내장되어 있는 메모장이나 워드패드 등과 같은 텍스트 편집기를 이용해서 모듈을 만들어 보도록 합시다. 모듈의 확장자는 아까 방금 말했듯이 .py니 전체적인 파일의 이름은 arithmetic.py가 됩니다.

def plus(a, b):
	return a + b
def minus(a, b):
	return a - b
def div(a, b):
	return a / b
def mul(a, b):
	return a * b

이렇게 만드셨으면, 이 파일을 파이썬이 설치된 디렉터리 내에 있는 라이브러리 디렉터리에 옮겨보도록 합시다. 저 같은 경우는 C:\Python33\Lib가 파이썬 라이브러리 디렉터리 경로입니다. 이제 IDLE를 실행시켜서 만든 모듈을 불러와 보도록 합시다.

>>> import arithmetic
>>> dir(arithmetic)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', 'div', 'minus', 'mul', 'plus']
>>> arithmetic.plus(1, 2)
3
>>> arithmetic.mul(300, 400)
120000

위 예제처럼 import라는 키워드를 이용하여 우리가 만든 arithmetic이란 모듈을 불러올 수 있습니다. 기능이 모두 정상적으로 동작하고 있음을 확인하실 수 있습니다. 파이썬에서 모듈을 찾는 순서는 모듈이 이미 로딩되었는지 확인한 뒤에, 로딩되어 있지 않다면 파이썬 경로를 탐색하며 여기에도 존재하지 않으면 PYTHONPATH 환경변수에 등록된 경로에 들어가 탐색을 시작합니다. 만약 위처럼 모듈명을 같이 적지 않고도 바로 참조를 하려면 아래와 같이 import 구문을 사용하시면 됩니다.

>>> from arithmetic import plus
>>> plus(100, 200)
300
>>> plus(30, 400000)
400030

위 예제에서는 'from 모듈명 import 어트리뷰트'와 같은 형식으로 불러오면 해당 어트리뷰트는 모듈명을 적지 않고도 직접 함수를 참조할 수 있습니다. 여기서 어트리뷰트란 함수나 간단히 변수 등의 이름이라고 생각하시면 됩니다. 만약 모듈에 있는 모든 어트리뷰트를 불러오려면 아래와 같은 방식으로 사용하시면 됩니다.

>>> from arithmetic import *
>>> plus(100, 200)
300
>>> minus(40, 20)
20
>>> mul(40, 10002)
400080
>>> div(500, 2)
250.0

위 예제에서 'from 모듈명 import *'와 같은 식으로 쓰이면 arithmetic 모듈에 있는 모든 어트리뷰트를 불러옵니다. 이 경우에도 따로 모듈명을 적지 않고도 직접 참조가 가능하다는 사실을 알 수 있습니다. 유용하죠? 모듈에 대해 대충 알겠다시는 분들은 한번 이 외에도 직접 여러가지 모듈을 만들어서 불러와 모듈을 이용해보세요. 모두 수고하셨습니다.

저작자 표시 비영리 변경 금지
신고
  1. ZiNee at 2013.11.15 23:06 신고 [edit/del]

    항상 감사합니다. 강좌 잘 읽었습니다.

    Reply
  2. 폰트알려주세요 at 2013.11.19 14:01 신고 [edit/del]

    사용하고 계신 비쥬얼 베이직 폰트 이름좀 알려주시면 안될까요?

    완전 귀여운데

    Reply
  3. maya at 2013.12.03 18:17 신고 [edit/del]

    감사합니다.

    Reply
  4. at 2014.06.02 23:06 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.06.03 16:50 신고 [edit/del]

      5*(x**3)+7*(x**2)+8/8*x-6의 경우 계산순서는 아래와 같습니다. 여기서 x의 값이 1이라고 가정해두도록 하겠습니다.

      (1) 먼저 소괄호 내에 있는 거듭제곱 연산을 거칩니다. 1의 3제곱은 1, 1의 2제곱은 역시 1입니다. 따라서, 아래와 같은 식이 만들어집니다.
      5 * 1 + 7 * 1 + 8 / 8 * 1 - 6
      (2) 위 식에서 +와 - 연산자보다 *와 /가 연산 순위가 더 높으므로 우선적으로 *와 / 먼저 계산이 됩니다. 그러므로 아래와 같습니다.
      5 + 7 + 1 - 6 = 7

      파이썬에서의 값
      >>> f(1)
      7.0

      두 값은 서로 동일합니다. 함수가 어떤 값을 반환하도록 할 것인지 말해주시면 따로 작성해드리도록 하겠습니다.

  5. kueum at 2014.06.06 21:07 신고 [edit/del]

    혹시 number_space 가 무엇인지 아시나요?

    Reply
    • BlogIcon EXYNOA at 2014.06.07 10:55 신고 [edit/del]

      number_space가 무엇인지 모르겠습니다. 함수라고 가정한다면 이름만 봤을때는 공백의 수를 세는 함수 인것 같습니다. 아마도, 사용자 정의 함수일 가능성이 높습니다.

  6. at 2014.06.07 12:12 [edit/del]

    비밀댓글입니다

    Reply
    • BlogIcon EXYNOA at 2014.06.10 23:47 신고 [edit/del]

      어느 부분이 어떻게 안되시는 건가요? 어느 값은 올바르게 변환되고, 또 어떤 값은 올바르게 변환되지 않는 문제인가요?

  7. at 2014.07.29 02:28 [edit/del]

    비밀댓글입니다

    Reply
  8. pds at 2014.08.03 17:15 신고 [edit/del]

    def plus(a, b):
        return a + b
    def minus(a, b):
        return a - b
    def div(a, b):
        return a / b
    def mul(a, b):
        return a * b
    입력하고 py 확장자로 저장하고..님이 하라는데로 햇는데...
    왜 모듈이 만들어 지지 않을까요???
    import 적용해봐도 에러가 떠요.ㅠㅠ

    Reply
    • BlogIcon EXYNOA at 2014.08.20 14:34 신고 [edit/del]

      어떻게 된 부분인지 제가 직접 봐야 알 것 같습니다. 혹시 네이트온 가능하시다면 su6net@nate.com로 친구추가 부탁드립니다.

  9. san at 2014.08.06 11:30 신고 [edit/del]

    class abc :
    ....def __init__(self) :
    ......self.kim = []
    ......self.jin = [] (.은 indent입니다)

    san = abc()

    def plus() :
    ....san.kim.append(1)
    ....san.jin.append(2)

    이런식의 함수가 있다고 하면

    전 plus()를 자꾸 자꾸 호출을 합니다

    그러면 san.jin과 san.kim에 append에 의하여 san.kim = [1,1,1]
    san.jin = [2,2,2] (1,2의 갯수는 plus()호출 만큼의 수)

    여기서 문제가 되는게

    저는 plus()를 호출할때마다 list가 초기화 되길 원해요 즉, plus()호출수 만큼 list가 추가되는게 아니라 san.kim = [1] san.jin = [2] 몇번을 호출하던 이런식으로요

    위에는 간략화 하느라 append(1) 이런식으로 했지만 실제 코드는 순서도 중요하고 자료도 중요한 값들 이거든요..

    overwrite 하는 방법 for i in list : san.kim[i] = 변수값등 의방법이 있겠습니다만...

    그러면 코드를 갈아 엎어야되서 ,,

    append를 이용해서 위와같은 문제를 해결할수 있는 방법이 있을까요?

    Reply
    • BlogIcon EXYNOA at 2014.08.20 14:35 신고 [edit/del]

      약간 이해할 수 없는 부분들이 있네요. 혹시 네이트온으로 대화 가능하시면 su6net@nate.com로 친구추가 해주셔서 대화 걸어주세요.

  10. at 2016.02.26 13:29 [edit/del]

    비밀댓글입니다

    Reply
  11. jae at 2016.05.08 00:33 신고 [edit/del]

    덕분에 많이 배워가요 감사합니다!

    Reply
  12. dankim at 2016.07.09 20:27 신고 [edit/del]

    잘봤어요. 감사합니다

    Reply
  13. swyshy at 2017.01.24 14:17 신고 [edit/del]

    근데 메모장으로 저장하면 .txt로 저장되는데 어떻게 .py로 저장하나요..

    Reply

submit

티스토리 툴바