Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

PythonForStatement: Difference between revisions

From ZeroWiki
imported>qa22ahj
No edit summary
(Table transclusion repair v1)
 
(3 intermediate revisions by 2 users not shown)
Line 2: Line 2:
----
----
=== 질문 ===
=== 질문 ===
  a = [ 'h','e','l','l','o','w','o','r','l','d']
 
  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[0]
  a[0]
, e 는 {{{a[1]}}}... 이런식으로 말이야.
, 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 [ 'h','e','l','l','o','w','o','r','l','d']:print i,
  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]
     ["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|}}
There are six sequence types: strings, Unicode strings, lists, tuples, buffers, and xrange objects
내장형인 strings 도 시퀀스 형이며,  
내장형인 strings 도 시퀀스 형이며,  
  a[i]
  a[i]
형태로 접근할수 있습니다. 따라서,
형태로 접근할수 있습니다. 따라서,


Line 69: Line 68:


위에 기술된대로 list형 역시 시퀀스 형이며,  
위에 기술된대로 list형 역시 시퀀스 형이며,  
  a[i]
  a[i]
형태로 접근할수 있습니다.
형태로 접근할수 있습니다.
  for i in [ 'h','e','l','l','o','w','o','r','l','d']:print i,
  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