Programming/Java & Python

[Python] 3장 제어구조

만나쓰 2020. 5. 8. 00:12

 

 

1. 단축 계산 (short-circuit evaluation)

 

 

수식은 이항 연산을 할 때 양쪽 피연산자의 계산 결과가 모두 있어야 계산 진행 가능하다.

그러나 논리식 계산은 왼쪽 피연산자의 계산 결과에 따라서 오른쪽 피연산자의 계산을 생략 가능하다.

즉, 왼쪽 피연산자의 계산 결과만으로 전체 계산 결과가 명백해지면, 결과에 영향을 받지 않는 오른쪽 피연산자 계산은 생략한다.

 

 - and 연산 : False and (    ) -> 오른쪽 피연산자 계산 생략, 결과 False

 - or 연산 : True or (      ) -> 오른쪽 피연산자 계산 생략, 결과 True

 

ex ) 무한 loop() 를 이용한 단축 계산 확인

 

- def loop() : loop()     #자기 자신을 호출하는 함수로, 원칙적으로는 프로그램이 영원히 종료하지 않으나, 호출 횟수에 제한을 두고 있어서 이를 초과하면 강제로 비정상 종료 됨

 

 

 

 

loop() 비정상 종료 실행 화면

 

 

 

 

 - 위의 비정상 종료를 이용한 논리 연산자 우선순위와 이해

 

False and loop()    #False

True and loop()     #RecursionError

True or loop()       #True

False or loop()      #RecursionError

 

 

 

실행 화면

 

 

 -> False and loop() 와 True or loop()의 경우 단축 계산이 되어서 loop()의 비정상 종료가 일어나지 않고 논리값이 출력 되었다.

 

 

 

 

 

 

 

 

 

 

 

2. 비교 논리식 (comparison operator)

 

 

비교연산 ('==',  '!=',  '<',  '>',  '<=',  '>=' )은 두 값을 비교하여 결과를 논리값으로 내준다.

 

 - : 크기 기준으로 비교

 - 논리값 : True = 1, False = 0으로 처리 (파이썬에서는 True > False 으로 해석)

 - 문자열 : ASCII 값의 크기 기준으로 사전 순 비교 (대문자 < 소문자 <한글)

 

 

논리값 비교연산

 

 

 

 

 

 

 

 

 

 

3. 조건문 : 흐름도 (flow chart) 이해하기

 

 

흐름도 (flow chart)

 

흐름도 그리기 연습

 

 

 

흐름도 그리기 연습

 

 

 

 

 

 

 

 

4. 반복문 : while 루프(loop)

 

while 루프 흐름도

 

while 루프<조건>이 참인 동안 <블록>을 반복 실행하도록 고안한 프로그램 구조이다.

만약 <조건>이 항상 True여서 무한 반복이 일어났을 때 프로그램으 종료하고 싶다면, "ctrl-c" 키를 입력하면 키보드 인터럽트 (keyboard interrupt) 오류가 발생하며 프로그램을 강제 종료 시킬 수 있다.

 

 

 

 

 

 

 

 

 

 

5. 입력 확인 : 문자열 메소드 isdigit()

 

isdigit()은 문자열이 숫자로만 구성되어 있는지 검사해주는 함수

<문자열>.isdigit()

 

 

 

ex) '365'.isdigit()   #True

     '365.0'.isdigit()   #False -> 숫자가 아닌 소수점 '.'이 포함

     '-17'.isdigit()     #False -> 숫자가아닌 음수 기호 '-' 포함

     'three'.isdigit()   #False -> 숫자가 없음

 

 

 

 

 

 

6. 입력확인 : 음수 포함 정수 확인 isinteger()

 

def isinteger(s):
    return s.isdiit() or \
           s != '' and s[0] == '-' and s[1:].isdigit()

 

 

 

 

 

 

 

 

< 실습문제 연습 >

 

 

 [실습 #3-5] 수강과목 평균 점수 계산 서비스

 

def average():
    print("평균 점수 계산 서비스")

    number = int(input("수강 과목 수 = "))
    total = count = 0
    
    while count < number:
        total += int(input("점수 = "))
        count += 1

    if count >= 1:
        avg = total / number
        print(number, "과목 평균 점수 = ", avg, "점")
    else:
        print(count, "과목 평균 점수 = 0.0점")


average()

 

 

 

출력 화면

 

 

 

 

 

 

 

 

 

 

[실습 #3-6] 수강과목 평균 점수 계산 서비스 (입력 확인)

 

def average():
    print("평균 점수 계산 서비스")

    number = input("수강과목 수(>0) = ")
    while not number.isdigit() or int(number) <= 0:
        number = input("수강과목 수(>0) 재입력 = ")
    total = 0
    count = 0

    

    while count < int(number):
        score = input("점수 (0~100) = ")
        while not score.isdigit() or int(score) <0 or int(score) > 100:
            score = input("점수 (0~100) 재입력  = ")
        total += int(score)
        count += 1

    print("과목 평균 점수 = ", total / int(number))

average()
        

 

 

실행 결과

 

 

 

 

 

 

 

 

 

[실습문제 #3-7] 고정소수점수 문자열 확인 함수 (음수 포함)

 

def isinteger(s):
    return s.isdigit() or \
           s != '' and s[0] == '-' and s[1:].isdigit()


def isfloat(s):
    (left, dot, right) = s.partition(".")

    return dot == '.' and \
           (isinteger(left) or right.isdigit()) or \
                            (left == '-' and ( right.isdigit() or isinteger(left)))
print(isfloat(".112"))
print(isfloat("-.112"))
print(isfloat("2.14"))
print(isfloat("-1.23"))
print(isfloat("5."))
print(isfloat("."))    #False
print(isfloat(".."))   #False
print(isfloat(".-3"))  #False

-> 불필요한 논리식도 있어서 아래 코드로 수정했다 !!

 

 

 

 

 

def isinteger(s):
    return s.isdigit() or \
           (s != '' and s[0] == '-' and s[1:].isdigit())

def isfloat(s):
    (left, dot, right) = s.partition('.')
    return isinteger(left) and (right.isdigit() or right =='') or \
           (left == '-' or left == '') and right.isdigit()
              

print(isfloat(".112"))
print(isfloat("-.112"))
print(isfloat("2.14"))
print(isfloat("-1.23"))
print(isfloat("5."))
print(isfloat("."))    #False
print(isfloat(".."))   #False
print(isfloat(".-3"))  #False

 

-> 경우의 수 정리하면 아래와 같이 나온다.