More actions
imported>qa22ahj No edit summary |
(Table transclusion repair v1) |
||
| (3 intermediate revisions by 2 users not shown) | |||
| Line 2: | Line 2: | ||
---- | ---- | ||
=== 질문 === | === 질문 === | ||
a = | |||
a = [ 'h','e','l','l','o','w','o','r','l','d'] | |||
def acb(a): | def acb(a): | ||
for i in a: | for i in a: | ||
print i | print i | ||
acb(a) | acb(a) | ||
약간..변형으로.. | |||
a='hello world' | a='hello world' | ||
| Line 15: | Line 17: | ||
acd(a) | acd(a) | ||
결과는 위에것이랑.완전 같음..이유는 당연히 모르겠어요...난감...;;;; | |||
=== 답변 1 === | === 답변 1 === | ||
어떻게 같은 동작을 하는지 이유를 모르겠다고 했지. | 어떻게 같은 동작을 하는지 이유를 모르겠다고 했지. | ||
이유는 hello world라는 문자열 a 역시 C++의 배열과 비슷하게 쓸 수 있기 때문이야. h는 | 이유는 hello world라는 문자열 a 역시 C++의 배열과 비슷하게 쓸 수 있기 때문이야. h는 | ||
a | a[0] | ||
, e 는 | , e 는 a[1]... 이런식으로 말이야. | ||
하지만 배열 원소의 값을 바꿀 수는 없다는 점이 C++의 배열하고 다른 점이지. | 하지만 배열 원소의 값을 바꿀 수는 없다는 점이 C++의 배열하고 다른 점이지. | ||
| Line 32: | Line 33: | ||
python은 다릅니다. | python은 다릅니다. | ||
for i in 'helloworld':print i, | for i in 'helloworld':print i, | ||
for i in | for i in [ 'h','e','l','l','o','w','o','r','l','d']:print i, | ||
질문과 같은 맥락의 이 두동작이 같은지 따져 볼까요? | 질문과 같은 맥락의 이 두동작이 같은지 따져 볼까요? | ||
| Line 39: | Line 40: | ||
for_stmt ::= "for" target_list "in" expression_list ":" suite | for_stmt ::= "for" target_list "in" expression_list ":" suite | ||
["else" ":" suite] | |||
--- | --- | ||
알아먹게 적어보자면, | 알아먹게 적어보자면, | ||
| Line 47: | Line 48: | ||
in 다음에 와야할 문은 시퀀스형 입니다. | in 다음에 와야할 문은 시퀀스형 입니다. | ||
시퀀스의 정의는 다음과 같습니다. | 시퀀스의 정의는 다음과 같습니다. | ||
Sequences | 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]. | 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]. | ||
| Line 58: | Line 58: | ||
... 슬라이싱 관련 정의...후략 | ... 슬라이싱 관련 정의...후략 | ||
내장형의 시퀀스는 2.3 기준으로 여섯가지가 미리 정의 되어 있습니다. | 내장형의 시퀀스는 2.3 기준으로 여섯가지가 미리 정의 되어 있습니다. | ||
There are six sequence types: strings, Unicode strings, lists, tuples, buffers, and xrange objects | |||
내장형인 strings 도 시퀀스 형이며, | 내장형인 strings 도 시퀀스 형이며, | ||
a | a[i] | ||
형태로 접근할수 있습니다. 따라서, | 형태로 접근할수 있습니다. 따라서, | ||
| Line 69: | Line 68: | ||
위에 기술된대로 list형 역시 시퀀스 형이며, | 위에 기술된대로 list형 역시 시퀀스 형이며, | ||
a | a[i] | ||
형태로 접근할수 있습니다. | 형태로 접근할수 있습니다. | ||
for i in | for i in [ 'h','e','l','l','o','w','o','r','l','d']:print i, | ||
도 역시 i가 'h','e'.. 를 반복하게 됩니다. | 도 역시 i가 'h','e'.. 를 반복하게 됩니다. | ||
| Line 90: | Line 89: | ||
---- | ---- | ||
PythonLanguage | PythonLanguage | ||
Latest revision as of 12:46, 27 March 2026
Python 의 For Statement 에 관한 글입니다.
질문
a = [ 'h','e','l','l','o','w','o','r','l','d'] def acb(a): for i in a: print i acb(a)
약간..변형으로..
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은 다릅니다.
for i in 'helloworld':print i, for i in [ 'h','e','l','l','o','w','o','r','l','d']:print i,
질문과 같은 맥락의 이 두동작이 같은지 따져 볼까요?
우선 for 문의 정의를 알아 봅시다.
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 도 시퀀스 형이며,
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
PythonLanguage