반응형

1. if 조건문

1.1 if문

<기본형식>

if 조건 :

    명령

학번 = int(input("몇학번이십니까? : "))

if 학번 < 16 :
    print("화석입니다.")

위의 코드는 해당 사용자가 화석인지 아닌지를 판별하는 조건문(???)으로 학번을 통해 15학번부터 모두 화석으로 보고있다. 조건문을 작성할때 명령문 부분은 들여쓰기를 해야하며 조건 뒤에 콜론(" : ") 표시를 까먹지 않게 유의하자. (해석기는 들여쓰기한 줄을 윗줄의 연속으로 보기 떄문에 명령을 들여 써야 조건에 이어지는 문장이 된다. ) 아래와 같이 작성한다면 에러로 처리된다.

학번 = int(input("몇학번이십니까? : "))

if 학번 < 16 :
print("화석입니다.") #들여쓰기를 하지 않음.

1.2 비교 연산자

if문의 조건식에는 주로 변수값을 비교하는 문장이 오며 변수가 특정 값인지 평가한다. 비교 연산자는 두 값의 상등 여부나 대소관계를 비교하여 참, 거짓을 리턴하며 if문은 평가 결과에 따라 명령의 실행 여부를 결정한다.

연산자

설명

==

같다

!=

다르다

<

좌변이 우변보다 작다

>

좌변이 우변보다 크다

<=

좌변이 우변보다 작거나 같다

>=

좌변이 우변보다 크거나 같다

대입 연산자는 = 기호를 하나만 쓰는 반면 비교 연산자는 두개인 == 이다. 모양이 다르므로 잘 구분해야 한다. 대입 연산자 = 은 값을 변경하는 동작을 하지만 비교 연산자 == 은 값을 평가하기만 한다. 즉 좌변 우변이 같으면 True값을, 다르다면 False값을 리턴한다.

a = int(input("숫자를 입력하세요 : "))
if a == 3:
    print("3입니다")

if a > 3:
    print("3보다 큽니다")

if a < 3:
    print("3보다 작습니다")

문자열 비교 또한 철자 뿐만아니라 대소문자구성도 완전히 일치해야 같은 문자열로 판단한다. 문자열끼리 크고 작음을 비교할 때는 사전순으로 비교하는데 예를들어 a보다는 b가 더 크고 b보다는 c가 더 크다. 사전의 뒤쪽에 나오는 문자열을 더 큰 것으로 평가한다.

조건문에 비교 연산식 대신 변수를 대신 쓸 수도있는데, 변수 자체가 논리식이 된다.

타입

거짓

숫자

0이 아닌 숫자

0

문자열

비어 있지 않은 상태

""

리스트, 튜플, 딕셔너리

비어 있지 않은 상태

빈 상태

숫자는 0이 아닐 때 참이며 문자열이나 리스트 등의 컬렉션은 비어 있지 않으면 참이다. 뭐라도 값이 들어 있기만 하면 참으로 평가된다.

a = 0
b = 1
if a:
    print("a는참입니다")
if b:
    print("b는참입니다")

변수 자체를 논리식으로 하면 1, 2는 물론이고 -1 같은 음수도 참으로 평가된다.

C언어와 달리 조건문에 대입식은 쓸 수 없다. 다음 문장은 에러가 난다.

if a = 3:
    print("3")

C는 대입과 비교를 동시에 할 수 있어 축약된 코드를 쓸 수 있지만 실수로 인해 의도치 않은 문제가 발생하는 경우가 빈번하다. 파이썬은 부작용 방지를 위해 대입식을 조건문으로 쓰지 못하도록 명시적으로 금지한다.

1.3 논리 연산자

두 개 이상의 조건을 한꺼번에 점검할 때는 논리 연산자를 사용한다. 두 조건이 동시에 만족하는지 두 조건 중 하나라도 만족하는지 등을 점검한다. C에서의 ||, &&, !와 같은 기능을 한다.

연산자

설명

and

두 조건이 모두 참이다

or

두 조건 중 하나라도 참이다

not

조건을 반대로 뒤집는다

a = 3
if a > 1 and a < 5:
    print("3은 1과 5사이의 수 이다.")

b = 5
if b <1 or b > 3:
    print("5는 1보다 작거나 3보다 큰 수이다.")

c = 7
if not c < 5:  # 5보다 작지않다. 즉 c >= 5
    print("7은 5보다 크거나 같은 수이다.")

파이썬에서는 아래의 코드와 같이 범위를 비교할 때 변수를 가운데 두고 양쪽에 범위를 적는 문법도 허용한다.

a = 3
if 1< a < 5:
    print("3은 1과 5사이의 수 이다.")

and, or 연산자는 왼쪽으 비교식으로 전체식의 결과가 결정되었을 때 오른쪽으 비교식은 판단하지 않음으로 시간을 절약한다. 예를 들어 a == 3 adn b == 4 일때 a가 2라면 이미 전체식은 거짓이므로 b가 4인지는 판단하지 않는다. 이 기능을 쇼트 서킷(Short Circuit) 이라 하는데 불필요한 비교를 생략함으로써 속도를 높이는 기법이다.

2. 블록 구조

2.1 블록구조

if문 다음 줄에 걸리는 명령이 모두 안쪽으로 들여 써 있으면 같은 블록으로 인식되어 조건에 모두 걸리지만 들여쓰기가 맞지 않으면 조건과는 상관없는 별개의 문장이 되어 버린다.

<코드1> tab 띄워쓰기

a = 3
if 1< a < 5:
    print("명령1")
    print("명령2")

<코드2> space 띄워쓰기

a = 3
if 1< a < 5:
 print("명령1")
 print("명령2")

<코드3> 두번째 명령줄 tab 한번 더 띄워쓰기

a = 3
if 1< a < 5:
    print("명령1")
        print("명령2")  # 에러발생!

들여쓰기를 할 때 공백(space) 또는 tab을 이용해서 한다. 위의 3개의 코드 중에서 마지막 코드는 4번째 줄에서 3번째 줄과 맞지 않고 왼쪽 끝에 공백이 있기 때문에이 가지런하게 맞아야 에러가 발생하지 않는다.

<코드4> 두번째 명령줄 들여쓰지 않기

a = 3
if 1 < a < 5:
    print("명령1")
print("명령2")

코드 4의 경우는 위의 조건식이 맞든 맞지 않든 명령2는 항상 실행이 된다. 즉, 조건문의 같은 블록이 아니라는 뜻이다. 코드를 실행하면 조건이 참이라면 명령1과 명령2 둘다 실행 할 것이고 거짓이라면 명령2만 실행할 것이다.

2.2 else 문

단순 if 문과는 달리 if else 문은 조건의 진위에 따라 실행할 명령을 선택한다.

<기본형식>

if 조건 :

    명령1

else:

    명령2

학번 = 15
if 학번 < 16:
    print("화석입니다.")
else:
    print("대학생입니다.")

else 다음에도 콜론(" : ")이 있음을 유의한다. 또한 else는 홀로쓰일 수 없고 반드시 if와 함께 짝을 이루어 사용된다.

2.3 elif 문

if else 문을 한 단계 더 확장하면 elif문이 중간에 들어간다. 하나의 조건만 보는 것이 아니라 조건이 만족하지 않을 때 elif 문의 다른 세부 조건을 더 점검한다.

<기본형식>

if 조건1:

    명령1

elif 조건2:

    명령2

else:

    명령3

조건 1을 만족하면 명령 1을 실행하고 조건 1이 거짓일 경우 조건 2를 실행하여 조건 2가 참이면 명령 2를 실행한다. 두 조건 모두 거짓이면 명령 3을 실행한다.

학번 = 20
if 학번 < 16:
    print("화석입니다.")
elif 학번 < 20:
    print("대학생입니다.")
else:
    print("샌애긔입니다. ( ͡°͜ʖ ͡°) ")

 

elif는 조건을 반복적으로 점검하여 상황에 딱 맞는 명령을 선택한다. elif 구문을 늘려 가면 얼마든지 많은 조건을 점검할 수 있다. 다음 코드는 점수에 따라 학점을 알려준느 코드이다.

<코드 1> else if 문

score = 97

if score >= 95:
    print("A+")
else:
    if score >= 90:
        print("A")
    else:
        if score >= 85:
            print("B+")
        else:
            if score >= 80:
                print("B")
            else:
                print("F")

<코드 2> elif 문

score = 97

if score >= 95:
    print("A+")
elif score >= 90:
    print("A")
elif score >= 85:
    print("B+")
elif score >= 80:
    print("B")
else:
    print("F")

elif 문과 else if 문 을 비교해보면 elif 문이 더 가지런해 보이고 조건을 더 추가하기도 쉽다. else if 문의 경우는 새로운 조건을 점검할 때마다 오른쪽으로 계속 들여 써야 하니 보기에 좋지 않다. 보기 좋자 않은 코드는 읽기도 어렵고 이후 코드를 확장하거나 수정하기도 번거롭다. 가독성이 떨어지는 코드는 관리하기 어렵고 실수할 가능성도 높다.

파이썬은 다른 언어에 비해 선택문이 switch case 구문이 없는데 elif가 그 역할을 대신한다.

 

2.4 중첩문

if문의 조건에 걸리는 명령의 종류에는 제한이 없다. print문으로 뭔가를 출력할 수도 있고 다른 변수에 값을 대입할 수도 있고 함수를 호출할 수도 있다. if문도 하나의 명령이므로 if문 안에 들어갈 수 있다. 똑같은 종류의 명령끼리 겹치는 현상을 중첩(Nesting)이라고 하는데 다음과 같은 경우이다.

man = True
age = 26

if man:
    if age > 19:
        print("성인 남자입니다.")

논리 연산자로도 비슷한 코드를 작성할 수 있다.

man = True
age = 26

if man and age > 19:
    print("성인 남자입니다.")

if if 문은 두 조건을 순서대로 점검하는 것이고 if and문은 두 조건을 한꺼번에 점검한다는 차이가 있지만 효과는 완전히 같다. 동시에 점검할 때는 and 논리 연산자가 편하지만 한쪽 if문에 else절이 있거나 추가적인 다른 조건을 더 점검할 때는 if문을 중첩시켜야 한다.

<코드 1> if if 문

man = True
age = 26

if man:
    if age > 19:
        print("성인 남자입니다.")
    else:
        print("소년입니다.")

<코드 2> if and 문

man = True
age = 26

if man and age > 19:
    print("성인 남자입니다.")
if man and age <= 19:
    print("소년입니다.")

두 코드의 차이는 man == True 라는 조건을 한번만 점검하는지 중복으로 점검하는지 차이이다. 코드 2의 경우 man의 참, 거짓 진위여부를 중복으로 점검하여 실행 속도가 느리다. 불필요한 코드가 반복되면 구조가 나빠져 수정하기 번거로워진다. 똑같은 결과물을 출력하더라도 가장 효율적인 코드는 존재한다. 짧으면서 명쾌하고 읽기 쉬운 코드를 작성하는 연습을 많이 하자.

감사합니다.

 

반응형

+ Recent posts