목차

이전 항목

9. 반환(Return)

다음 항목

11. A character in a string

현재 문서

주의사항

해당 문서는 중요 변경 작업 중에 있습니다. 일부 문서에 텍스트가 빠져있거나, 불어로 플레이스홀더(placeholder) 자리차지만 되어 있을 수 있습니다.

10. 리스트(List)

다음 프로그램을 실행한다. 먼저 올바른 세상을 선택하고 두번째에는 프로그램 나머지 부분을 실행한다.

World("/worlds/many.json", "Many")
move()
print(object_here())

결과는 아마도 다음과 같을 것이다:

['token', 'triangle', 'banana', 'carrot']

주석

파이썬 함수로 list 가 있는데, 리스트를 생성하는데 사용된다! 할당 대입 = 기로를 사용해서 객체에 명칭을 할당하는 것을 이미 살펴봤다; list 를 변수명칭으로 사용하는 것을 회피해야 되는데, 이유는 파이썬에 있는 list() 함수를 사용하지 못하게 되기 때문이다.

상기 프로그램이 파이썬 리스트(list) 예제다. 파이썬 리스튼 꺾쇠 괄호( [ ] )로 표현되고, 아무 것도 없거나, 하나 혹은 많은 항목을 담을 수 있다. 상기 예제에서, 리스트에는 4개 항목이 담겨 있는데, 각각은 파이썬 문자열이다. “꺾쇠 표기법”을 사용해서, 다른 유형의 객체를 담을 수 있는 리스트를 생성할 수 있다:

a_list = [1, "Reeborg", move]

10.1. 리스트 요소 접근하기

첫번째 신문배달 작업을 봤을 때, 다음을 읽어봤을 것이다:

컴퓨터 프로그래밍에서, 일반적으로 1 대신에 0에서부터 세기 시작한다. 여기 나온 세상은 컴퓨터 과학에서 유명한 세명을 지칭하기 때문에, 세상을 0 으로부터 번호를 붙이는 것이 적절하다고 본다.

리스트가 주어지면, 꺾쇠 표기법을 사용해서 단일 요소를 불러올 수 있다.

시도해 보기!

다음 프로그램을 시도해 본다:

odd_numbers = [1, 3, 5, 7]
print( odd_numbers[0] )
print( odd_numbers[1] )
print( odd_numbers[3] )
print( "length = ", len(odd_numbers))

파이썬 함수 len() 은 리스트 길이 정보를 제공한다. 리스트 길이는 해당 리스트가 갖고 있는 총 항목 갯수와 같다.

리스트에서 항목 하나를 뽑아내는데 사용되는 꺾쇠괄호 내 숫자를 해당 항목에 대한 인덱스(index) 라고 부른다.

종종, 리스트 마지막 요소를 뽑아내거나, 그 이전 것을 뽑아내는 것이 유용할 수 있다. len() 함수를 사용해서 마지막 항목 위치를 알아낼 수 있지만, 파이썬에는 더 편리한 지름길(shortcut, 단축)이 있다.

시도해 보기!

다음 프로그램을 실행해 본다:

odd_numbers = [1, 3, 5, 7]
print( odd_numbers[-1] )  # 마지막 항목
print( odd_numbers[-2] )  # 끝에서 두번째 항목

리스트 마지막에서 시작되는 항목을 뽑아내는데 음수 부호를 포함하여 편리하게 사용하는 법에 주목한다.

10.2. 리스트를 조건으로 사용하기

리스트가 if 혹은 while 문장에서 조건으로 사용될 때, 리스트에 항목이 있느냐 없느냐에 따라 다르게 동작한다.

여러분 스스로 파악해 본다!

다음 프로그램을 실행한다:

# 다음 중 하나만 맞다.

if []:
    print("An empty list is considered to be equivalent to True,")
elif ['Reeborg']:
    print("An empty list is considered to be equivalent to False.")
    print("But a non-empty list is considered to be equivalent to True.")
elif [1, 2, 3, 4, 5]:
    print("A list is considered to be equivalent to True",
          "ONLY if it contains many items")
else:
    print("Perhaps lists are always considered to be False ...")

아시다시피, 거짓(False) 로 간주되는 조건을 담고 있는 분기는 건너뛴다; 참(True) 조건을 포함하는 첫째 분기만 실행된다.

10.3. 더 많은 추수 도전과제

먼저, 신속한 테스트

다음 프로그램을 실행한다. 리보그가 발견한 첫번째 유형의 객체를 출력한다. 그리고 나면, 프로그램을 변경해서 두번째 발견한 유형의 객체를 출력한다.

World("/worlds/many.json", "Many")
move()
print(object_here()[0])

리보그 이모는 과일농부다. 이모 농장에는, 다양한 유형의 과일이 심어져 있다. 특정한 달에는, 특정한 유형의 과일만 수확이 가능하다. Harvest 4a, Harvest 4b, Harvest 4c, Harvest 4d 세상을 살펴본다. 이모가 농장에 들어설 때, 리보그 이모가 표식을 해서, 수확할 준비가 된 과일 유형을 식별할 수 있다. 리보그는 과일을 골라 유사한 유형의 모든 과일을 수확한다.

리보그는 object_here() 함수를 사용한다. 앞에서 봤듯이, object_here() 함수는 해당 지점에서 발견된 객체 명칭을 담고 있는 리스트 를 반환한다; Harvest 4 세상에는 "apple", "banana", "orange", "strawberry" 네가지 과일이 가능한 객체로 있다.

앞에서 언급된 네가지 세상에서 작업을 수행하는데 필요한 프로그램이 완성되지 않은 채로 나와 있다. FRUIT 변수를 사용하는데, 함수 내부와 외부에서 동일 변수명칭이 사용되기 때문에 대문자로 표기했다; 본질적으로 전역 변수다. 하지만, = 기호를 사용해서 함수 내부에서 값을 할당하지 않았기 때문에, global 키워드를 사용할 필요는 없다.

def harvest_one_row ():
    while front_is_clear():
        if object_here()[0] == FRUIT:
            take(FRUIT)
        move()

def go_back_to_beginning_of_row():
    pass

def move_to_next_row():
    pass

def go_to_first_row():
    pass

def complete_one_row():
    harvest_one_row()
    go_back_to_beginning_of_row()
    move_to_next_row()

move()
FRUIT = object_here()[0]
take(FRUIT)
go_to_first_row()
repeat 6:
    complete_one_row()

여러분 차례!

상기 프로그램을 완성해서, 네가지 세상 모두에서 동작하도록 한다: Harvest 4a, Harvest 4b, Harvest 4c, Harvest 4d.

10.4. 마지막 한가지 더 실험

종종, 프로그래밍 너무 커다랄 때, 프로그램을 여러 파일에 담는 것이 의미있게 된다. 여기서, 작성한 프로그램은 파일에 담겨있지 않다: 프로그램이 코드 편집기에 있지만, 프로그램 일부가 라이브러리에 있을 수도 있다. 위에서 작성한 프로그램이 너무 커서, 두 조각으로 쪼갤 필요가 있다고 가정하자. 라이브러리에서 harvest_one_row() 함수를 정의하고, 다음 명령어를 사용해서 메인 프로그램으로 가져온다.

from library import harvest_one_row

프로그램이 여전히 잘 동작하는가? global 키워드를 사용하면 동작이 되는가? 실험 결과 전역 변수를 사용할 때 문제점을 지적할 수도 있다. 전역 변수는 함수 내부에 사용되지만 다른 곳에서 정의된 것이다.