Python 의 For Statement 에 관한 글입니다. ---- === 질문 === {{{~cpp a = [ 'h','e','l','l','o','w','o','r','l','d'] def acb(a): for i in a: print i acb(a) }}} 약간..변형으로.. {{{~cpp a='hello world' def acd(a): for d in a: print d acd(a) }}} 결과는 위에것이랑.완전 같음..이유는 당연히 모르겠어요...난감...;;;; === 답변 1 === 어떻게 같은 동작을 하는지 이유를 모르겠다고 했지. 이유는 hello world라는 문자열 a 역시 C++의 배열과 비슷하게 쓸 수 있기 때문이야. h는 {{{a[0]}}}, e 는 {{{a[1]}}}... 이런식으로 말이야. 하지만 배열 원소의 값을 바꿀 수는 없다는 점이 C++의 배열하고 다른 점이지. 비슷한 것을 찾자면 C++의 배열보다는 C++의 string 클래스, Java의 String 클래스와 비슷하다는 점을 알 수 있어. -- [Leonardong] === 답변 2 === python의 for statement 문법의 근원적인 차원으로 접근해 봅시다. python은 다릅니다. {{{~cpp for i in 'helloworld':print i, for i in [ 'h','e','l','l','o','w','o','r','l','d']:print i, }}} 질문과 같은 맥락의 이 두동작이 같은지 따져 볼까요? 우선 for 문의 정의를 알아 봅시다. {{{~cpp for statement definition for_stmt ::= "for" target_list "in" expression_list ":" suite ["else" ":" suite] --- 알아먹게 적어보자면, for 타겟객체리스트(target) in 시퀀스형(expression_list==sequence): 식(expression) }}} in 다음에 와야할 문은 시퀀스형 입니다. 시퀀스의 정의는 다음과 같습니다. {{| Sequences These represent finite ordered sets indexed by non-negative numbers. The built-in function len() returns the number of items of a sequence. When the length of a sequence is n, the index set contains the numbers 0, 1, ..., n-1. Item i of sequence a is selected by a[i]. ... 친절한 해석 :) 시퀀스 음수가 아닌수로 제한되어 있으며 순서가 매겨진 집합. 내장함수인 len()는 시퀀스의 아이템 갯수를 반환한다. 시퀀스의 길이라 n이면, 인덱스는 0..n-1 까지의 범위를 가진다. 시퀀스의 아이템 i는 a[i]로 선택된다. ... 슬라이싱 관련 정의...후략 |}} 내장형의 시퀀스는 2.3 기준으로 여섯가지가 미리 정의 되어 있습니다. {{|There are six sequence types: strings, Unicode strings, lists, tuples, buffers, and xrange objects|}} 내장형인 strings 도 시퀀스 형이며, {{{~cpp a[i]}}} 형태로 접근할수 있습니다. 따라서, {{{~cpp for i in 'helloworld': print i, }}} 에서 i는 반복적으로 'h','e'... 을 반환하며 위에 기술된대로 list형 역시 시퀀스 형이며, {{{~cpp a[i]}}} 형태로 접근할수 있습니다. {{{~cpp for i in [ 'h','e','l','l','o','w','o','r','l','d']:print i, }}} 도 역시 i가 'h','e'.. 를 반복하게 됩니다. 여기까지 알아 보시려면, Python Language Reference에서 sequence, for statement로 열심히 찾아 보시면 됩니다. 열혈강의 파이썬에도 잘 나와있습니다. 그리고 다음의 이야기들은 다른 언어를 좀 아시면 이해가실 겁니다. C / Java 1.4 이하버전 의 for 제어문은 객체의 특성을 따라 동작하지 않습니다. 이 언어들에서 for문은 정해진 조건문을 검사하면서, 탈출합니다. 즉, while문을 사람이 읽기 쉽게 약간 고차원으로 추상화된 형태에 불과합니다. C/Java1.4이하 와 Python의 for문에 대한 관점이 '''전혀''' 다릅니다. 그리고 유용하지요. C의 for문과 구분하기 위하여 python의 이러한 for문을 보통 '''for each''' 문이라고 부릅니다. 이게 진짜 for문 이라고 이야기들 하지요. 왜 C++에 안되느냐면, C++의 제어문이 C문법에 종속되어 있고, C에서는 배열과 같이 주소를 통한 인덱스로 접근하는 형들이 종료 인덱스에 대한 정보가 없어서 구현이 불가능합니다. 추상화 시켜 C++에서는 [STL]에 for_each(..) 라는 함수로 비슷한 것이 구현되어 있기는 합니다. Java 1.5 에 advanced for statement 라는 이름으로 비슷한 것이 추가되었고, C#에는 언어가 탄생 될때 부터 있었습니다. Java 1.5에서는 수년간 논의 끝에 도입을 했는데, 언어에 녹이기 위해서는 Autoboxing/Unboxing과 편리성을 위해 Template과 같은 여러 필수불가결하고 복잡다난(?)한 개념이 함께 추가되었습니다. ref : Python Lib ref, Python Language ref, 열강파이썬 --NeoCoin ---- PythonLanguage