프로그래머가 아닌 이들을 위한 파이썬 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)
은 리스트 속에 항목이 얼마나 되는지를 알려줍니다. 만약 len
이 0
을 반환한다면, 리스트는 빈 것입니다.
그 다음 몇 줄을 지나가면, 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())
True
과 False
의 값은 각기 1과 0이다. 이것은 종종 세너티 테스트(sanity checks; sanity tests와 동일한 뜻이다)나 루프 조건문 등에 사용됩니다. 이것은 좀 더 나중에 배울 겁입니다 (부울 표현식 장).
get_questions()는 본질적으로 리스트입니다. 왜냐하면 이것이 기술적으로는 함수일지라도, 리스트들의 리스트를 반환하는 것이 함수가 하는 유일한 것이기 때문입니다.
출력 예시:
맑은 날 하늘은 무슨 색인가? 흰색 오답, 정답은: 파란색 삶, 우주, 그리고 모든 것에 대한 해답은? 42 정답 쥐덫을 세 글자로 말하면? 고양이 정답 당신은 3 개 중에서 66.66666666666667 % 를 맞췄습니다
실습
+/-응시하기, 문제와 정답 목록 보기, 종료하기를 옵션으로 하는 메뉴를 갖게 test.py 프로그램을 확장하라. 또한 문제 "What noise does a truly advanced machine make?"와 그 정답 "ping"을 추가한다.
역주
+/-- ↑ 원저자는 2002년 당시
'July',\
로 쓴 후 다음 줄을 그대로 작성했습니다만, 현재 위키책 판(2.6버전 포함)에서는\
가 제거되어 있습니다
← 고급 함수 예제 | For 루프 → |
{{[[:en:b:BookCat틀:{{{1}}}|{{{1}}}]]}}