E D R , A S I H C RSS

Python For Statement

Python 의 For Statement 에 관한 글입니다.

질문


약간..변형으로..


결과는 위에것이랑.완전 같음..이유는 당연히 모르겠어요...난감...;;;;

답변 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 ai.
...

친절한 해석 :)

시퀀스
음수가 아닌수로 제한되어 있으며 순서가 매겨진 집합. 내장함수인 len()는 시퀀스의 아이템 갯수를 반환한다. 시퀀스의 길이라 n이면, 인덱스는 0..n-1 까지의 범위를 가진다. 시퀀스의 아이템 i는 ai로 선택된다.

... 슬라이싱 관련 정의...후략
|}}
내장형의 시퀀스는 2.3 기준으로 여섯가지가 미리 정의 되어 있습니다.
{{|There are six sequence types: strings, Unicode strings, lists, tuples, buffers, and xrange objects|}}
내장형인 strings 도 시퀀스 형이며, a[i] 형태로 접근할수 있습니다. 따라서,

for i in 'helloworld': print i,
에서 i는 반복적으로 'h','e'... 을 반환하며

위에 기술된대로 list형 역시 시퀀스 형이며, a[i] 형태로 접근할수 있습니다.
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


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2013-11-17 08:27:26
Processing time 0.0136 sec