08 Sep 2017 » python

2017-09-08-python_1

분기와 함수

다음 예제를 보자.

In [1]:
# -*- coding: utf-8 -*-

from sys import exit

try:
    input = raw_input
except NameError:
    pass

def gold_room():
    print("황금으로 가득 찬 방입니다. 얼마나 가져갈까요?")

    next = input(">")
    if "0" in next or "1" in next:
        how_much = int(next)
    else:
        dead("인간이여, 숫자쓰는 법부터 배우세요.")

    if how_much < 50:
        print("좋아, 욕심부리지 않는군요. 당신이 이겼습니다!")
        ## exit(0)은 강제종료, 넘겨진 숫자가 오류가 있는지 없는지를 가리킨다.
        exit(0)
    else:
        dead("욕심쟁이 얼간이 같으니!")

def bear_room():
    print("여기에는 곰이 한 마리 있습니다.")
    print("곰은 꿀을 잔뜩 들고 있습니다.")
    print("뚱뚱한 곰은 다른 쪽 문 앞에 있습니다.")
    print("어떻게 곰을 움직이겠습니까?")
    bear_moved = False

    ## 이렇게 하면 무한 순환을 만들어 줄 수 있다.
    while True:
        next = input(">")

        if next == "꿀 뺏기":
            dead("곰이 당신을 쳐다보더니 목이 떨어져라 따귀를 날립니다.")
        elif next == "곰 놀리기" and not bear_moved:
            print("곰이 문에서 비켜섰습니다. 이제 나갈 수 있습니다.")
            bear_moved = True
        elif next == "곰 놀리기" and bear_moved:
            dead("곰이 머리 끝까지 열받아 당신의 다리를 씹어먹습니다.")
        elif next == "문 열기" and bear_moved:
            gold_room()
        else:
            print("무슨 말인지 모르겠네요.")

def cthulhu_room():
    print("여기에는 대악마 크툴루를 봅니다.")
    print("그분이, 그것이, 아니 뭐든지 간에 당신을 쳐다보고 당신은 미쳐갑니다.")
    print("목숨을 위해 달아나려나, 네 머리를 먹어치우려나?")

    next = input(">")

    if "달아나기" in next:
        start()
    elif "먹기" in next:
        dead("음, 맛이 좋군요!")
    else:
        cthulhu_room()

def dead(why):
    print(why, "잘 했어요!")
    exit(0)

def start():
    print("어두운 방에 있습니다.")
    print("오른쪽과 왼쪽에는 문이 있습니다.")
    print("어느 쪽을 고를까요?")

    next = input(">")

    if next == "왼쪽":
        bear_room()
    elif next == "오른쪽":
        cthulhu_room()
    else:
        dead("문 주위에서 맴돌기만 하다 굶어 죽었습니다.")

start()
어두운 방에 있습니다.
오른쪽과 왼쪽에는 문이 있습니다.
어느 쪽을 고를까요?
>왼쪽
여기에는 곰이 한 마리 있습니다.
곰은 꿀을 잔뜩 들고 있습니다.
뚱뚱한 곰은 다른 쪽 문 앞에 있습니다.
어떻게 곰을 움직이겠습니까?
>메롱
무슨 말인지 모르겠네요.
>때리자
무슨 말인지 모르겠네요.
>곰 놀리기
곰이 문에서 비켜섰습니다. 이제 나갈 수 있습니다.
>굿굿
무슨 말인지 모르겠네요.
>문 열기
황금으로 가득 찬 방입니다. 얼마나 가져갈까요?
>1000000000000000000000
욕심쟁이 얼간이 같으니! 잘 했어요!
An exception has occurred, use %tb to see the full traceback.

SystemExit: 0
/Users/Leo/.pyenv/versions/anaconda3-4.0.0/envs/code_study/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2870: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
  warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)

코드를 뜯어보자.

In [ ]:
from sys import exit

exit(0)  올바른 종료
exit(1)  오류가 된다.

exit(0)

강제종료할 수 있고, 넘겨진 숫자가 오류가 있는지 없는지를 가리킨다.

보통의 Boolean 논리(0 == False)와 반대이다.

  • 이것은 서로 다른 오류를 가리키기 위해 다른 숫자를 쓸 수 있기 때문이다.
  • exit(1)이나 exit(2)와 다른 오류를 내려면 exit(100)이라고 할 수 있다.

보통 문제가 없으면 0을 문제가 있으면 1을 리턴하도록 작성한다!

In [ ]:
while True:

while True: → 무한 loop

while의 조건문이 True 이므로 조건문은 항상 참이 된다.

while은 조건문이 참인 동안에 while에 속해 있는 문장들을 계속해서 수행하므로 위의 예는 무한하게 while문 내의 문장들을 수행할 것이다.


설계와 디버그

코딩을 할 때 참고할 만한 규칙이다.

생각없이 무조건 따르기 보다는 더 효율적인 방법이 있다면 그 방법을 따르는 것이 낫다.

1. if 문 규칙

  1. 모든 if 문에는 else를 넣자.
  2. else 부분이 있을 수 없는 경우라서 실행이 절대 안 된다면, else 안에 오류를 내고 프로그램을 kill하는 die 함수를 쓰자.
  3. if문을 두 단계 넘게 중첩하지 말자. 항상 한 단계로 유지할 수 있도록 노력하자.

    이 말은 if 안에 if를 두었다면 두 번째 if를 다른 함수로 옮길 방법을 찾으라는 뜻이다.

  4. if 문을 문단처럼 다루자. 그 안의 if, elif, else 묶음 각각을 문장 집합으로 다루자.

  5. Boolean 검사는 단순해야 한다.

2. 순환문 규칙

  1. 영원히 순환해야 할 때만 while문을 쓰자. 거의 쓰지말라는 뜻에 가깝다.(python에서만)
  2. 다른 모든 경우, 특히 고정 횟수나 제한된 횟수만큼 순환해야 한다면 for 문 사용을 권장한다.

3. 디버그 규칙

  1. debugger는 쓰지 말자. 헷갈릴 가능성이 크다.
  2. 가장 좋은 디버그 방법은 의심이 될 만한 부분을 print로 변수 값을 출력하는 것이다.
  3. 한 번에 프로그램을 크게 만들지 말고, 작게 만들어서 조금씩 실행해보고 조금식 고치자.

Reference

  • 깐깐하게 배우는 파이썬


Related Posts