티스토리 뷰

728x90

프로그래밍 언어가 제공하는 핵심 기능중 하나는 제어 흐름을 기술 할 수 있도록 하는 것으로 제어 흐름에는 해야할 작업을 차례대로 나열하는 순차적 흐름, 특정 조건에 따라 True 또는 False로 흐름을 변경하는 조건적 흐름, 일정한 조건을 따르는 반복 흐름을 대표적인 것으로 들 수 있습니다. 이런 흐름 제어의 중심에 비교 연산이나 논리 연산이 자리 잡고 있으며 앞선 "파이썬 스칼라 타입, 논리(Boolean) - 파이썬 배우기(Python)"에서 기본적인 내용을 다루었습니다. 몇가지 꼭 기억할 사항 옮겨보면 아래와 같습니다.

 

파이썬에서는 True와 False라는(대소문자 주의) 특별한 값을 제공하고 있으며 False, 0, None, '', "", (), [], {} 등을  모두 False로 처리 합니다. 아래는 주요 연산자들 입니다.


    • ==
      양쪽이 같으면 True.

    • <, <=
      우측 보다 작으면, 작거나 같으면 True

    • >, >=
      우측 보다 크면, 크거나 같으면 True

    • a<b<c
      복합 조건으로 다른 언어에서는 and로 묶어서 처리해야 했으나, 파이썬에서는 간편하게 기술하면서도 프로그램을 읽기 쉽도록 했습니다.

    • !=, <>
      양쪽이 다르면 True. 파이썬에서는 두가지를 모두 사용할 수 있습니다.

    • and
      양쪽이 모두 True 이면 True. 단, and와 or 연산자는 항상 True와 False 값만 리턴하지 않습니다.
      좌측에서 우측으로 비교를 진행 하는데 최종 비교 대상 값을 그대로 리턴 합니다. 예를 들어 a and b에서 a가 False로 판단되면 a값 그대로를 리턴 합니다. a or b에서 a가 True라면 b를 볼필요가 없으므로 a 값을 그대로 리턴 합니다. 

    • or
      둘 중에 하나라도 True면 True.

    • not
      우측 bool 값을 반대로. True면 False. False면 True

    • a is b
      a와 b가 동일한 값이면 True를 리턴 합니다. 스칼라 타입은 값이 같다면 True지만, 리스트의 경우에는 값이 같이 보여도 값을 각각 따로 저장하는 경우는 False이고 다른 리스트를 참조하는 경우에만 동일한 메모리 참조로 True를 리턴 합니다.


■ 들여쓰기를(Indentation) 통한 블럭 구분


C, Java, Pascal등 다른 언어에서는 if, while등의 블럭이나 함수의 블럭을 {}나 begin-end블럭으로 구분하는데 파이썬에서는  들여쓰기를 통해서 블럭을 구분 합니다. 다른 언어와 파이썬을 구분하는 아주 독특한 특징입니다. 몇가지 원칙이 있는데, 타언어에 익숙한 프로그래머의 경우 처음에는 익숙치 않을 수 있지만 몇번 사용하게 되면 코드를 읽기 쉽게 하고 오류를 줄일 수 있는 좋은 방법이라는데 공감하게 될 것입니다. 아래는 파이썬의 들여쓰기를 통한 블럭 구분의 몇가지 중요한 원칙 입니다.


    • 최상단 블럭, 즉 프로그램을 시작할 때의 블럭은 1컬럼에서 기술 합니다.
      초창기 컴퓨터의 펀치 카드 시스템으로 코볼이나 포트란을 구동시킬 때의 규칙을 연상시키지만, 원칙을 몇번 지키다 보면 굳이 규칙으로 느껴지지 않는 법입니다.

    • 동일 블럭은 동일한 들여쓰기를 갖습니다.
      들여쓰기 크기는 제한이 없지만 내부 블럭은 블럭을 내포하는 상위의 문장 기준으로 동일한 크기의 들여쓰기를 해야 한다는 의미 입니다.

    • 탭 문자 크기에 따라 공백 문자를 대치할 수 있습니다.
      탭 문자 1개당 공백 8개를 설정한 경우 탭 1개로 들여쓰기 한 것과 공백 8개로 들여쓰기 한 것이 같은 효력을 미친 다는 것입니다. 그러나, 시스템의 탭 설정에 따라 혼란이 있을 수 있으므로 섞어쓰기를 지양하고 탭 문자만으로 들여쓰기 하거나 공백 문자만으로 들여쓰기를 적용합니다. IDLE에서의 탭설정은 아래의 그림처럼 Options>IDLE Configuration>Fonts/Tabs 탬에서 Indentation Width로 설정합니다.



■ 대입/치환문


"변수 = 표현"의 가장 기본적인 문장 형태로 = 연산자 좌측의 변수(l-value)에는 tuple의 원소와 같은 변경 불가한 변수를 제외한 어떠한 변수들도 올 수 있습니다. 


여러 변수에 동일한 값을 대입할 경우에는 a = b = c = 10 같이 기술할 수 있습니다.


C언어에서 처럼 a = a + 1같이 대입 연산자 양쪽에 동일한 변수가 있는 경우에는 += 형태의 대입연산자를 사용할 수 있습니다.


# 다중 대입문

= 양쪽에 여러개의 변수, 여러개의 표현을 한번에 기술하는 것으로 ,(comma)로 구분하며 양쪽의 변수 및 표현의 개수는 동일 해야 합니다. 다중 대입문을 사용하면 아래의 예와 같이 간단하게 두 변수의 값을 바꾸는 swap 기능을 기술할 수 있습니다.


>>> a, b = 1, 4

>>> a, b = b, a

>>> print a, b

4  1


다중 대입문과 배열

위에서 언급한 다중 대입문은 결국 우측의 표현들이 튜플 형태로 왼쪽에 전달 되는 것으로 아래와 같이 명시적으로 리스트를 전달해도 마찬가지 결과를 얻을 수 있다.


>>> c = [1, 4]

>>> a, b = c # a, b = [1, 4]도 동일 효과

>>> a, b = b, a

>>> print a, b

4  1




■ if - elif - else


가장 기본적인 제어 구조로 아래와 같은 기본 문형을 갖습니다.


if 조건:

코드 블럭

elif 조건:

코드 블럭

else:

코드 블럭


    • elif와 else는 흐름에 따라 기술하지 않을 수 있고, elif의 경우에는 여러 개의 elif 조건으로 여러 개의 선택 조건을 기술 할 수 있습니다.

    • 콜론(:)으로 조건의 끝과 코드 블럭의 시작을 지시 합니다.

    • 코드 블럭에 또 다른 if - elif - else를 포함할 수 있습니다.

    • 코드 블럭이 단일 문장인 경우에는 줄을 나누지 않고 콜론(:) 다음에 연속해서 코드를 기술 할 수 있습니다.

    • if - elif - else는 세로로 동일 컬럼에 기술 되어야 합니다.

    • 코드 블럭에 아무 것도 할 것이 없을 때는 pass 문장을 기입 할 수 있습니다.

      if n%2 == 0:

          pass

      else:

          count += 1

    • "assert 조건"으로 프로그램 실행중 반드시 True 상태 임을 검증할 수 있습니다. 만약 조건이 True가 아니면 AssertionError 예외를 발생시킵니다.

    • if - else를 조건문이 아니라 C나 Java언어의 변수 = (조건 ) ? :; 처럼 연산자로 사용할 수 있습니다.
      형식은 "True값 if 조건 else False값"으로 사용하여 문장을 좀더 단순화 시킬 수 있습니다.
      average = sum/count if count != 0 else None 문장은 아래의 문장을 if-else 연산자로 줄인 것입니다.

      if count != 0:

          average= sum/count

      else:

          average= None




■ for 반복문


다른 언어에서 for 문은 초기값, 조건, 증분등의 요소로 반복 수행할 블럭을 묶지만 파이썬에서는 수행할 대상(리스트)이 정해진 경우에 리스트의 각 원소들을 차례대로 반복 수행하기 위한 용도로 사용 합니다. C#, Perl이나 PHP의 foreach와 유사한 형태로 동작하며 아래와 같은 기본 문형을 갖습니다.


for 변수 in 리스트:

코드 블럭


리스트에는 파이썬 배열 타입(튜플, 리스트, 사전)의 변수나 값, 또는 배열을 리턴하는 함수도 올 수 있습니다. 앞선 포스팅의 배열(Array)에서 다루었던  단순 숫자 리스트를 리턴하는 range() 함수를 사용하면 다른 언어의 for 문과 유사한 동작 형태를 보다 간단하게 기술할 수 있습니다.


range(i, j, k)는 i 위치 부터 j위치까지(j위치는 포함되지 않는다. 직전 위치의 항목까지만) k만큼씩 움직이면서 해당하는 정수를 원소로 하는 리스트를 리턴 합니다. range(j)는 range(0, j)의 의미로 사용 합니다. k가 음수면 역방향 진행을 의미 합니다. for 다음의 변수에는 루프 운행과정의 각 원소 값이 입력되어 코드 블럭에서 사용하는 형태가 됩니다. 아래의 3가지 문장은 동일한 효과를 냅니다.


for o in range(1,36,2):

    print o


for o in [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35]:
print o

ary_a = [1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35]
for o in ary_a:
print o

    • 코드 블럭이 간단한 한 문장이라면 콜론(:) 다음에 연속해서 기술할 수 있습니다.

    • 코드 블럭은 들여쓰기 규칙을 준수해야 하고 또다른 for 문장을 포함 시킬 수 있습니다.

    • break 문장을 사용하면 중간에 코드 블럭에서 빠져 나올 수 있고

    • continue 문장을 사용하면 코드 블럭의 나머지를 수행하지 않고 블럭의 처음부터 다시 다음 원소에 대한 루프를 계속할 수 있습니다.

    • 배열내에 배열이 있는 경우에는 for 와 in 사이에 리스트 참조 형태로 기술하여 내부 배열을 손쉽게 참조할 수 있습니다.

      >>> a = (('name', '홍길동'), ('age', 30), ('sex', 'male'))

      >>> for fld, val in a:

      print fld, val


      name 홍길동

      age 30

      sex male




■ while 반복문


지정한 조건이 True일 동안 프로그램을 반복 수행할 경우에 사용하며 기본 문형은 아래와  같습니다.


while 조건:

코드 블럭

else:

코드 블럭


    • else: 이하는 최초 조건 비교시 True가 아닐 경우에만 수행 합니다. 이 문장은 생략할 수 있습니다.

    • break 문장을 사용하면 코드 블럭에서 빠져 나올 수 있는데 else:문이 있어도 else:문 블럭을 수행하는 것은 아닙니다.

    • continue 문장을 사용하면 조건 비교로 다시 이동 합니다.


sum = 0

i = 0

while i < 10:

i += 1

sum += i

print i, sum




728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함