레이블이 for인 게시물을 표시합니다. 모든 게시물 표시
레이블이 for인 게시물을 표시합니다. 모든 게시물 표시

2015년 7월 28일 화요일

맥시마(maxima)의 for 반복문

 맥시마는 반복 수행을 위한 명령어 for 가 있다. 문법은 다음 표에 정리한 바와 같다.

[표 1] for반복문의 문법
생략 가능
(기본값은 1)
다음 중 택일
(반드시 하나는 있어야 함>
for <변수>:<초기값>
step <증감값>
thru <끝값>
do <수행문>
while <조건식>
unless <조건식>
for <변수> in <list>
do <수행문>

먼저 반복문에서 사용할 변수를 초기화 시켜야 한다. 그 다음에 증감값을 step명령 다음에 지정해 준다. 이 증감값은 생략가능하며 이 경우 기본값인 1로 지정된다.

가장 기본적인 사용법의 예는 다음과 같다. (display함수는 단순히 변수의 값을 화면에 출력하는 함수임)
만약 1부터 100까지의 합을 구하고 싶다면 다음과 같다.
증감값을 정하고 싶다면 step 명령어를 다음과 같이 이용한다.
for문을 이용하여 x5+x4+x3+x2+x+1을 생성하면 다음과 같다.
같은 명령을 thru 대신 while을 이용하면 다음과 같다.

또 다른 예로서 리스트 [0, 1, 2, 3, … , 29, 30]를 생성하려면 다음과 같이 하면 된다. 다음 명령을 입력한 후에 그 결과를 확인해 보자. (/*~*/사이의 주석문은 입력할 필요가 없다.)

똑같은 명령을 unless를 이용하여 작성하면 다음과 같다.
이러한 for문을 이용하여 다양한 반복 작업과 많은 요소를 갖는 객체(리스트나 다항식 등)를 생성할 수 있다.


2015년 7월 20일 월요일

싸이랩(scialb)의 for 반복문

 Scilab의 for 명령은 반복을 수행하기 위해서 사용되며. for 와 end 사이의 명령어들을 주어진 변수값을 가지고 반복 수행한다. 간단한 예를 들면 다음과 같다.
--> for n=1:5, disp(n), end

이 명령은 disp(n)이라는 명령을 반복해서 수행하는데 다음과 같은 결과를 표시한다.

         1.
         2.
         3.
         4.
         5.
 
이 예제에서 반복은 벡터에 대해서 수행되었다. 이전에 콜론(:) 연산자는 행벡터를 생성한다고 설명한 바 있다. 따라서 위의 예는 다음과 완전히 동일하다.
--> for n=[1 2 3 4 5], disp(n), end
하지만 전자의 경우가 훨씬 더 간략하므로 만약 등간격의 변수들에 대한 반복을 수행한다면 전자와 같이 사용하는 것이 더 일반적이다. (1부터 1000까지 반복하는 경우라면 후자같이 사용하지는 못할 것이다.)
 만약 1부터 10까지의 숫자 중 홀수에 대해서만 반복을 수행하고 싶다면 다음과 같이 하면 될 것이다.

--> for n=1:2:10, disp(n), end
 
그려면 화면에는 1부터 시작해서 하나씩 건너 뛴 숫자들을 표시할 것이다.

         1.
         3.
         5.
         7.
         9.
 
증분값을 음수로 주면 역순으로 수행할 수도 있다. 예를 들어서

--> for n=5:-1:1, disp(n), end
이라고 하면 화면에 5부터 1까지 역순으로 표시되는 것을 확인할 수 있다.
 for 반복문에서 사용되는 변수값은 꼭 정수뿐만 아니라 다양한 값이 될 수 있다. 실수의 예를 들면 다음과 같다.
--> for n=linspace(0,1,5),disp(n),end
    0.  
    0.25  
    0.5  
    0.75  
    1.  
또는 다음과 같이 실수가 아닌 경우도 된다.

--> for n=[0.1, %i, %pi, %e],disp(n),end
    0.1  
    i    
    3.1415927  
    2.7182818
 
반복 변수에 행렬이 지정될 때에는 그 행렬의 각각의 열벡터로 반복을 수행한다. 예를 들어서
--> for n=[1 2 3;4 5 6], disp(n), end
라는 반복문의 경우 세 번 반복이 수행되는데 각각의 반복문에서 n변수의 값은 [1;4], [2;5], [3;6], 즉 첫 번째 열, 두 번째 열, 그리고 세 번째 열이 된다. 따라서 결과는 다음과 같다.

   1.  
   4.  
   2.  
   5.  

   3.   
   6.  


2015년 5월 26일 화요일

파이썬의 break 명령과 for ~ else 구문

 파이썬의 for 반복문 안에서 break 명령을 사용할 수 있는데 이 명령은 즉시 그것이 포함된 가장 안 쪽의 반복문을 빠져 나온다. 다음 반복문을 보자.

for n in lst:
   if n==0:
       break
   print(n)

이것은 lst 안의 요소들을 차례대로 프린트하다가 0이 발견되면 바로 반복을 멈추는 프로그램이다. 만약 lst=[1,2,3,0,4,5] 라면 1,2,3만 출력되고 반복문은 종료될 것이다. 만약 반복문의 중첩되어 있다면 가장 안쪽의 반복문만 빠져 나온다는 점에 유의해야 한다.

파이썬의 for 반복문은 else 명령과 짝을 이룰 수도 있다.

for 변수 in 반복가능자:
   수행문들1
else:
   수행문들2

else 블럭에 포함된 ‘수행문들2’는 for 반복문이 반복형의 마지막 요소까지 모두 반복했을 경우 그 다음에 수행된다. 즉, 모든 반복이 성공적으로 수행된 경우에 한 번 수행된다. 하지만 break문을 만나면 else 구문은 수행되지 않고 for 블럭을 완전히 빠져나간다.

for n in lst:
   if n==0: break
   print(n)
else:
   print(‘There is no 0.’) # break문을 만나지 않았다면 수행된다.

이 예제의 경우 lst 안에 0이 있다면 break를 만나게 되고 따라서  else 블럭은 수행되지 않고 for 반목문을 빠져 나오게 된다.

따라서 for 반복문이 종료된 시점에서 이 종료가 모든 반복을 다 수행한 후의 정상적인 종료인지, 아니면 break 명령에 의한 강제 종료인지에 따라서 수행해야 될 일을 구분할 필요가 있는 경우에 for~else 구문을 사용하면 된다.


파이썬의 for반복문과 range형

 파이썬의 for 반복문은 C/C++의 그것과는 약간 다르다. (JAVA나 C#의 foreach 명령과 유사한 점이 많다.) 기본 적인 문법은 다음과 같다.

for 변수 in 반복형:
수행문

여기서 반복형은  열거형(sequence,  range형, 문자열, 리스트, 튜플 등), 딕셔너리 등이 있다.

 예로 기존의 리스트를 이용하여 리스트 요소들 중 짝수의 개수를 세는 프로그램을 작성해 보자.

>>> lst = [11, 44, 21, 55, 101]
>>> cnt = 0
>>> for n in lst :
if n%2==0:
cnt += 1
>>> cnt
1

이 예제는 리스트 lst 의 각 요소가 순서대로 n 변수에 대입되고 반복문이 수행된다.

range()함수와 range 형

 for 구문과 자주 같이 사용되는 파이썬 내장 함수 중에서 range() 함수가 있는데 이 함수는 range 형을 만들어 준다. (range 형은 시퀀스 형에 속한다.) for 반복문과 조합되어서 자주 사용되므로 여기에서 자세히 설명하도록 하겠다. range() 함수는 세 가지 용법이 있다. 다음에서 m, n, s는 정수이다.

range(n)  # 0 부터 n-1 까지의 요소를 가지는 range 형 반환
range(m,n)  # m 부터 n-1 까지의 요소를 가지는 range 형 반환
range(m,n,s)  # m 부터 n-1 까지의 요소(s는 step)를 가지는 range 형 반환

한 가지 주의할 점은 파이썬 3.x에서는 range()함수는 range 형을 반환한다. (반면 파이썬 2.x 에서는 리스트를 반환한다.) 따라서 파이썬 3.x에서는 이 rangeg형을 리스트로 만들기 위해서는 list()함수를 반드시 명시적으로 사용해야 한다.

>>> range(5)
range(0,5)
>>> list(range(5))
[0,1,2,3,4]
>>> list(range(1,11))
[1,2,3,4,5,6,7,8,9,10]
>>> list(range(0,30,5)) # 5가 증분
[0,5,10,15,20,25]
>>> list(range(0,-5,-1)) # -1이 증분
[0,-1,-2,-3,-4]
>>> list(range(0))
[]
>>> list(range(1,0))
[]

하지만 for문 안에서 range 함수를 사용할 경우 궂이 리스트로 바꿀 필요는 없다. 왜냐면 for 문에는 반복형(iterable)이 사용되며 range 객체는 열거형(sequence)이므로 반복형이기 때문이다.
예를 들어서 ‘hi.’라는 문자열을 다섯 번 출력하는 프로그램을 작성해 보자.

for _ in range(5):
print(‘hi.’)

이 반복문은 변수 _ 가 0,1,2,3,4 값을 가지고 각각 반복을 수행하게 된다. 실제 이 변수가 사용되지는 않으므로 그냥 _ 로 지정하였다. (파이썬에서 dummy variable 의 이름은 보통 _ 로 지정한다.)

구구단의 2단을 출력하는 프로그램을 작성해 보자.

>>> for n in range(2,10):
...     print('2 x %d = %d'%(n, 2*n))

2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

여기서 변수 n은 2부터 9까지의 값을 가지고 반복문이 수행된다. range(2,10)은 2부터 9까지의 숫자를 차례로 생성한다.

for 반복문은 중첩해서도 얼마든지 사용할 수 있다. 구구단의 2단부터 9단까지 한꺼번에 출력하려면 다음과 같이 작성하면 될 것이다.

>>> for m in range(2,10):
...     for n in range(2,10):
...             print('%d x %d = %d'%(m,n,m*n))
...     print('-'*10)

여기에서 print(‘-’*10)은 ‘----------’ 을 출력한다.