파이썬의 while 명령은 단순 반복을 수행한다.


while 조건식:
실행문
....


여기서 조건식이 참이면 실행문을 수행하고 다시 조건을 검사한다. 즉, 조건문이 거짓이 될 때까지 실행문을 반복 수행하는 것이다.


>>> m,p = 1,1
>>> while m<=10:
...     p *= m
...     m += 1
>>> p
3628800


이  예는 10! 을 구하는 프로그램이다. 10!=3628800 이라는 것을 알 수 있다.


 for문과 마찬가지로 while 문도 else 절이 붙을 수 있다.


while 조건식:
실행문들1
else:
실행문들2


조건식이 거짓으로 판정되어서 ‘실행문들1’이 수행되지 않을 때 else 절의 ‘실행문들2’가 수행된다. 만약 break 문에 의해서 반복이 끝난다면 (for반복문과 마찬가지로) else절은 수행되지 않고 그 바깥으로 빠져 나가게 된다.


n=3
while n>=0:
   m = input("Enter a interger :")
   if int(m)==0: break
   n -= 1
else:
   print('4 inputs.')


이 예제는 4개의 0이 아닌 정수를 입력 받으면 else 절이 수행된다.


.#실행 결과 1
Enter a interger :1
Enter a interger :2
Enter a interger :3
Enter a interger :4
4 inputs.


만약 그 전에 0이 입력된다면 else 절이 수행되지 않고 while 반복문을 완전히 종료하게 된다.


# 실행 결과 2
Enter a interger :0


for 반복문과 마찬가지로 break 문에 의한 반복 종료인지 아니면 조건문이 False 가 되어서 반복문을 종료하는 지를 구별하여 다른 실행문을 수행할 경우에 while ~ else 절을 사용하면 된다.


m=997
n=2
while n<m//2:
if m%n==0: break
n += 1
else:
print(m,'is a prime number!')


이 예는 997이 소수(prime number)인지 아닌지 판별하는 함수이다. 2부터 498까지 차례로 나누어서 나머지가 한번이라도 0이 된다면 break 문에 걸리게 된다. 만약 한 번도 0이 아니라서 반복문이 끝까지 돌았다면 else 절이 수행되어 소수임을 표시한다.(음영진 부분은 seq 형이다.)



Posted by 살레시오
,

 파이썬의 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 구문을 사용하면 된다.



Posted by 살레시오
,

 파이썬의 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)은 ‘----------’ 을 출력한다.




Posted by 살레시오
,