본문으로 이동

프로그래머가 아닌 이들을 위한 파이썬 3 자습서/리스트

위키책, 위키책

한 개 이상의 값을 가지는 변수

[+/-]

당신은 이미 한 개의 값을 가지는 일반적인 변수를 보아왔습니다. 그러나 다른 변수 타입은 한 개 이상의 값을 가질 수 있습니다. 그러한 변수들을 컨테이너(containers)라고 부르는데 왜냐하면 그것은 한 개 이상의 객체를 포함하고 있기 때문입니다. 가장 간단한 타입은 리스트입니다. 여기에 리스트가 쓰인 예제가 있습니다:

which_one = int(input("What month (1-12)? "))
months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
          'August', 'September', 'October', 'November', 'December']

if 1 <= which_one <= 12:
    print("The month is", months[which_one - 1])

출력된 예제입니다:

What month (1-12)? 3
The month is March

이 예제에서 months는 리스트입니다. months months = ['January', 'February', 'March', 'April', 'May', 'June', 'July',과 다음 'August', 'September', 'October', 'November', 'December']으로 정의됩니다 (\ 은 긴 줄을 나누는 데에도 쓰입니다[1]만, 이 경우에는 반드시 필요한 것이 아닙니다. 왜냐하면 파이썬은 충분히 지능적이어서 괄호 안의 모든 것을 인식할 수 있기 때문입니다). 대괄호 [] 는 리스트의 처음과 끝이고 쉼표(,)는 리스트의 항목을 나눕니다. 이 리스트는 months[which_one - 1]에 사용되었습니다. 리스트는 0부터 번호를 매기는 항목들로 구성됩니다. 달리 말하면 당신이 만약 1월(January)을 원하면 months[0]을 사용해야 한다는 것입니다. 리스트에 번호를 주면 그것은 그 번호가 지정한 장소(location)에 저장된 값을 반환할 것입니다.

if 1 <= which_one <= 12: 조건문은 which_one이 1과 12 사이에 있을 때에만 참입니다. (달리 말하면 당신이 이것을 수학(Algebra)적으로 예상할 수 있었을 겁니다).

리스트는 일련의 상자들로 생각할 수 있습니다. 각 상자는 다른 값을 가지고 있습니다. 예를 들어, demolist = ['life', 42, 'the universe', 6, 'and', 9] 로 만들어진 상자는 다음과 같습니다:

box number 0 1 2 3 4 5
demolist "life" 42 "the universe" 6 "and" 9

각 상자는 숫자에 의하여 참고되기 때문에 demolist[0] 구문은 'life'라는 값을 얻을 수 있고, demolist[1]42라는 값을 demolist[5]9라는 값을 얻을 수 있습니다.

리스트의 더 많은 특징

[+/-]

다음 예제는 리스트가 할 수 있는 다른 것들을 보여줍니다. (당신이 그것을 입력할 거라는 기대는 하지 않지만, 당신은 아마도 리스트에 익숙해질 때까지 인터렉티브 모드에서 많이 연습해야 할 것입니다.). 그럼 갑시다:

demolist = ["life", 42, "the universe", 6, "and", 9]
print("demolist = ",demolist)
demolist.append("everything")
print("이제 demolist의 끝에 'everything'이 추가되었습니다:")
print(demolist)
print("len(demolist) =", len(demolist)) #demolist의 항목 수
print("demolist.index(42) =", demolist.index(42)) # 42가 리스트(demolist)에서 가지는 번호
print("demolist[1] =", demolist[1]) # 리스트의 1번 값

# 다음으로 우리는 목록을 통해서 반복(loop)할 것입니다.
for c in range(len(demolist)):
    print("demolist[", c, "] =", demolist[c])

del demolist[2]
print("이제 demolist에서 'the universe' 항목이 제거되었습니다:")
print(demolist)
if "life" in demolist:
    print("'life' 항목은 demolist에 있습니다")
else:
    print("'life' 항목은 demolist에 없습니다")

if "amoeba" in demolist:
    print("'amoeba' 항목은 demolist에 있습니다")

if "amoeba" not in demolist:
    print("'amoeba' 항목은 demolist에 없습니다")

another_list = [42,7,0,123]
another_list.sort()
print("another_list를 정렬하면", another_list)

출력:

demolist =  ['life', 42, 'the universe', 6, 'and', 9]
이제 demolist의 끝에 'everything'이 추가되었습니다:
len(demolist) = 7
demolist.index(42) = 1
demolist[1] = 42
demolist[ 0 ] = life
demolist[ 1 ] = 42
demolist[ 2 ] = the universe
demolist[ 3 ] = 6
demolist[ 4 ] = and
demolist[ 5 ] = 9
demolist[ 6 ] = everything
이제 demolist에서 'the universe' 항목이 제거되었습니다:
['life', 42, 6, 'and', 9, 'everything']
'life' 항목은 demolist에 있습니다
'amoeba' 항목은 demolist에 없습니다
another_list를 정렬하면 [0, 7, 42, 123]

이 예제는 전체적으로 새로운 함수들을 사용하고 있습니다. 당신은 전체 리스트를 단지 print하여 출력한 것에 주의하세요. 다음에 있는 append 함수는 리스트의 끝에 새 항목을 추가하기 위하여 사용되었습니다. len 은 리스트 속에 얼마나 많은 항목이 있는지를 보여줍니다. 리스트의 유효한 인덱스 (대괄호 [ ]의 내부에서 사용되는 숫자와 같다)는 0부터 len - 1까지의 범위를 갖습니다. index 함수는 리스트 속에서 그 항목이 처음으로 위치하는 곳을 알려줍니다. 어떻게 demolist.index(42)가 1을 반환하고, 언제 demolist[1]가 실행되었을 때 42를 반환하는지 유의하세요. 당신이 리스트가 제공하는 모든 기능에 대한 도움를 얻으려면, 파이썬 인터프리터의 인터렉티브 모드에서 help(list) 을 입력하세요.

# 다음으로 우리는 목록을 통해서 반복(loop)할 것입니다.줄은 프로그래머에게 기억을 상기시키는 것입니다 (주석(comment)이라고도 합니다). 파이썬은 그 줄에서 # 다음에 나온 모든 것을 무시합니다. 다음 줄들을 봅시다:

for c in range(len(demolist)):
    print('demolist[', c, '] =', demolist[c])

0부터 시작하여 리스트의 마지막 항목에 도달할 때까지 증가하는 변수 c를 생성힌다. 한편 print 구문은 리스트의 각 요소를 출력한다.

위의 행동을 하는 더 좋은 방법:

for c, x in enumerate(demolist):
    print("demolist[", c, "] =", x)

del 명령은 리스트 속에 주어진 요소를 제거하는 데 사용됩니다. 다음 몇 줄에 쓰인 in 연산자는 리스트 속에 그 요소가 있는지 없는지를 검사하는데 사용됩니다. sort 함수는 리스트를 정렬합니다. 이것은 리스트를 작은 수에서 큰 수로, 알파벳 순으로 순서를 정렬할 때 유용합니다. 이것은 리스트를 재정렬한다는 것에 유의하여야 합니다. 요약하면, 리스트에서는, 아래 연산자가 사용됩니다:

예시 설명
demolist[2] 2번 인덱스에 있는 요소를 사용(access)
demolist[2] = 3 2번 인덱스에 있는 요소에 3을 대입
del demolist[2] 2번 인덱스에 있는 요소를 제거
len(demolist) demolist의 길이(항목 수)를 반환
"value" in demolist "value"demolist의 요소인 경우에 참(True)
"value" not in demolist "value"demolist의 요소가 아닌 경우에 참(True)
another_list.sort() another_list을 정렬. 주의: 정렬할 리스트는 모두 숫자이거나 모두 문자로만 구성되어야 한다
demolist.index("value") "value"이 있는 첫 번째 인덱스를 반환
demolist.append("value") 요소 "value"를 리스트의 끝에 추가
demolist.remove("value") demolist에 있는 첫 번째로 발생한 "value"를 제거한다 (del demolist[demolist.index("value")]와 같다)

이 다음 예제는 이러한 기능을 더 유용하게 사용한다:

menu_item = 0
namelist = []
while menu_item != 9:
    print("--------------------")
    print("1. 리스트를 출력한다")
    print("2. 리스트에 이름을 추가한다")
    print("3. 리스트에서 이름을 제거한다")
    print("4. 리스트 속의 항목을 변경한다")
    print("9. 종료한다")
    menu_item = int(input("메뉴에서 항목을 선택하시오: "))
    if menu_item == 1:
        current = 0
        if len(namelist) > 0:
            while current < len(namelist):
                print(current, ".", namelist[current])
                current = current + 1
        else:
            print("리스트가 비어 있습니다")
    elif menu_item == 2:
        name = input("추가할 이름을 입력하시오: ")
        namelist.append(name)
    elif menu_item == 3:
        del_name = input("제거할 이름이 무엇입니까: ")
        if del_name in namelist:
            # namelist.remove(del_name) would work just as fine
            item_number = namelist.index(del_name)
            del namelist[item_number]
            # The code above only removes the first occurrence of
            # the name.  The code below from Gerald removes all.
            # while del_name in namelist:
            #       item_number = namelist.index(del_name)
            #       del namelist[item_number]
        else:
            print(del_name, "을/를 찾을 수 없습니다")
    elif menu_item == 4:
        old_name = input("변경할 이름은 무엇입니까: ")
        if old_name in namelist:
            item_number = namelist.index(old_name)
            new_name = input("새로운 이름은 무엇입니까: ")
            namelist[item_number] = new_name
        else:
            print(old_name, "을/를 찾을 수 없습니다")

print("안녕히계십시오")

And here is part of the output:

--------------------
1. 리스트를 출력한다
2. 리스트에 이름을 추가한다
3. 리스트에서 이름을 제거한다
4. 리스트 속의 항목을 변경한다
9. 종료한다

메뉴에서 항목을 선택하시오: 2
추가할 이름을 입력하시오: Jack

메뉴에서 항목을 선택하시오: 2
추가할 이름을 입력하시오: Jill

메뉴에서 항목을 선택하시오: 1
0 . Jack
1 . Jill

메뉴에서 항목을 선택하시오: 3
제거할 이름이 무엇입니까:  Jack

메뉴에서 항목을 선택하시오: 4
변경할 이름은 무엇입니까:  Jill
새로운 이름은 무엇입니까: Jill Peters

메뉴에서 항목을 선택하시오: 1
0 . Jill Peters

메뉴에서 항목을 선택하시오: 9
안녕히계십시오

참 긴 프로그램이었습니다. 소스 코드를 보도록 합시다. namelist = [] 줄은 변수 namelist를 항목이나 요소가 없는 리스트로 만듭니다. 다음에 오는 중요한 줄은 while menu_item != 9:입니다. 이 줄은 이 프로그램에서 메뉴 시스템을 허용하는 루프를 시작합니다. 다음에 오는 줄들은 메뉴를 표시하고 프로그램의 어떤 부분을 실행할지를 결정합니다.

이 부분은

current = 0
if len(namelist) > 0:
    while current < len(namelist):
        print(current, ".", namelist[current])
        current = current + 1
else:
    print("리스트가 비어 있습니다")

리스트를 통하여 개별 이름을 출력합니다. len(namelist)은 리스트 속에 항목이 얼마나 되는지를 알려줍니다. 만약 len0을 반환한다면, 리스트는 빈 것입니다.

그 다음 몇 줄을 지나가면, namelist.append(name) 구문이 나타납니다. 이것은 리스트의 끝에 항목을 추가하기 위하여 append 함수를 사용합니다. 다음 두 줄을 읽어 내리고, 코드의 이 부분에 유의하세요:

item_number = namelist.index(del_name)
del namelist[item_number]

여기에 index 함수가 나중에 항목을 제거하기 위하여 사용될 인덱스 값을 찾기 위해 사용되었습니다. del namelist[item_number] 은 리스트의 요소를 제거하기 위해 사용되었습니다.

그 다음 부분은

old_name = input("What name would you like to change: ")
if old_name in namelist:
    item_number = namelist.index(old_name)
    new_name = input("What is the new name: ")
    namelist[item_number] = new_name
else:
   print(old_name, "was not found")

item_number를 찾고 old_name이 있던 곳에 new_name을 넣기 위해 index가 사용되었습니다.

축합니다, 리스트를 배움으로써, 당신은 이제 컴퓨터가 할 수 있는 어떠한 연산도 당신이 할 수 있는 언어에 대해 충분히 알게 되었습니다 (이것은 기술적으로 튜링 완전이라 합니다). 물론, 삶을 더 편안하게 해주는 많은 기능들은 여전히 있습니다.

예제

[+/-]

test.py

## 이 프로그램은 지식의 시험을 진행합니다

# 우선 시험 문제를 얻습니다
# 나중에 이 부분은 '파일 IO'를 사용하기 위하여 수정할 것입니다.
def get_questions():
    # 데이터가 리스트 속에 리스트로 저장되는 것에 주목하세요
    return [["맑은 날 하늘은 무슨 색인가? ", "파란색"],
            ["삶, 우주, 그리고 모든 것에 대한 해답은? ", "42"],
            ["쥐덫을 세 글자로 말하면? ", "고양이"]]

# 이것은 하나의 질문을 시험합니다
# 하나의 질물을 한 후 
# 사용자가 정답을 입력하면 참(True)이고 그렇지 않으면 거짓(False)입니다

def check_question(question_and_answer):
    # 리스트에서 질문과 정답을 추출합니다
    # 이 함수는 리스트에서 두 개의 요소, question과 answer를 가집니다.
    question = question_and_answer[0]   
    answer = question_and_answer[1]
    # 사용자에게 질문을 줍니다
    given_answer = input(question)
    # 사용자의 답변을 출제자의 정답과 비교합니다
    if answer == given_answer:
        print("정답")
        return True
    else:
        print("오답, 정답은:", answer)
        return False

# 이것은 모든 질문이 주어진 후 실행됩니다
def run_test(questions):
    if len(questions) == 0:
        print("질문이 주어지지 않았습니다.")
        # return 은 함수를 종료시킵니다
        return
    index = 0
    right = 0
    while index < len(questions):
        # 질문을 체크합니다
        # 이것은 리스트 속의 리스트에서 질문과 답변 리스트를 추출하는 것임을 주의하세요
        if check_question(questions[index]): 
            right = right + 1
        # 다음 질문으로
        index = index + 1
    # 연산의 순서가 처음에는 곱셈, 그 다음은 나눗셈임을 주의하세요
    print("당신은", len(questions), "개 중에서",\
           right * 100 / len(questions), "% 를 맞췄습니다")

# get_questions 함수를 통해 문제를 얻습니다, 그리고
# 리스트 속의 리스트를 반환하여, run_test 함수의 인수(argument)로 사용합니다.

run_test(get_questions())

TrueFalse의 값은 각기 1과 0이다. 이것은 종종 세너티 테스트(sanity checks; sanity tests와 동일한 뜻이다)나 루프 조건문 등에 사용됩니다. 이것은 좀 더 나중에 배울 겁입니다 (부울 표현식 장). get_questions()는 본질적으로 리스트입니다. 왜냐하면 이것이 기술적으로는 함수일지라도, 리스트들의 리스트를 반환하는 것이 함수가 하는 유일한 것이기 때문입니다.

출력 예시:

맑은 날 하늘은 무슨 색인가? 흰색
오답, 정답은: 파란색
삶, 우주, 그리고 모든 것에 대한 해답은? 42
정답
쥐덫을 세 글자로 말하면? 고양이
정답
당신은 3 개 중에서 66.66666666666667 % 를 맞췄습니다

실습

[+/-]

응시하기, 문제와 정답 목록 보기, 종료하기를 옵션으로 하는 메뉴를 갖게 test.py 프로그램을 확장하라. 또한 문제 "What noise does a truly advanced machine make?"와 그 정답 "ping"을 추가한다.

틀:Solution

역주

[+/-]
  1. 원저자는 2002년 당시 'July',\로 쓴 후 다음 줄을 그대로 작성했습니다만, 현재 위키책 판(2.6버전 포함)에서는 \가 제거되어 있습니다
고급 함수 예제 For 루프

{{[[:en:b:BookCat틀:{{{1}}}|{{{1}}}]]}}