일반인을 위한 파이썬 지침서/For 회돌이
자 여기에 이 장을 위한 새로운 타이핑 연습이 있다.
onetoten = range(1,11) for count in onetoten: print count
그리고 언제나와 같이 그 출력은 다음과 같다.
1 2 3 4 5 6 7 8 9 10
출력은 대단히 친숙하지만 그 프로그램의 코드는 다른게 보인다. 첫 번째 라인은 range 함수를 사용한다. range 함수는 'range(start,finish)' 와 같은 형식으로 두 개의 인수를 사용한다. start는 생성되는 첫 번째 숫자이다. finish 는 가장 마지막 숫자보다 더 큰 숫자이다. 이 프로그램은 더 짧은 방식으로 실행될수도 있었음을 주목하라.
for count in range(1,11): print count
range 명령어로 무슨일을 하는지 보여주는 몇가지 예제가 있다.
>>> range(1,10) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(-32, -20) [-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21] >>> range(5,21) [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20] >>> range(21,5) []
다음 라인 'for count in onetoten:'는 for 제어 구조를 사용한다. for 제어 구조는 'for variable in list:' 형태이다. list 는 리스트의 첫 번째 요소로 부터 시작하여 마지막까지 간다. for 문은 리스트의 각 요소를 따라가면서 그것을 변수variable에 각각 집어 넣는다. 그렇게 해서 for 회돌이가 실행될 때마다 각각 variable이 사용될 수 있다. 여기에 또 하나 보여줄 예제가 있다.(여러분은 타이핑할 필요가 없다.)
demolist = ['life',42, 'the universe', 6,'and',7,'everything'] for item in demolist: print "The Current item is:", print item
그 출력은 다음과 같다.
The Current item is: life The Current item is: 42 The Current item is: the universe The Current item is: 6 The Current item is: and The Current item is: 7 The Current item is: everything
for 회돌이는 진행하면서 리스트에 있는 각 요소에 'item'을 설정하고 있는 것을 주목하라. (여러분이 print 가 다음라인으로 가기를 원치 않는다면 그 서술문의 뒤에다가 콤마를 추가 하라 (즉, 여러분이 그 라인에 다른 무언가를 출력하려고 한다면).) 그럼, for는 무엇이 유익한가? (음~) 첫 번째 사용법은 리스트의 모든 요소들을 순회하고 각각에 대하여 무언가를 하는 것이다. 여기에 모든 요소들을 더하는 간결한 방법이 있다.
l = [2,4,6,8] sum = 0 for num in l: sum = sum + num print "The sum is: ",sum
그 출력을 간단히 보이면 다음과 같다.
The sum is: 20
또는 여러분은 다음 프로그램이 하는 바와 같이 하나의 리스트에서 어떤 중복이 있는지 알아보는 프로그램을 작성해 볼수도 있다.
l = [4, 5, 7, 8, 9, 1,0,7,10] l.sort() prev = l[0] del l[0] for item in l: if prev == item: print "Duplicate of ",prev," Found" prev = item 좋은 방법? and for a good measure: Duplicate of 7 Found
좋다, 그럼 그것은 어떻게 작동하는가? 여기에 여러분이 이해를 도울, 특별한 디버깅 버전이 있다.(여러분은 이것을 타이프해 넣을 필요가 없다.)
l = [4, 5, 7, 8, 9, 1,0,7,10] print "l = [4, 5, 7, 8, 9, 1,0,7,10]","\tl:",l l.sort() print "l.sort()","\tl:",l prev = l[0] print "prev = l[0]","\tprev:",prev del l[0] print "del l[0]","\tl:",l for item in l: if prev == item: print "Duplicate of ",prev," Found" print "if prev == item:","\tprev:",prev,"\titem:",item prev = item print "prev = item","\t\tprev:",prev,"\titem:",item
출력을 보이면 다음과 같다.
l = [4, 5, 7, 8, 9, 1,0,7,10] l: [4, 5, 7, 8, 9, 1, 0, 7, 10] l.sort() l: [0, 1, 4, 5, 7, 7, 8, 9, 10] prev = l[0] prev: 0 del l[0] l: [1, 4, 5, 7, 7, 8, 9, 10] if prev == item: prev: 0 item: 1 prev = item prev: 1 item: 1 if prev == item: prev: 1 item: 4 prev = item prev: 4 item: 4 if prev == item: prev: 4 item: 5 prev = item prev: 5 item: 5 if prev == item: prev: 5 item: 7 prev = item prev: 7 item: 7 Duplicate of 7 Found if prev == item: prev: 7 item: 7 prev = item prev: 7 item: 7 if prev == item: prev: 7 item: 8 prev = item prev: 8 item: 8 if prev == item: prev: 8 item: 9 prev = item prev: 9 item: 9 if prev == item: prev: 9 item: 10 prev = item prev: 10 item: 10
내가 이 코드에 이렇게 많은 print서술문을 쓰는 이유는 여러분이 각라인에서 무엇이 일어나는지를 볼 수 있게 하기 위해서이다. (그런데, 왜 프로그램이 작동하지 않는지 이해가 안간다면, print 서술문을 많이 삽입하여서 무슨일이 일어나는지 보도록 하라) 먼저 프로그램은 예의 지겹도록 친숙한 리스트로 시작한다. 다음으로 프로그램은 리스트를 정렬한다. 이것은 중복값들이 바로 옆에 출력하도록 하기 위한 것이다. 프로그램은 그리고는 prev(ious)변수를 초기화한다. 다음으로 리스트의 첫 번째 요소는 삭제되어서 첫 번째 항목이 중복이라고 부적절하게 생각하지 않도록 한다. 다음으로 for회돌이는 안쪽으로 들어간다. 리스트의 각 요소는 그 전의 값과 같은지 점검된다. 만약 중복이 발견되면, prev 의 값은 그러면 변경되어서 다음번에 for 회돌이가 실행될 때 prev 가 현재항목에 대하여 이전의 항목이 되도록 한다. 자 이제, 7이 중복으로 발견된다. ( '\t' 가 탭문자를 출력하기 위해 사용되었음을 주목하라).
for 회돌이를 사용하는 또 다른 방법은 일정한 횟수의 작업을 하는 것이다. 여기에 피보나치 수열의 앞부분 9개의(주의:원본에는 11로 되어 있음) 숫자를 출력하는 코드가 있다.
a = 1 b = 1 for c in range(1,10): print a, n = a + b a = b b = n
그 놀라운 출력을 여기에 보인다.
1 1 2 3 5 8 13 21 34
for 회돌이로 할수 있는 모든 것은 while 회돌이로 할 수는 있지만, for 회돌이는 하나의 리스트에 있는 모든 요소들을 순회하거나, 혹은 일정한 횟수의 작업을 하기 위한 쉬운 방법을 제공해 준다.