Unit 18. break, continue로 반복문 제어하기

break는 for과 while문법에서 제어 흐름을 벗어나기 위해 사용된다. 반복 루프를 완전히 중단시킨다. continue 는 제어흐름(반복)을 유지한 상태에서 코드의 실행만 건너뛰는 역활을 한다. 

 

18.1.1 while에서 break로 반복문 끝내기

무한루프에서 변수 i가 10이면 반복문을 끝내는 코드는 다음과 같다. 

i = 0

while True:
    print(i)
    i += 1
    if i == 10:
        break

반복문 안에서 break가 실행되면 반복문은 즉시 종료된다. 

 

18.1.2 for 에서 break로 반복문 끝내기

for문에서도 break의 동작은 동일하다. 

for i in range(10000):
    print(i)
    if i == 5:
        break

위의 코드는 range에 10000을 지정했으므로 0부터 9999까지 반복해야 하지만, i는 5일때 break를 하므로 0부터 5까지만 출력하고 반복문을 끝낸다. 

 

18.2.1 for에서 continue로 코드 실행 건너뛰기

다음은 0에서 10 까지 반복하며 홀수만 출력하는 코드이다.

for i in range(10):
    if i % 2 == 0:
        continue
    print(i)

0부터 9까지 반복하고, i가 짝수이면 continue를 실행한다. continue가 실행되면 아래 코드들은 실행하지 않고 반복문 처음으로 돌아오기 때문에 홀수일때만 i가 출력된다. 

 

18.2.2 while반복문에서 continue로 코드 실행 건너뛰기

while문에서도 continue의 동작은 동일하다. 

i = 0
while i < 10:
    i += 1
    if i % 2 == 0:
        continue
    print(i)

while문에서도 마찬가지로 continue문을 만나면 아래 코드를 건너뛰고 반복문 처음으로 돌아간다. 무한루프에서 continue를 사용하면 반복문은 끝나지 않는다. 

 

18.3 입력한 횟수대로 반복하기

cnt = int(input())

i = 0
while True:
    print(i)
    i += 1
    if i == cnt:
        break

값을 입력받아 cnt에 저장하고, 무한루프 하는 반복문을 만들어 숫자를 출력시킨 후, 입력한 수만큼 반복하면 반복문을 종료시킨다.

 

18.3.1 입력한 숫자까지 홀수 출력하기

cnt = int(input())

for i in range(cnt+1):
    if i % 2 == 0:
        continue
    print(i)

입력한 숫자까지 출력해야 했기 때문에 반복 횟수를 입력 숫자 + 1 로 지정하였다. 2 로 나눴을 때 나머지가 0 이면 짝수이기 때문에 continue를 실행하고 홀수이면 해당 숫자를 출력한다. 

 

18.4 퀴즈 

 

정답은 b,d이다. 

정답은 b이다. 3의 배수는 3으로 나눴을 때 0 이며, 3의 배수라고 후에 반복문이 끊기면 안되기 때문에 continue를 사용해야 한다.

정답은 c이다. 10 까지반 출력해야 하기 때문에 10이 출력되면 break로 반복문을 종료시켜야 한다.

 

18.5 연습문제: 3으로 끝나는 숫자만 출력하기

정답은 다음 코드와 같다.

if i % 10 != 3:
    continue
if i > 73:
    break

3으로 끝나는 숫자는 10으로 나눴을 때 나머지가 3이므로 나머지가 3이 아니면 continue로 반복문 처음으로 되돌아가고, 숫자가 73보다 커지면 break로 반복문을 종료해야 한다. 

 

18.6 심사문제: 두 수 사이의 숫자중 3으로 끝나지 않는 숫자 출력하기

정답은 다음 코드와 같다. 

    if i % 10 == 3:
        i += 1
        continue
    if i > stop:
        break

 정답이 while 조건식 바로 아래에 들어가 코드를 검사하므로 들여쓰기를 해줘야 한다. 3으로 끝나는 숫자가 나오면 continue를 수행하는데, 그러면 밑의 i+=1 이 진행되지 않기 때문에 continue 전에 i에 1을 추가 시켜야 한다. 

 

Unit 19. 계단식으로 별 출력하기

19.1 중첩 루프 사용하기 

콘솔은 2차원 평면이기 때문에 콘솔에서 별을 일정한 모양으로 출력하려면 반복문을 두 개 사용하는 것이 편리하다. 반복문 안에 반복문이 들어가는 형태를 중첩루프(다중루프)라고 한다. 그리고 반복문의 루프 인덱스 변수는 i, j, k와 같이 i 부터 알파벳 순서대로 주로 사용한다. 

for i in range(5):
    for j in range(5):
        print('j:', j, sep='', end='')
    print('i:', i, '\\n', sep='')

i를 사용하는 바깥쪽 루프는 세로 방향을 처리하고, j를 사용하는 안쪽 루프는 가로 방향을 처리한다. end=''는 줄바꿈을 하지 않기 위해서 지정한 것이다. 가로 방향 출력이 끝나면 i 값과 개행문자를 처리하여 세로 방향을 처리한다. 중첩루프는 2차원 평면을 다룰 수 있어서 이미지처리, 영상처리, 좌표 처리계 등에 주로 사용된다.

 

19.2 사각형으로 별 출력하기

5x5 형태의 사각형을 출력하는 코드는 다음과 같다.

for i in range(5):
    for j in range(5):
        print('*', end='')
    print()

가로, 세로 둘 다 5번씩 반복하여 안쪽 for 문에서 end=''으로 지정하여 줄바꿈을 하지 않고 가로로 별 5개를 출력하고,  바깥쪽 for문에서 print()로 줄바꿈을 한다.

반복문을 다음과 같이 수정하면 7x3 크기의 사각형을 출력할 수 있다.

for i in range(3):
    for j in range(7):
        print('*', end='')
    print()

 

19.3 계단식으로 별 출력하기 

계단식으로 별을 출력할 때는 별이 출력되지 않는 부분을 if 조건문으로 제어해야 한다. 

for i in range(5):
    for j in range(5):
        if(j <= i):
            print('*', end='')
    print()

별의 개수는 세로 줄의 위치(첫번째줄, 두번째줄, ...) 만큼 출력되기 때문에 세로 방향의 변수 만큼 출력되도록 조건을 추가하였다. 

i 가 0이라면 5번 반복되도 조건을 만족시키는 경우가 j가 0일때 이기 때문에 별이 하나만 출력된다.

 

19.3.1 대각선으로 별 출력하기

위 코드의 조건문을 다음과 같이 수정하면 대각선으로 별을 출력할 수 있다.

for i in range(5):
    for j in range(5):
        if(j == i):
            print('*', end='')
        else:
            print(' ', end='')
    print()

가로방향 변수와 세로방향 변수가 같을때만 *을 출력하고, 같지 않을 때는 공백을 출력하여 대각선으로 별이 출력되도록 하였다.

 

19.4 퀴즈 

정답은 c,e이다. i가 들어있는 반복문은 세로 방향을 처리하고, print()는 줄바꿈을 한다.

정답은 c이다.

 

19.5 연습문제: 역삼각형 모양으로 별 출력하기

정답은 다음 코드와 같다.

if j < i:
    print(' ')
else:
    print('*', end='')

위에가 넓고 아래로 갈수록 좁아지는 삼각형 형태이고, 공백이 먼저 나온 후 별이 나오기 때문에 j가 i 보다 작으면 공백을 출력하고 이 조건이 거짓이 되면 *을 출력한다. 

 

19.6 심사문제: 산 모양으로 별 출력하기

hei = int(input())

for i in range(hei):
    for j in reversed(range(hei)):
        if j > i:
            print(' ', end='')
        else:
            print('*', end='')
    for j in range(hei):
        if j < i:
            print('*', end='')
    print()

삼각형을 반으로 나눠서 반 먼저 출력하고 나머지 반을 붙이는 식으로 해야 한다. 

이 모양의 삼각형을 먼저 출력해야 하는데, 첫줄이 공백 4칸에 별 하나 나오므로 reversed(range(hei))로 뒤집으면 된다. 그리고 가로가 세로보다 작을 때 별을 출력하는 반복문을 더해서 두번째 줄 부터 별을 하나씩 추가해서 출력할 수 있다. 

Unit 14. else를 사용하여 두 방향으로 분기하기

분기는 '둘 이상으로 갈라지다' 라는 뜻으로 프로그램의 흐름을  둘 이상으로 나누는것을 의미한다. if에 else를 사용하면 조건식이 만족할 때와 만족하지 않을 때 각각 다른 코드를 실행할 수 있다. 

 

14.1 else 사용하기

else는 if문 뒤에 오며 단독적으로는 사용할 수  없다. else문도 if문처럼 :(클론)을 붙이고 다음줄에 실행할 코드가 오며 들여쓰기를 해야한다.

 

14.1.1 if와 else의 기본 형태와 실행 흐름 알아보기

else는 if의 조건식이 맞지 않을 때 실행한다. 조건식이 참이면 if의 코드를 실행하고 거짓이면 else의 코드를 실행한다. 

위와 같은 코드는 조건부 표현식을 이용하여 아래와 같은 형식으로 축약할 수 있다.

변수 = 값 if 조건문 else 값

 

14.2 else와 들여쓰기 

else는 if와 들여쓰기 규칙이 같다. 

1. else 본문은 반드시 들여쓰기를 해야 한다. 

2. else 코드가 여러줄일때는 반드시 들여쓰기 깊이가 같도록 만들어야 한다.

3. 들여쓰기를 하지 않은 코드는 else와 상관 없는 코드가 된다. 

 

14.3 if 조건문의 동작 방식 알아보기

다음과 같이 조건식이 아닌 값으로도 if와 else 코드를 동작시킬 수 있다. 

if True:
    print('true')
else: 
    print('false')

if False:
    print('true')
else:
    print('false')

if None:
    print('true')
else:
    print('false')

당연히 True는 if의 코드를 수행하고, False는 else의 코드를 수행한다. None은 False로 취급되서 else의 코드가 수행된다.

 

14.3.1 if조건문에 숫자 지정하기

숫자는 정수(2진수,16진수,10진수), 실수에 상관없이 0이면 거짓, 0이 아니면 참이다.

if 0:
    print('true')
else:
    print('false')

if 1:
    print('true')
else:
    print('false')

if 0x1f:
    print('true')
else:
    print('false')

if 0b1000:
    print('true')
else:
    print('false')

if 4.5:
    print('true')
else:
    print('false')

 

14.3.2 if 조건문에 문자열 지정하기 

문자열은 내용이 있으면 참, 없으면 거짓이다.

if 'hello':
    print('true')
else:
    print('false')

if '':
    print('true')
else:
    print('false')

위 예시중 거짓으로 취급하는 것들을 not으로 뒤집으면 참이된다.

파이썬에서 False로 취급하는 것들은 다음과 같다.

None, False, 0인 숫자들(0, 0.0, 0j), 빈 문자열, 리스트, 튜플,딕셔너리, 세트, 클래스 인스턴스의 __bool__(), __len__() 메서드가 0 또는 False를 반환할 때

위와 같은 경우 외에는 모두 True로 취급한다.

 

14.4 조건식을 여러개 저장하기

if 조건문은 논리 연산자를 사용하여 조건식을 여러개 지정할 수 있다.

x = 10
y = 20

if x == 10 and y == 20:
    print('true')
else: 
    print('false')

둘 중 하나만 만족했을때 참을 출력하려면 or 연산자를 이용하면 된다. 

 

14.4.1 중첩 if연산자와 논리 연산자

if x > 0:
    if x < 20:
        print('20보다 작은 양수입니다.')

위 코드는 x가 0보다 큰지 검사하고, 20보다 작은지 중첩 if 조건문을 이용하여 검사하는 코드이다. 다음과 같이 and 연산자를 사용하여 if 조건문을 하나로 줄일 수 있다.

if x > 0 and x < 20:
    print('20보다 작은 양수입니다.')

또한 0 < x < 20처럼 부등호를 연달아 사용하여 조건문을 더 간단하게 사용할 수도 있다.

if 0 < x < 20:
    print('20보다 작은 양수입니다.')

 

14.5 퀴즈

정답은 c 이다.

정답은 b, d이다. b는 들여쓰기를 하지 않았고, d는 클론을 붙이지 않았다.

정답은 True이다. 빈 문자열은 거짓이지만 not으로 인해 참이 되었다.

정답은 b,e이다.

정답은 a 이다.

 

14.6 연습문제: 합격 여부 판단하기

정답은 다음 코드와 같다.

if written_test >= 80 and coding_test == True:

 

14.7 심사문제: 합격 여부 판단하기

정답은 다음 코드와 같다.

kor, eng, math, sci = map(int, input().split())
avg = (kor+eng+math+sci) / 4

if 0 <= kor <= 100 and 0 <= eng <= 100 and 0 <= math <= 100 and 0 <= sci <= 100:
    if avg >= 80:
        print('합격')
    else:
        print('불합격')
else:
    print('잘못된 점수')

 

Unit 15. elif를 사용하여 여러 방향으로 분기하기

elif는 조건식을 여러개 지정하여 각 조건 마다 다른 코드를 실행할 수 있다. 

 

15.1 elif사용하기

elif는 else인 상태에서 조건식을 지정하는 것으로 else if의 뜻을 가진다. elif도 조건식 끝에 클론을 붙여야 하며 수행할 코드는 들여쓰기를 해야하고, elif단독으로 사용할 수는 없다. 

처음 if문에서 조건을 검사하고 참이면 코드를 수행하고 끝낸다. 거짓이면 if문의 코드를 수행하지 않고 elif의 조건식을 검사한다. elif의 조건식이 참이면 elif의 코드를 수행하고, 거짓이면 끝낸다.

 

15.1.1 if, elif, else를 모두 사용하기

elif와 else는 단독으로 사용할 수 없으며 항상 if와 함께 사용해야 한다. if, elif, else는 모두 함께 사용할 수 있다. 항상 if가 가장 먼저 나와야 하며, else가 가장 마지막에 나와야 한다. else가 elif보다 앞에 오면 잘못된 문법이다. 

 

15.1.2 음료수 자판기 만들기

다음은 입력한 번호에 따른 음료수 이름을 출력하는 코드이다. 실제 자판기는 버튼이 정해져 있지만 프로그램은 예상하지 못한 값이 입력될 수 있어서 이에 대한 처리를 해 줘야 한다.

button = int(input())

if button == 1:
    print('콜라')
elif button == 2:
    print('사이다')
elif button == 3:
    print('환타')
else:
    print('잘못된 값')

 

15.2 퀴즈

정답은 d,e 이다 elif는 단독으로 사용할 수 없고, else가 없어도 된다.

정답은 e이다. 

 

15.3 연습문제: if, elif, else모두 사용하기

정답은 다음 코드와 같다.

if 11 <= x <= 20:
    print('11~10')
elif 21 <= x <= 30:
    print('21~30')
else: 
    print('아무것도 해당하지 않음')

 

15.4 심사문제 : 교통카드 시스템 만들기

정답은 다음 코드와 같다.

if 7 <= age <= 12:
    balance -= 650
elif 13 <= age <= 18:
    balance -= 1050
elif 19 <= age:
    balance -= 1250

 

Unit 16. for 반복문으로 Hello, World! 100번 출력하기

Hello, World!를 100번 출력하려면 print()함수를 100번 사용하면 된다. 그러나 반복 횟수가 늘어날 수록 이 행위는 점점 더 비효율적인 일이 된다. 그래서 대부분의 프로그래밍 언어에서는 반복되는 작업을 간단하게 처리하기 위해 반복문이라는 기능을 제공한다. 

반복문은 반복 횟수, 반복 및 정지 조건을 자유자재로 제어할 수 있다.

 

16.1 for와 range 사용하기

for 반복문은 range에 반복할 횟수를 지정하고, 앞에 in과 변수를 입력한 후 끝에 클론을 붙인 뒤 다음줄에 반복할 코드를 넣는다. 반복할 코드도 반드시 들여쓰기를 해야 한다. 

range로 연속된 숫자를 만들어 하나하나 꺼내서 반복하는 방식이다. 

for 반복문은 반복 횟수가 정해져 있을 때 주로 사용한다. 

반복할 코드가 순환하는것을 루프(loop)라고 한다. 

 

16.1.1 반복문에서 변수의 변화 알아보기

위와 같이 range에서 꺼낸 숫자를 확인할 수 있다. range에서 꺼낸 숫자는 변수 i 에 저장되며 반복할 코드에서 사용할 수 있다. 변수 i는 반복문에서 주로 사용하는 변수인데 루프 인덱스라고 부르며 index의 머리글자 i를 따온 것이다.

 

16.2.1 시작하는 숫자와 끝나는 숫자 지정하기

range에 시작 숫자와 끝나는 숫자를 지정할 수 있다.

마지막에 출력되는 숫자는 끝나는 숫자보다 1 작다.

 

16.2.2 증가폭 사용하기

for문에서도 range의  증가폭을 지정하여 해당 값만큼 숫자를 증가시킬 수 있다.

 

16.2.3 숫자를 감소시키기

range(10,0)과 같은 방법으로는 range의 숫자 증가 기본값이 1이기 때문에 숫자를 감소시킬 수 없다. 다음과 같이 증가폭을 음수로 지정하여 숫자를 감소시켜야 한다.

증가폭을 음수로 지정하는 것 말고도 reversed를 사용하면 숫자의 순서를 반대로 뒤집을 수 있다. 

 

16.2.4 입력한 횟수대로 반복하기

다음 코드와 같이 입력한 값을 반복 횟수의 대상으로 지정할 수 도 있다. 

cnt = int(input())

for i in range(cnt):
    print('hello', i)

꼭 int 변수를 활용하여 입력받는 값을 정수형으로 변환해야 한다. 

 

16.3 시퀀스 객체로 반복하기 

for에 range 대신 시퀀스 객체를 넣어도 된다. 시퀀스 객체를 넣으면 객체의 요소들을 꺼내면서 반복한다.

reversed를 사용하여 시퀀스 객체도 뒤집을 수 있다.

Python이라는 문자열이 뒤집혀 nohtyP가 된것을 확인할 수 있다. 

 

16.4 퀴즈

정답은 a, d 이다.

정답은 c,d이다.

정답은 a,c 이다. a는 int로 자료형을 변환해야 하고, c는 클론을 붙여야 한다. 

정답은 d 이다. end 로 .을 설정했기 때문에 문자가 끝나면 . 이 온다. 

 

16.5 리스트의 요소에 10을 곱해서 출력하기

정답은 다음 코드와 같다.

for i in x:
    print(x*10, end = ' ')

출력값이 한 줄로 한 칸씩 띄워서 출력했기 때문에 end 에 공백을 설정해야 한다. 

 

16.6 심사문제 : 구구단 출력하기

정답은 다음 코드와 같다.

dan = int(input())

for i in range(1, 10):
    print(dan, '*', i, '=', dan*i)

 

Unit 17. while 반복문으로 Hello, world! 100번 출력하기

i = 0                     # 초기식
while i < 100:            # while 조건식
     print('Hello, world!')    # 반복할 코드
     i += 1                    # 변화식

while 반복문은 초기식에서 시작해서 조건식을 판별한다. 조건식이 참이면 아래 반복할 코드들을 실행하고 거짓이면 반복문을 끝낸다. 반복할 코드에는 변화식을 넣어 조건이 거짓이 되게 만든다. while문은 조건식 -> 반복할코드와 변화식 -> 조건식 으로 순환하는것이 루프이다.

 

17.1 while 반복문 사용하기

while문은 조건식을 지정하고 클론을 붙인뒤 다음줄부터 들여쓰기를 하여 반복할 코드와 변화식을 넣는다. 초기식은 보통 변수에 값을 저장하는 코드이다. 

반복할 코드에 변화식을 넣지 않으면 반복이 끝나지 않고 계속 진행되는 무한 루프 현상이 발생한다. 변화식을 통해 반복 할때마다 i의 값이 1 씩 증가하고, i가 10이되면 조건식이 거짓이 되어 반복문이 종료된다. 

 

17.1.1 초기값을 1부터 시작하기

i에 0 이 아닌 1을 넣으면 조건식을 < 이 아니라 <=로 바꿔줘야 한다. 

i 가 11이 되면 조건식이 거짓이 되어 반복문이 종료된다. 

 

17.1.2 초기값을 감소시키기

다음과 같이 초기값을 크게 주고, 변수를 감소시키면서 반복할 수 도 있다. 

조건식을 초기값보다 작게 하고, 변화식에서 i의 값을 감소시키면 된다. 

 

17.1.3 입력한 횟수대로 반복하기

cnt = int(input())
i = 0

while i < cnt:
    print('python', i)
    i += 1

반복할 횟수를 입력받아 입력받은 횟수만큼 반복하려면 위와 같은 코드를 이용하면 된다. 

 

17.2  반복 횟수가 정해지지 않은 경우

난수를 사용해서 숫자에 따라 반복을 끝내 볼 것이다. 난수는 반복되지 않는 규칙없이 무작위로 나열된 숫자이다. 난수를 생성하려면 random모듈을 사용해야 한다. 모듈은 다음 코드와 같이 import로 불러올 수 있다. 

import random

random 모듈의 random함수를 사용할 때 마다 계속 다른 실수가 생성된다. 

정수를 생성할땐 random모듈의 randint 함수를 사용한다. random.randint(1,6) 과 같은 방식으로 함수를 사용하면 1~6 사이의 숫자중 무작위의 한 숫자를 생성한다. 

import random

i = 0
while i != 3:
    i = random.randint(1,6)
    print(i)

반복해서 1부터 6까지중의 숫자를 생성하고 3이 나오면 반복을 종료하는 코드이다.

random.choice()를 이용하면 시퀀스 객체에서 무작위의 요소를 선택할 수 있다.

 

17.3 while 반복문으로 무한루프 만들기

while문의 조건식을 항상 참으로 하고 변화식을 만들지 않으면 무한 루프가 생성된다. 다음 코드의 경우 'hello'가 무한 반복하여 출력된다. 

while True:
    print('hello')

 

17.4 퀴즈 

정답은 b,c이다. while 반복문은 결과가 False면 반복을 끝내고, 반복 횟수가 정해져 있지 않아도 사용할 수 있다.

정답은 d 이다. 초기식이 10에서 시작하고, 19보다 작을때까지 2씩 증가하기 때문이다. 

정답은 c이다. 10번 출력하려면 i > 21 이 되어야 한다.

정답은 b, e 이다 조건식이 참인 것들이다.

 

17.5 연습문제 : 변수 두 개를 다르게 반복하기

정답은 다음 코드와 같다.

while i <= 32:
    print(i,j)
    i*=2
    i-=1

5번 반복하는 것이기 때문에 조건은 i에만 걸어도 된다. i는 2의 거듭제곱이고, j 는 1씩 감소한다.

 

17.6 심사문제: 변수 두 개를 다르게 반복하기

정답은 다음 코드와 같다. 잔액이 1350보다 적으면 마이너스 연산을 한 후 음수가 출력되기 때문에 잔액은 항상 1350 이상 이어야 한다.

money = int(input())

while money >= 1350:
    money -= 1350
    print(money)

 

Unit 11. 시퀀스 자료형 활용하기

파이썬에서 리스트, 튜플, range, 문자열처럼 값이 연속적으로 이어진 자료형을 시퀀스 자료형(sequence types)라고 한다. 이 4개의 자료형 외에도 bytes, bytearray가 있다. 

 

11.1 시퀀스 자료형의 공통 기능 사용하기

시퀀스 자료형은 공통된 동작과 기능을 제공한다. 시퀀스 자료형으로 만든 객체를 시퀀스 객체라고 하고, 객체에 들어있는 각 값들을 요소라고 한다. 

 

11.1.1 특정 값이 있는지 확인하기

시퀀스 객체에 in 연산자를 사용하면 특정 값이 있는지 확인할  수 있다.

in 앞에 not을 붙이면 특정 값이 없는지 확인한다.

이는 같은 시퀀스 객체인 튜플, 문자열, range에서도 모두 사용 가능하다.

 

11.1.2 시퀀스 객체 연결하기

리스트와 튜플은 + 연산자를 사용하여 연결할 수 있다. range는 + 연산자를 사용하여 연결할 수 없지만 리스트 또는 튜플로 만들어서 연결하면 된다. 문자열도 +연산자를 활용하여 연결해야 하며 문자열과 숫자를 연결하고 싶을 땐 숫자를 str()로 형변환 하여 연결해야 한다.

 

11.1.3 시퀀스 객체 반복하기

시퀀스 객체를 특정 횟수만큼 반복시키려면 * 연산자를 사용한다. range는 *으로 반복 불가능하며, 리스트나 튜플을 이용해야 한다.

 

11.2 시퀀스 객체의 요소 개수 구하기

시퀀스 객체는 요소가 여러개 들어있는데, 이 요소의 개수를 구할때는 len()함수를 이용한다.

 

11.2.1 리스트와 튜플의 요소 개수 구하기

 

11.2.2 range의 숫자 생성 개수 구하기

range에 len 함수를 사용하면 알 수 있다.

 

11.2.3 문자열의 길이 구하기

문자열의 길이는 공백까지 포함된다.

한글 문자열의 경우에도 똑같이 길이를 구할 수 있고, 한글 인코딩 방식인 utf-8로 저장한 실제 바이트 수도 다음과 같이 구할 수 있다.

한글 한 자를 저장하는데 필요한 바이트 수는 3임을 알 수 있다.

 

11.3 인덱스 사용하기

시퀀스 객체의 요소의 순서를 인덱스라고 한다. 인덱스는 항상 0번부터 시작한다. 시퀀스 객체에 [](대괄호)를 붙이고, [ ]에 인덱스를 지정하면 해당 인덱스에 접근할 수있다.

range도 인덱스로 접근할 수 있다.

문자열은 모든 값이 문자이므로 인덱스로 접근하면 해당 위치의 문자가 반환된다.

시퀀스 객체에 인덱스를 지정하지 않으면 객체 전체가 반환되고, [ ](대괄호)를 사용하는 것은 실제로는 __getitem__ 메서드를 호출하는 것이다. 따라서 __getitem__메서드를 사용해서도 인덱스 값에 해당하는 요소를 가져올 수 있다.

 

11.3.1 음수 인덱스 지정하기 

음수 인덱스는 -1부터 시작하며 뒤 요소부터 접근한다. -1은 뒤에서 첫번째 요소에 접근하는 것이다. 

 

11.3.2 인덱스의 범위를 벗어나면?

시퀀스 객체의 요소는 정해져있기 때문에 인덱스의 범위를 벗어나면 인덱스 범위가 벗어났다는 에러 메시지가 출력된다.

 

11.3.3 마지막 요소에 접근하기

시퀀스 객체의 인덱스를 -1로 지정하면 마지막 요소에 접근할 수 있다. 다른 방법은 len()함수를 이용할 수 있다. len()함수는 시퀀스 객체의 길이를 반환하는데, 인덱스는 0부터 시작하기 때문에 1을 빼줘야한다. len()함수를 이용하여 마지막 요소에 접근하는 방법은 다음과 같다.

 

11.3.4 요소에 값 할당하기

시퀀스 객체는 인덱스로 값을 접근한 뒤 = 로 값을 할당할 수 있다. 

튜플, range, 문자열은 읽기 전용 자료형이기 때문에 값을 할당하려 하면 에러가 발생한다.

 

11.3.5 del로 요소 삭제하기

del 뒤에 삭제할 요소를 넣으면 해당 요소를 삭제할 수 있다. 리스트는 가능하며 읽기 전용인 튜플, range, 문자열은 불가능하다.

 

11.4 슬라이스 사용하기

슬라이스는 시작 인덱스와 끝 인덱스를 정해서 시퀀스 객체에서 그 범위만큼 잘라내는 것이다. 끝인덱스를 포함하지 않기 때문에 끝 인덱스는 실제 가져오려는 인덱스보다 1 크게 설정해야 한다. "객체[시작인덱스:끝인덱스]"의 형태로 사용한다. 

아래와 같이 시작인덱스와 끝 인덱스를 같은 숫자로 지정하면 아무것도 가져오지 않는다. 

슬라이스를 했을 때 실제로 가져오는 요소는 시작 인덱스 ~ 끝 인덱스 - 1 이다.

 

11.4.1 리스트의 중간 부분 가져오기

슬라이스는 a[4:-1]과 같이 음수를 인덱스로도 지정할 수 있다. 끝 인덱스는 실제로 가져오려는 인덱스보다 1 크게 지정해야 하므로 실제로 가져오는 범위는 4 ~ -2 까지 이다. 

 

11.4.2 인덱스 증가폭 사용하기

인덱스 증가폭을 지정하면 범위 내에서 인덱스를 건너뛰며 요소를 가져올 수 있다. 인덱스 증가폭은 다음과 같이지정한다.

시퀀스객체[시작인덱스:끝인덱스:증가폭]

 

11.4.3 인덱스 생략하기

슬라이스를 사용할 때 시작 인덱스와 끝 인덱스를 생략할 수 도 있다.

시작 인덱스를 생략하면 처음부터 끝 인덱스-1 까지 가져온다. 

끝 인덱스를 생략하면 시작인덱스 부터 마지막 인덱스까지 가져온다.

시작인덱스와 끝 인덱스를 모두 생략하면 인덱스 전체를 가져온다. 

 

11.4.4 인덱스를 생략하면서 증가폭 사용하기 

시작인덱스나, 끝 인덱스를 생략해도 증가폭은 다음과 같이 동일하게 사용 가능하다.

시작인덱스, 끝인덱스, 증가폭을 모두 생략하면 객체 전체가 반환된다. 

증가폭을 음수로 지정하면 요소를 뒤에서 부터 가져올 수 있다. 인덱스가 감소하므로 끝 인덱스보다 시작 인덱스를 더 크게 지정해야 한다. 

시작 인덱스와 끝 인덱스를 생략하며 인덱스 증가폭을 -1 로 지정하면 리스트 전체에서 인덱스가 -1씩 감소하므로 리스트를 역순으로 반환할 수 있다.

위와 같은 방법들은 리스트 뿐 아니라 모든 시퀀스 객체에서 사용할 수 있다.

 

11.4.5 len 응용하기

다음과 같이 슬라이스의 인덱스에도 len()함수를 사용할 수 있다.

 

11.4.6 튜플, range, 문자열에 슬라이스 사용하기

튜플, range,문자열도 시퀀스 자료형이기 때문에 같은 방식으로 슬라이스를 사용할 수 있다. 

range는 연속된 숫자를 생성하기 때문에 슬라이스를 하면 지정된 범위의 숫자를 생성하는 새 객체를 만든다.

range는 생성 범위만 나타내기 때문에 모든 값들을 다 확인하려면 리스트에 넣으면 된다.

문자열은 문자가 하나의 요소이기 때문에 문자 단위로 자른다. 

slice() 객체를 사용하여 시퀀스 객체를 잘라낼 수도 있다. silce(시작 인덱스, 끝 인덱스, 증가폭) 처럼 사용할 수 있다.

만들어진 슬라이스 객체는 여러 시퀀스 객체에 사용 가능하다.

 

11.4.7 슬라이스에 요소 할당하기

시퀀스객체[시작인덱스:끝인덱스] = 시퀀스 객체 의 형태로 범위를 지정하여 값을 할당할 수 있다.

위와 같이 슬라이스를 활용하여 원래 있던 리스트의 값들을 변화시킬 수 있다. 

다음과 같이 요소의 개수를 정확히 맞추지 않아도 된다. 만약 할당할 요소의 개수가 적으면 그만큼 리스트의 요소의 개수도 줄어든다.

할당한 요소의 개수가 많다면 그만큼 리스트의 요소도 많아진다. 

인덱스의 증가폭을 이용하여 인덱스를 건너 뛰면서 할당하는 것도 가능하다. 인덱스의 증가폭을 지정했을 때는 슬라이스의 범위 요소 개수와 할당할 요소 개수가 정확히 일치해야 한다.

그리고 당연히 읽기 전용 자료형인 튜플, range, 문자열은 슬라이스를 지정해도 요소를 할당할 수 없다.

 

11.4.8 del로 슬라이스 삭제하기

del 시퀀스객체[시작 인덱스:끝 인덱스] 와 같이 삭제할 범위를 지정해주면 슬라이스 범위 만큼 삭제할 수 있다.

증가폭을 지정하면 인덱스를 건너뛰면서 삭제한다.

튜플, range, 문자열은 역시 삭제 불가능하다. 

 

11.5 퀴즈

정답은 a,d 이다. in 연산자는 객체 안에 특정 값이 있는지 확인하는 것이고, + 연산자로 두 시퀀스 객체를 연결하면 두 객체가 합쳐진다.

정답은 b, d이다. a[1]은 20이다. 또한 -1인덱스는 시퀀스 객체의 가장 마지막 요소를 의미한다. 

정답은 c,e 이다.

정답은 a,c이다. 슬라이스로 값을 할당하면 새 객체가 생성되는것이 아니라 기존 객체가 변경된다. 튜플은 슬라이스를 사용하여 일부 가져오는것은 가능하다. 값의 변경이 안되는 것이다. 

 

11.6 연습문제 : 최근 3년간 인구 출력하기

정답은 다음코드와 같다.

year[-3:]
population[-3:]

음수 인덱스를 사용하면 시퀀스 객체의 뒷 요소부터 접근한다. 최근 3년이므로 마지막 3개의 데이터가 필요하니 시작 인덱스를 -3으로 하였다.

 

11.7 연습문제 : 인덱스가 홀수인 요소 출력하기

정답은 다음 코드와 같다.

n[1:len(n):2]

홀수는 1부터 2씩 증가하기 때문에 증가폭을 2로 지정해주었다.

 

11.8 심사문제 : 리스트의 마지막 부분 삭제하기

del x[-5:]
print(tuple(x))

del을 이용하여 마지막 5개의 요소를 삭제하고 tuple() 로 튜플로 형변환 하여 출력하였다.

 

11.9 심사문제 : 문자열에서 인덱스가 홀수인 문자와 짝수인 문자 연결하기

정답은 다음 코드와 같다.

s1 = input()
s2 = input()
result = s1[1::2] + s2[::2]
print(result)

문자열 두개를 입력받고, 각 입력받은 문자열의 홀수 요소와 짝수 요소를 더한 값을 출력했다. 홀수와 짝수는 시작점만 다르고 2씩 증가하므로 증가폭을 2로 지정했다.

 

Unit 12. 딕셔너리 사용하기 

파이썬에서는 연관된 값을 묶어서 저장하는 용도로 딕셔너리라는 자료형이 있다. 게임 캐릭터의 능력치로 예를 들면 다음과 같은 코드는 캐릭터의 능력치에 대한 정보를 알기 쉽다.

lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}

 

12.1 딕셔너리 만들기

딕셔너리는 { }(중괄호) 안에 키 : 값 형식으로 저장한다. 각 키와 값은 콤마로 구분한다.

딕셔너리는 키를 먼저 지정하고 :(클론)을 붙여서 값을 지정한다. 하나의 키에는 하나의 값만 저장 가능하다. 

 

12.1.1 키 이름이 중복되면?

키 이름이 중복되면 가장 뒤에 있는 값만 사용한다. 또한 중복되는 키는 저장되지도 않는다.

코딩도장을 보면 3.6 버전 기준이라고 되어 있는데 3.9 버전도 아직 동일하다.

12.1.2 딕셔너리 키의 자료형

딕셔너리 키는 문자열, 정수, 실수, 불이 사용 가능하다. 값에는 모든 자료형이 사용 가능하다. 

 

12.1.3 빈 딕셔너리 만들기

빈 딕셔너리를 만들땐 { } 만 지정하거나 dict()를 사용하면 된다. 

 

12.1.4 dict로 딕셔너리 만들기

dict()에서는 키=값의 형식으로 딕셔너리를 만들 수 있다. 이때 키에는 작은따옴표나 큰따옴표를 사용하지 않아도 된다.

키는 딕셔너리가 만들어지면 문자열이 된다. 

zip 함수를 이용하여 키가 들어있는 리스트와 값이 들어있는 리스트를 dict()에 넣어줄 수도 있다. 튜플을 사용해도 된다.

리스트 안에 (키,값)형식의 튜플을 넣어도 된다.

dict()안에서 중괄호로 딕셔너리를 생성해도 된다.

 

12.2 딕셔너리 키에 접근하고 값 할당하기

딕셔너리[키]와 같은 형태로 딕셔너리의 키에 접근할 수 있다. 

 

12.2.1 딕셔너리 키에 값 할당하기

딕셔너리는 [ ]로 키에 접근한 후 값을 할당한다. 기존에 있는 키라면 값이 할당한 값으로 바뀌고, 없는 키였다면 새로 추가한다. 없는 키를 가져오려고 하면 에러가 발생한다.

 

12.2.2 딕셔너리에 키가 있는지 확인하기

딕셔너리에 키가 있는지 확인할 때는 in 연산자를 사용한다. 특정 키가 없는지 확인할 때는 not in 을 사용한다. 

 

12.2.3 딕셔너리의 키 개수 구하기

다음과 같이 len 함수를 사용하여 구할 수 있다.

 

12.3 퀴즈

정답은 b이다.

정답은 e이다.

정답은 c이다.

정답은 d 이다.

 

12.4 연습문제 : 딕셔너리에 게임 능력치 저장하기

정답은 다음 코드와 같다.

camille['health']
camille['movement_speed']

 

12.5 심사문제: 딕셔너리에 게임 능력치 저장하기

정답은 다음 코드와 같다.

key = input().split()
value = map(float, input().split())
char = dict(zip(key,value))
print(char)

숫자는 실수여야 하므로 map 함수를 이용해서 입력받는 값들을 실수로 형변환 해줘야 한다.

 

Unit 13. if 조건문으로 특정 조건일 때 코드 실행하기

조건문은 특정 조건일 때 코드를 실행하는 문법이다. 프로그램을 만들다 보면 다양한 상황을 처리해야할 상황이 생긴다. 조건문을 사용하면 조건에 따라 다른 코드를 실행할 수 있다.

 

13.1 if 조건문 사용하기

if 조건문은 if에 조건식을 지정하고 클론을 붙인다. 다음줄에는 실행할 코드가 오는데, 실행할 코드는 반드시 들여쓰기를 해야한다. 들여쓰기를 하지 않으면 에러가 발생한다. 

 

13.1.1 if 조건문의 기본 형태와 실행 흐름 알아보기

파이썬에서 if 조건문은 if 조건식: 의 형태로 사용되고 다음줄에는 들여쓰기를 한 후 조건이 만족할 때 실행할 코드를 작성한다. 이 들여쓰기한 코드들을 if본문 이라고 부른다. 조건식이 만족하면 본문 코드를 실행하고, 만족하지 않으면 실행하지 않는다. 보통 조건이 만족하면 참, 만족하지 않으면 거짓 이라고 부른다.

 

13.1.2 if 조건문을 사용할 때 주의할 점

자주 발생하는 실수

1. 값을 비교할때 같은지 확인할 때는 반드시 == 을 사용해야한다. = 은 할당을 하는 연산자이다.

2. 조건식 끝에 클론(:)을 붙였는지 확인해야 한다.

 

13.1.3 if조건문에서 코드를 생략하기

pass라는 키워드를 사용하면 코드를 생략할 수 있다. 그 위치에 주석을 달아 나중에 작성해야할 코드 위치 표시등의 용도로 사용할 수 있다.

 

13.2 if 조건문과 들여쓰기

if 조건문은 들여쓰기가 중요하다. :(클론)이 나오면 그 다음 문장은 무조건 들여쓰기를 해야 한다.

들여쓰기 칸 수는 같은 본문이면 모두 동일해야한다. 한 줄은 4칸 들여쓰고, 한 줄은 2칸 들여쓰는등의 방식은 unexpected indent 에러를  발생시킨다.

들여쓰기를 하지 않으면 if문 본문이 끝난것이다. if 문은 :(클론)이후 동일한 들여쓰기 한 줄까지 같은 본문으로 인지한다.

x = 10

if x == 10:
    print('x는 10입니다')
	print('if 본문 안')

print('if 본문 밖')

 

13.3 중첩 if문 사용하기

다음과 같이 if 문 안에 if문을 중첩하여 사용하는 것도 가능하다. if안에 있는 if문도 꼭 들여쓰기를 해야한다. 

x = 15

if x > 10:
    print('10보다 큽니다.')
    
    if x == 15:
        print('15 입니다.')
    if x == 20:
        print('20 입니다.')

 

13.4 사용자가 입력한 값에 if조건문 사용하기

input으로 입력받은 값을 조건문으로 비교할 수 도 있다.

inp = int(input())

if inp == 10:
    print('input 10')

if inp == 20:
    print('input 20')

13.5 퀴즈

정답은 c이다.

정답은 c, j 이다. c는 클론이 없고, j는 들여쓰기를 하지 않았다.

정답은 a 이다. 값이 같은지 비교할땐 == 연산자를 사용해야 한다.

 

13.6 연습문제 : if 조건문 사용하기

정답은 x != 10 이다.

 

13.7 심사문제 : 온라인 할인쿠폰 시스템 만들기

정답은 다음 코드와 같다.

pr = int(input())
cou = input()

if cou == 'Cash3000':
    pr -= 3000

if cou == 'Cash5000':
    pr -= 5000

print(pr)

 

Unit 7. 출력 방법 알아보기

7.1 값을 여러개 출력하기

print() 함수는 변수나 값 여러개를 콤마(,) 로 구분하여 넣을 수 있다.

print에 값을 콤마로 구분하여 넣으면 공백으로 구분되어 한 줄로 출력된다.

 

7.1.1 sep로 값 사이에 문자 넣기

sep는 구분자 라는 뜻의 separator에서 따온 것이다. 다음과 같이 print의 sep에 문자 또는 문자열을 지정해 주면 된다.

 

7.2 줄바꿈 활용하기

print 한번으로 값을 여러줄에 출력하는 것도 가능하다. sep에 개행문자인 \n을 넣으면 된다. 

값들 사이에 줄바꿈을 의미하는 \n이 들어가서 여러줄로 출력된 것이다. \n은 제어문자이기 때문에 화면에 출력되지는 않는다. \n도 문자이기 때문에 다음과 같이 print에 바로 넣어서 사용할 수 도 있다.

다른 제어문자는 한번 탭누른것 만큼 간격을 주는 \t가 있고, \문자 자체를 출력하려면 \\처럼 \을 두 번 써야 한다.

 

7.2.1 end 사용하기

print는 기본적으로 출력하는 값 뒤에 \n을 붙여 print를 여러번 사용하게 되면 자동으로 줄바꿈이 된다. print의 end에 기본적으로 \n이 지정된 형태이기 때문에 그런것인데 다음과 같이 end에 문자 또는 문자열을 지정하면 출력하는 값 끝에 나올 문자열을 지정해 줄 수 있다.

print(1, end='')    # 빈 문자열
print(2)
print('========================')

print(1920, end='x')    # 문자 x
print(1080)

 

7.3 퀴즈

정답은 d 이다.

정답은 c 이다.

정답은 b,d,e이다.

 

7.4 연습문제 : 날짜와 시간 출력하기

정답은 다음과 같다.

1. sep='/', end=' '

2. sep=':'

출력 결과가 한줄이고, 두 print사이에 공백이 있으므로 첫번째 print에는 end에 공백 한 칸이 들어가야 한다.

 

7.5 심사문제 : 날짜와 시간 출력하기



정답은 다음 코드와 같다.

print(year, month, day, sep='-', end='T')

 

Unit 8. 불과 비교, 논리 연산자 알아보기

8.1 불과 비교 연산자 사용하기

8.1.1 비교 연산자의 판단 결과

불(boolean)은 True, False로 표현하며 자료형의 일종이다. 

파이썬에서는 비교 연산자의 판단 결과로 True, False를 사용한다. 비교 결과가 맞으면 True, 틀리면 False이다. 

 

8.1.2 숫자가 같은지 다른지 비교하기

두 숫자가 같은지 비교할때는 ==(equal), 다른지 비교할 때는 !=(not equal)을 사용한다. 

 

8.1.3 문자열이 같은지 다른지 비교하기 

숫자와 동일하게 문자열도 ==, !=로 비교 가능하다. 문자열은 대소문자를 구분하여 같은 단어라도 대소문자가 다르면 다르다고 판단한다.

 

8.1.4 부등호 사용하기

부등호는 수학의 부등호와 동일하다. <(미만), >(초과), <=(이하), >=(이상)이다. 

비교 기준은 항상 첫번째 값이다. 첫번째 값보다 큰지, 작은지, 같은지, 다른지를 비교한다.

 

8.1.5 객체가 같은지 다른지 비교하기

객체가 같은지, 다른지 비교하는 것은 is와 is not 이다. ==과 !=는 값 자체를 비교하는 것이고, is와 is not는 객체를 비교하는 것에서 차이점이 있다.

1과 1.0은 값은 같지만 객체는 정수와 실수로 다르기 때문에 ==에서는 True가 나왔고, is 에서는 false가 나왔다. 또한 다음을 보면 is와 is not는 객체 뿐 아니라 값도 함께 일치해야 참을 반환한다는 것도 알 수 있다.

정수 객체와 실수 객체가 다른것은 id 함수를 사용하여 알  수 있다. id 함수는 객체의 고유한 값(메모리 주소)를 반환한다.

값 비교에는 is 를 사용하면 안된다. 아래와 같이 값이 한번 할당 됬던 상태에서 다른 값을 할당하면 메모리 주소가 달라질 수 있기 때문이다.

 

8.2 논리 연산자 사용하기

논리 연산자에는 and, or, not가 있다. 

and 연산자는 비교하는 두 값이 모두 True 여야 True 이다. 하나라도 False가 있으면 False가 나온다.

or 연산자는 두 값중 하나라도 True 이면 True 이다.

not 연산자는 논리값을 뒤집는다. 

위와 같이 여러개의 논리 연산자가 사용됬을 경우 연산 우선 순위는 not, and, or순서이다. 따라서 위 코드는 False and Fase or True 가 되고, False or True 가 되서 결과적으로 True가 나온다. 괄호로 묶어서 보면 다음과 같다.

 

8.2.1 논리연산자와 비교연산자를 함께 사용하기

연산 우선순위는 비교연산자가 논리연산자보다 높아서 비교 연산을 먼저 판단하고, 논리연산을 판단한다. 

 숫자에서 0은 False 이고, 0이 아닌값은 True이다. 문자열은 내용에 관계 없이 True 이다. 정수, 실수, 문자열 등을 불로 변환하려면 bool함수를 사용해야한다. 

 

8.2.2 단락평가

단락 평가는 첫 번째 값만으로 결과가 확실할 때 두 번째 값은 확인 하지않는 방법이다. 아래와 같은 경우 and 연산이기 때문에 두번째 값은 확인하지 않고 바로 False로 판단할 수 있다.

위와 같은 경우 파이썬에서 논리 연산자는 마지막으로  단락 평가를 실시한 값을 그대로 반환하기 때문이다. or 연산도 마찬가지로 마지막 단락 평가한 값이 반환된다. 

 

8.3 퀴즈 

정답은 c 이다.

정답은 d 이다. 

정답은 b,c이다.

정답은 d 이다.

 

8.4 연습문제 : 합격 여부 출력하기

정답은 아래 코드와 같다.

korean >= 50 and english >= 50 and mathematics >= 50 and science >= 50

and 연산의 경우 연산하는 모든 값이 True여야 True를 반환하기 때문에 한 과목이라도 50점 미만인 과목이 있으면 False를 반환한다.

 

8 .5 심사문제 : 합격 여부 출력하기

정답은 아래 코드와 같다.

kor, eng, math, sci = map(int, input().split())
print(kor >= 90 and eng > 80 and math > 85 and sci >= 80)

변수가 여러개 필요하기 때문에 map()과 split()으로 여러 변수에  값을 저장한 후 한 과목이라도 조건에 만족하지 않으면 False가 출력되야 하므로 and 논리 연산을 이용하였다.

 

Unit 9. 문자열 사용하기

문자열은 영문 뿐 아니라 한글또한 가능하다. 또한 문자열을 만드는 법은 작은따옴표(' ') 이외에도 큰따옴표(" "), 작은따옴표 세 개로 묶는것(''' '''), 큰따옴표 3개로 묶는것(""" """)이 있다.

 

9.1.1 여러 줄로 된 문자열 출력하기 

다음과 같이 작은따옴표 세 개(''' ''') 또는 큰 따옴표 세 개(""" """)를 사용하면 여러줄 문자열을 출력하거나 변수에 저장할 수 있다. 

위와 같이 여러줄의 문자열을 변수에 저장할 수 있고, 콘솔에서 확인하면 개행문자(\n)가 있고, print()함수를 사용하면 여러 줄로 출력 됨을 확인할 수 있다.

여러줄의 문자열을 출력할 때는 개행문자(\n)을 사용할 수도 있다.

 

9.1.2 문자열 안에 작은 따옴표나 큰 따옴표 포함하기

문자열을 사용하다 보면 작은 따옴표나 큰 따옴표를 사용해야 할 경우가 있다. 문자열 안에 작은 따옴표를 넣고 싶으면 큰 따옴표를 사용해 문자열을 만들고, 큰 따옴표를 넣고 싶다면 작은 따옴표를 사용해 문자열을 만들면 된다.

또한 따옴표 3개를 감싸서 문자열을 만들면 작은따옴표와 큰따옴표 모두 사용 가능하다. 

작은따옴표로 만든 문자열에 작은따옴표를 넣거나 큰따옴표로 만든 문자열에 큰따옴표를 넣으려면 역슬래쉬(\)를 사용하면 된다.

 

9.2 퀴즈

정답은 b,d이다.

정답은 a, c이다.

정답은 a,c,d이다. 

 

9.3 연습문제: 여러줄로 된 문자열 사용하기

'Python is a programming language that lets you work quickly \nand \nintegrate systems more effectively.'

코딩도장 예시 답안도 가능하고 위와 같은 답안도 가능하다. 문자열에 개행문자를 넣은 것이다. 

 

9.4 심사문제: 여러줄로 된 문자열 사용하기

정답은 다음 코드와 같다.

s = ''''Python' is a "programming language"
that lets you work quickly
and
integrate systems more effectively.'''

또한 개행문자와 \를 사용하여 한 줄로 표현하는 것도 가능하다. 

 

Unit 10. 리스트와 튜플 사용하기

리스트는 목록 이라는 뜻이며 값을 일렬로 늘여놓은 형태이다.

 

10.1 리스트 만들기

변수에 값을 저장할 때 [ ](대괄호)로 묶어주면 리스트가 되며, 각 값은 콤마(,)로 구분한다.

리스트에 저장된 각 값들은 요소(element)라고 부른다.

 

10.1.1 리스트에 여러가지 자료형 저장하기

리스트는 문자열, 정수, 실수, 불등 여러가지 자료형을 한 번에 저장할 수 있다.

 

10.1.2 빈 리스트 만들기

빈 리스트를 만들때는 []만 지정하거나, list()를 이용하여 만들 수 있다. 

보통 빈 리스트는 만들어두고 새 값을 추가하는데 쓰인다.

 

10.1.3 range를 사용하여 리스트 만들기

range()는 연속된 숫자를 생성한다. 10을 지정하면 0에서 9까지 생성된다. 

시작하는 숫자와 끝나는 숫자도 지정할 수 있다. range(5,10)과 같이 지정하면 5부터 9까지 생성된다. 끝 숫자는 포함하지 않는다.

증가폭도 지정할 수 있다. range(10,20,2)와 같이 지정하면 10에서 19까지 2씩 증가하게 된다. 증가폭에 음수를 지정하면 지정한 수만큼 값이 감소한다. range를 사용하여 리스트를 만드는 방법은 다음과 같다.

 

10.2 튜플 사용하기

튜플은 리스트처럼 요소를 일렬로 저장하지만, 저장된 요소를 변경, 추가, 삭제가 불가능하다.

변수에 값을 저장할 때 ( )괄호로 묶으면 튜플이 되며 각 요소들은 ,(콤마)로 구분한다. 괄호로 묶지 않고 콤마로 구분만 해도 튜플이 된다. 

리스트처럼 여러 자료형을 섞어서도 저장이 가능하다.

튜플은 요소가 절대 변경되지 않고, 유지되어야 할 때 사용한다. 튜플을 만든 상태에서 요소를 변경하려 하면 에러가 발생한다. 

 

10.2.1 요소가 한 개 들어있는 튜플 만들기

값 한개를 괄호로 묶으면 튜플이 아니라 그냥 값이 된다. 요소가 한개인 튜플을 만드려면 값을 괄호로 묶고 콤마를 붙이거나 괄호없이 콤마만 붙여도 된다.

 

10.2.2 range를 활용하여 튜플 만들기

리스트와 동일하게 tuple() 안에 range()를 넣으면 된다.

 

10.2.3 튜플을 리스트로 만들고, 리스트를 튜플로 만들기

tuple() 안에 리스트를 넣거나 list() 안에 튜플을 넣으면 새로운 튜플이나 리스트를 만들 수 있다.

 

문자열을 리스트나 튜플에 넣으면 문자 하나 하나가 리스트나 튜플의 요소로 들어가게 된다. 

리스트와 튜플을 사용하여 다음과 같이 변수 여러개를 한 번에 만들 수 있다.

리스트 변수와 튜플 변수를 사용하여 변수 여러개를 만들 수 있다. 이와 같이 리스트와 튜플의 요소를 변수 여러개에 할당하는 것을 리스트 언패킹, 튜플 언패킹 이라고 한다.

리스트 패킹 또는 튜플 패킹은 변수에 리스트나 튜플을 할당하는 것을 의미한다. 

 

10.3 퀴즈

답은 a,c,d이다.

답은 b,c,e이다.

답은 d이다.

 

10.4 연습문제: range로 리스트 만들기

답은 다음 코드와 같다.

a = list(range(5,-10,-2))

 

10.4 range로 튜플 만들기

답은 다음 코드와 같다.

inp = int(input())
tu = tuple(range(-10, 10, inp))
print(tu)

 

Unit 1. 소프트웨어 교육과 파이썬

1.1 문제 해결을 위한 과학적 사고

전화기, 자동차, 영화산업, 의료 기술, 인공지능 등의 발달로 소프트웨어의 사용 범위는 계속 넓어지고 있다. 그 결과 소프트웨어를 적절히 사용한 기업들은 크게 성장하였으며 소프트웨어 기술은 점점 중요해지고 있다. 

소프트웨어는 지금까지 불편했던 문제들을 해결하기 위해 개발되었다. 복잡한 문제들을 소프트웨어를 사용하여 어떻게 해결할 수 있을까 ?

 

1.1.1 복잡한 문제를 작은 문제로 분해

자율주행 시스템의 경우 사람의 눈과 귀 역활을 하는 카메라와 센서가 주변 상황을 인식하고, 팔과 다리 역활을 하는 각종 제어 장치를 통해 자동으로 움직이게 하고, 주변 상황 정보, GPS 정보, 지도 정보 등을 이용하여 하나의 자율주행 시스템을 만든다. 이처럼 복잡한 문제를 작은 문제로 나누어 하나씩 해결하게 되면 결국 큰 복잡한 문제도 해결할 수 있게 된다. 

 

1.1.2 날씨 데이터를 그래프로 그리는 문제

기상청 웹 사이트의 날씨 데이터(주요 도시의 기온과 습도)를 막대 그래프로 나타내기 위한 방법은 다음과 같다.

웹사이트는 보통 HTML로 글자와 그림을 표시하기 때문에 HTML을 분석하여 도시 이름, 기온, 습도 값이 저장된 위치를 찾아야 한다. 이후, 분석한 데이터를 토대로 기온, 습도 정보를 가져와서 정형화된 데이터로 만든다. 그리고 데이터중 주요 도시를 추출하여 그래프를 그리면 된다. 이렇게 작은 문제들을 해결하다 보면 큰 문제인 기상청 웹 사이트의 데이터로 그래프를 그린다는 큰 문제를 해결할 수 있다.

 

1.1.3 컴퓨테이셔널 씽킹

위 사례들처럼 일상생활의 문제점에서 해결책을 찾는 과학적 사고법을 컴퓨테이셔널 씽킹 이라고 하고, 이렇게 설계한 해결책을 컴퓨터 명령어로 작성하는것을 컴퓨터 프로그래밍이라고 한다. 작은 문제로 분해하고, 문제의 패턴을 발견하고, 어떤 데이터를 이용해야 하는지 결정하고, 문제를 일반화하고 모델링할 수 있는지를 찾는 과정이다.

 

1.2 알고리즘과 코딩

 

1.2.1 압축 알고리즘

사진은 보통 jpg 확장자로 저장되는데, 이것이 압축 알고리즘을 구현한 포멧이다. 사진을 그대로 저장하면 용량이 너무 크기 때문에 압축하여 저장하면 더 많은 양의 사진을 저장할 수 있다. 

"aaaabbbcccccddd" 라는 문자열이 있는데, 이 문자열은 같은 문자들이 반복된다는 패턴을 갖고있다. a는 4번, b는 3번, c는 5번, d는 3번 반복되고 있다. 이 문자는 이와 같이 표현할 수 있다. "a4b3c5d3" 이는 컴퓨터에서 쓰였던 압축 알고리즘이다. 이 방식은 Run-Length Encoding 이라고 하며, PCX그림파일 압축에 쓰였다.

 

1.2.2 문제의 패턴 발견과 해결 절차

문제에서 일정한 패턴을 발견하고, 패턴을 토대로 문제를 해결하는 절차를 알고리즘이라고 하며, 알고리즘을 코드로 표현하는 행위를 코딩 이라고 한다. 

 

1.3 파이썬

파이썬은 네덜란드의 귀도 반 로섬이 개발한 프로그래밍 언어이다. 

문법이 쉽고 간단하며, 다양한 패키지가 제공되어 생산성이 높고, 유지보수 비용이 적게들며, 오픈소스라 무료로 제공되고, 객체지향 언어라는 특징이 있다.

 

Unit 2. 파이썬 설치하기

사용중인 컴퓨터 (macOS) 에 Python 3.9.1 버전을 설치하였고, 개발환경은 vscode를 사용할 예정이다.

 

Unit 3. Hello, world! 출력해보기

3.1 IDLE에서 Hello, World! 출력해보기

print('Hello World')

위와 같은 방식으로 Hello World 라는 문자열을 출력할 수 있다. print( ) 안에 출력하고 싶은 문자열을 넣으면 된다.

위 사진은 파이썬 셸에서 코드를 실행한 것이다. 위처럼 코드를 한 줄 한 줄 실행하여 결과를 얻는 방식을 인터프리터 방식이라고 한다.

 

3.2 IDLE 에서 소스파일 실행하기

파이썬 개발환경을 vscode로 사용할 것이기 때문에 vscode에서 소스파일 실행하는 법으로 대신하겠다.

EXTENSIONS 에서 python과 Code Runner를 설치한다.

 

Code Runner 을 설치하면 우측 상단에 아래와 같은 재생 버튼이 생긴다.

.py 확장자를 가진 파이썬 파일에 코드를 적고 재생버튼을 누르면 소스 파일을 실행할 수 있다.

파이썬 코드를 저장한 .py 파일을 파이썬 스크립트라고 한다.

 

3.3 명령 프롬프트에서 Hello World 출력하기

3.3.1 명령 프롬프트에서 파이썬 사용하기

위 사진과 같이 명령 프롬프트에서 python3를 입력하여 파이썬 셸을 실행할 수 있다.

명령 프롬프트에서 파이썬 셸을 끝낼면 exit()를 입력하거나 윈도우의 경우 CTRL + Z, 리눅스와 macOS의 경우 CTRL + D를 누르면 셸을 종료할 수 있다.

 

3.3.2 명령 프롬프트에서 스크립트 파일 실행하기

위 사진과 같이 # python3 스크립트파일.py 의 형식으로 실행할 수 있다.

리눅스와 macOS의 경우 앞에 python3를 붙이지 않고 .py 파일을 그대로 실행할 수 있다.

위와 같이 파일을 저장하고 아래와 같이 명령어를 입력한다.

chmod +x 로 실행권한을 준 후에, 스크립트 파일을 실행하면 된다. 

파일 첫 줄의 #!/usr/bin/python3 는 셔뱅 이라고 한다. 셔뱅은 현재 파일을 실행해 줄 프로그램을 지정할 때 사용한다. 그래서 셔뱅에 파이썬 경로가 지정되어 있기 때문에 파이썬으로 해당 스크립트 파일을 실행한다.

 

3.4 소스코드 살펴보기

print('hello world')

이 코드의 실행 결과만 보더라도 print가 hello world를 출력한다는 것을 알 수 있다. ' '(작은따옴표)로 묶은 부분을 문자열 이라고 하고, print는 값을 화면에 출력해준다. 

print() 처럼 단어 뒤에 괄호가 붙은 것을 함수라 하며 정해진 일을 수행하는 단위이다. 함수 실행을 다른 말로 함수를 호출한다고도 한다.

 

3.5 심사 사이트 사용하기

코딩도장 사이트에서 회원가입을 하고, 강좌 등록을 하면 해당 강좌의 퀴즈를 풀 수 있다. 채점이 완료되면 답안과 문제의 해설이 출력된다.

 

3.6 퀴즈

위 문제의 답은 d 선지 이다.

위 문제의 답은 python3 dojang.py 이다.

 

3.7 연습문제: 문자열 출력하기

다음 소스 코드를 완성하여 'Hello, world!' 'Python Programming' 각 줄에 출력되게 만드시오.

문제의 답은 아래 코드와 같다.

print('Hello, world!')
print('Python Programing')

 

3.8 심사문제: 문자열 출력하기

'Hello, world!' 두 개를 각 줄에 출력하는 프로그램을 만드세요. 

문제의 답은 아래 코드와 같다.

print('Hello, world!')
print('Hello, world!')

개행문자를 사용하여 아래와 같이 한 줄의 코드로도 표현할 수 있다. \n은 줄을 바꾸는 개행문자이다.

print('Hello, world!\nHello, world!')

 

Unit 4. 기본 문법 알아보기

4.1 세미클론

많은 프로그래밍 언어들은 구문이 끝날때 세미클론(;)을 붙여야 하지만 파이썬은 붙이지 않아도 된다. 

그러나 아래와 같이 여러 구문을 한 줄에 표현할 때 세미클론을 활용할 수 있다.

print('hello'); print('world')

 

4.2 주석

주석은 파이썬 인터프리터가 처리하지 않아 프로그램의 실행에는 영향을 주지 않는다.

주석을 활용하여 코드에 대한 자세한 설명을 적거나, 특정 코드를 임시적으로 사용하지 않을 때 활용할 수 있다.

 

4.2.1 한줄주석

다음과 같이 한 줄 주석으로 코드에 대한 설명을 붙일 수 있다.

# hello world 출력
print('hello world)

다음과 같이 코드 앞에 주석을 의미하는 #을 붙이면 코드는 주석이 되어 프로그램에서 실행하지 않는다.

# print('hello world')

다음과 같이 코드 뒤에 주석을 쓰게 되면 주석 앞에 있는 코드만 실행하게 된다.

add = 1+2 # 더하기
print('hello world') # hello world 출력

 

4.2.2 블록 주석

블록 주석은 각 줄의 맨 앞마다 #을 넣어주고, 읽기 편하도록 # 뒤에 한 칸씩 띄어 써준다.

# 더하기
# add = 1+1
# 출력
# print(add)

여러 줄 주석을 사용할 때는 다음과 같은 방식으로도 사용할 수 있다.

'''
더하기
add = 1+1
출력
print(add)
'''

파이썬의 기본 인코딩 방식은 utf-8 이지만, utf-8이 아닐경우 한글이 스크립트 파일 안에 들어가면 실행 시 에러가 발생할 수 있다.

 

4.3 들여쓰기

들여쓰기는 코드를 읽기 쉽도록 일정한 간격을 띄워 작성하는 방법이며, 파이썬에서는 들여쓰기 자체가 문법이기 때문에 다음 if문 같은 경우 항상 들여쓰기를 해야한다.

if a==10:
	print('a는 10이다')

들여쓰기 방법은 공백 2칸, 4칸, 탭 등이 있다. 파이썬 코딩 스타일 가이드(PEP 8)에 따르면 공백 4칸으로 규정하고 있다.

 

4.4 코드블록

코드 블록은 특정한 동작을 위해 코드가 모여있는 상태를 의미한다. 들여쓰기를 기준으로 코드블록을 구분하며 같은 블록은 들여쓰기 칸 수가 같아야하며, 공백과 탭을 섞어서 사용하면 안된다.

if(a==10):
    print('a는 10입니다')
    print('여기까지 같은 블록')

 

Unit 5. 숫자 계산하기

파이썬에서 숫자의 자료형은 정수, 실수, 복소수로 구분한다. 프로그래밍에서는 주로 정수와 실수를 사용하며 복소수는 공학 분야에서 주로 쓰인다. 

 

5.1 정수 계산하기

5.1.1 사칙연산

파이썬 프롬프트에서 다음과 같이 사칙 연산이 가능하다.

나눗셈 부분을 보면 5/2 가 2.5 가 나왔다. 내가 사용한 파이썬 버전이 3이라서 그런것인데 파이썬2 에서는 2가 나온다. 파이썬2 에서는 정수 끼리의 나눗셈은 정수가 나오도록 되어 있고, 파이선 3는 정수끼리 나눗셈을 해도 실수가 나오도록 되어있기 때문이다. 실제로 4/2 를 확인해보면 2가 아닌 2.0이 나온다.

 

5.1.2 나눗셈 후 소수점 이하를 버리는 // 연산자

다음과 같이 // 연산자를 사용하게 되면 나눗셈의 결과가 정수로 나온다.

//은 버림 나눗셈(floor division) 이라고 부르며 나눗셈 결과에서 소숫점 이하는 버린다.

다음과 같이 실수에 // 연산자를 사용하면 결과는 실수가 나오며 항상 .0으로 끝난다.

 

5.1.3 나눗셈 후 나머지를 구하는 % 연산자

% 연산자는 나눗셈이 나누어 떨어지지 않을 때 나머지만을 구하는 연산자이다. 모듈로(modulo) 연산자라고 부른다.

5.1.4 거듭제곱을 구하는 ** 연산자

다음과 같이 ** 연산자를 활용하여 거듭제곱을 구할 수 있다.

 

5.1.5 값을 정수로 만들기

int()에 숫자, 계산식을 넣으면 값을 강제로 정수로 만들 수 있다. 정수로 된 문자열도 가능하다. 실수를 넣었을 경우 소숫점 이하는 버린다. int는 정수(integer)을 의미한다.

3번째 예시처럼 숫자를 ' '나 " " 가 감싸고 있으면 문자열이다. 

 

5.1.6 객체의 자료형 알아내기

type(값)

위와 같은 형태로 객체의 자료형을 알아낼 수 있다. 

결과값을 보면 <class 'int'> 라고 나와있는데 정수(int)클래스 라는 뜻이다. 파이썬에서는 숫자도 객체(Object)이며, 객체는 클래스(class)로 표현된다.

 

5.1.7 몫과 나머지를 함께 구하기

몫과 나머지를 함께 구하려면 divmod()를 사용할 수 있다.

결과값은 위와 같이 (몫, 나머지) 의 형태로 나온다. 파이썬에서 값을 괄호로 묶은 형태를 튜플(tuple) 이라고 한다. 튜플은 아래와 같이 변수 여러개에 저장 할 수 있다. 

 

5.1.8 2진수, 8진수, 16진수

정수는 10진수 외에도 2진수, 8진수, 16진수로 표현할 수 있다

  • 2진수 : 숫자 앞에 0b 를 붙이며 0과 1을 사용한다.
  • 8진수 : 숫자 앞에 0o를 붙이며 0~7까지 사용한다.
  • 16진수 : 숫자 앞에 0x를 붙이며 0~9, A ~ F 까지 사용한다.

 

5.2 실수 계산하기

소숫점이 붙은 수들을 실수라고 한다. 아래와 같이 실수끼리의 사칙연산도 가능하다.

결과값 중에 뺄셈 부분에서 이상한 값이 나왔다. 컴퓨터는 실수를 표현할 때 오차가 발생한다. 더 자세히 알고 싶어서 부록 47.7을 확인해 봤다.

파이썬은 실수를 부동 소수점 방식으로 표현한다고 한다. 고정 소수점 방식은 표현 범위가 매우 작다는 단점이 있어서 부동 소수점 방식을 사용하는 것 같다. 실수는 무한히 많지만, 컴퓨터에서는 숫자를 비트로 표현하기 때문에 실수는 유한개의 비트로 정확하게 표현할 수 없어 유한개의 비트를 이용해서 근삿값으로 표현한다고 한다. 

 

5.2.1 실수와 정수를 함께 계산하면?

위와 같이 실수와 정수를 함께 계산하면 값은 실수로 나온다. 실수와 정수를 함께 계산하면 표현 범위가 넓은 실수로 계산된다.

 

5.2.2 값을 실수로 만들기

float() 괄호 안에 숫자, 계산식, 실수 또는 정수로 된 문자열을 넣으면 값을 강제로 실수로 변환할 수 있다.

float는 부동소수점(floating point)에서 따온 것으로 실수의 자료형을 확인해보면 <class 'float'>가 나온다.

 

5.2.3 복소수 

파이썬에서는 실수부와 허수부로 이루어진 복소수도 사용할 수 있다. 허수부는 숫자 뒤에 j 를 붙인다.

두 실수를 복소수로 만들때는 complex()를 사용한다.

 

5.3 괄호 사용하기

파이썬은 수학과 동일하게 곱셈과 나눗셈의 연산 우선 순위가 높다. 덧셈, 뺄셈, 곱셈, 나눗셈이 함께 있는 연산식에서 덧셈과 뺄셈을 먼저 계산하고 싶다면 괄호( )를 사용해야 한다.

 

5.4 퀴즈

파이썬3 버전이기 때문에 정답은 d 이다.

정답은 c 이다.

정답은 17이다.

 

5.5 연습문제 : 아파트에서 소음이 가장 심한 층수 출력하기

답은 아래 코드와 같다.

print(int(0.2467*12+4.159))

위 코드를 실행하면 결과값이 7로 나온다. 문제 조건에서 소수점 이하 자리는 버린다고 했기 때문에 int()함수를 사용하였다.

 

5.6 심사문제 : 스킬 공격력 출력하기

답은 아래 코드와 같다.

print(102 * 0.6 + 225)

 

Unit 6. 변수와 입력 사용하기

6.1 변수 만들기

파이썬에서는 "변수이름 = 값" 의 형식으로 변수를 생성하고 값을 저장한다. 변수 이름은 다음의 규칙을 지키면 원하는대로 지을 수 있다.

  • 영문 문자와 숫자를 사용한다 .
  • 대소문자를 구분한다.
  • 문자부터 시작해야 하며, 숫자로는 시작하면 안된다.
  • _(밑줄문자)로 시작할 수 있다. 
  • 특수문자는 사용할 수 없다.
  • 파이썬의 키워드(if, for, while등)는 사용할 수 없다.

변수에는 숫자와 문자를 저장할 수 있다.

 

6.1.1 변수의 자료형 알아내기

type() 괄호에 변수를 넣으면 변수의 자료형을 알아낼 수 있다. 

str은 문자열(string)에서 따온 것이다. 변수의 자료형은 변수에 들어가는 값에 따라 달라짐을 알 수 있다.

 

6.1.2 변수 여러개를 한 번에 만들기

파이썬에서는 "변수이름1, 변수이름2, 변수이름3 = 값1, 값2, 값3"의 형태로 변수 여러개를 한 번에 만들 수 있다. 나열된 순서대로 값이 할당되며, 변수와 값의 개수가 맞지 않을 경우 에러가 발생한다.

변수 여러개를 만들 때 값이 모두 같아도 된다면 다음과 같이 만들 수 도 있다.

변수1, 변수2 = 변수2, 변수1 의 형식으로 두 변수의 값을 바꿀수도 있다.

 

6.1.3 변수 삭제하기

변수는 del 키워드를 이용하여 삭제할 수 있다.

x라는 변수가 삭제되었기 때문에 x 는 정의 되지 않았다는 에러 메시지를 확인할 수 있다.

 

6.1.4 빈 변수 만들기

파이썬에서는 None을 할당하여 빈 변수를 만들 수 있다. None은 아무것도 없는 상태를 표현하는 자료형이다.

자료형이라는 설명이 있었기에 type()으로 확인해보니 다음과 같은 결과가 나왔다. NoneType라는 자료형이였다.

 

6.2 변수로 계산하기

변수는 변수끼리 계산할 수 있고, 계산한 결과를 다른 변수에 저장할 수 있다.

 

6.2.1 산술 연산 후 할당 연산자 사용하기

위 결과를 보면 a 에 20을 더했지만 계산 결과를 유지하지는 않는다. 계산 결과를 유지하려면 아래와 같이 계산 결과를 다시 변수에 저장해야한다. 

아래와 같이 할당 연산자를 사용해도 동일한 결과가 나온다.

위와 같이 산술연산자 옆에 할당연산자(=)를 붙이면 연산 결과를 변수에 저장한다.  a+=10은 a = a + 10을 축약한 형태인 것이다. 덧셈 뿐 아니라 뺄셈, 나눗셈, 곱셈, 나머지, 몫 연산도 모두 사용 가능하다.

위와 같이 할당연산자는 만들지 않은 변수에 사용하면 에러를 발생한다. 

 

6.2.2 부호 붙이기

수학과 동일하게 양수에 - 부호를 붙이면 음수가 되고, 음수에 - 부호를 붙이면 양수가 되며, 음수에 +부호를 붙이면 변화가 없다.

 

6.3 입력값을 변수에 저장하기

6.3.1 input 함수 사용하기

매번 다른 값을 변수에 할당하거나 프로그램 사용자로 부터 값을 입력 받을 때는 input 함수를 사용할 수 있다. 

input()을 입력한 후 엔터를 누르면 다음줄로 넘아간다. 그 줄에 문자열을 입력하고 엔터를 누르면 입력한 문자열이 출력된다. 

input함수는 사용자가 입력한 값을 가져오는 함수이다.

 

6.3.2 input 함수의 결과를 변수에 할당하기

아래 코드와 같이 input함수의 결과를 변수에 할당할 수 있다.

변수 = input()

변수에 입력한 문자열이 저장되고, 변수를 출력하면 입력한 값이 나온다. 하지만 위와 같은 상태에서는 함수가 실행된 다음 아무 내용이 없어서 입력을 받는 상태인지, 출력이 없는 상태인지 확인하는데 어려움이 있다. 그래서 input() 괄호안에 안내문구처럼 문자열을 넣어줄 수 있다.

사용자에게 입력받는 값의 용도를 미리 알려줄때 사용된다. 이 문자열은 프롬프트(prompt)라고도 부른다.

 

6.3.3 두 숫자의 합 구하기

아래 코드는 두 숫자를 입력받은 후, 입력받은 두 숫자의 합을 구하는 코드이다.

n1 = input('숫자 입력 1 : ')
n2 = input('숫자 입력 2 : ')

print(n1 + n2)

코드를 실행해보면 아래와 같은 결과가 나온다.

아래와 같이 input()으로 입력받은 수의 자료형을 확인해보면 str(문자열) 인것을 확인할 수 있다. input() 함수로 입력받은 값들은 자료형이 문자열이다. 

 

6.3.4 입력값을 정수로 변환하기

10 + 20의 값이 30이 나오게 하려면 아래 코드와 같이 int()함수를 사용해서 문자열을 정수로 바꿔줘야 한다.

n1 = int(input('숫자 입력 1 : '))
n2 = int(input('숫자 입력 2 : '))

print(n1 + n2)

int() 함수는 정수로 된 문자열도 정수로 변환할 수 있기 때문에 입력받은 문자열 10 과 20이 정수 10과 20으로 변환된 것이다. 

 

6.4 입력값을 변수 두 개에 저장하기 

아래와 같이 split을 사용하여 한번에 값을 여러개 입력받고, 저장할 수 있다.

변수1, 변수2 = input().split()
변수1, 변수2 = input().split('기준문자열')
변수1, 변수2 = input('문자열').split()
변수1, 변수2 = input('문자열').split('기준문자열')
n1, n2 = input('문자열 두 개 입력 : ').split() # 입력받은 값을 공백을 기준으로 분리

print(n1)
print(n2)

input에 split을 사용하면 입력받은 값을 공백을 기준으로 분리하여 선언된 변수에 순서대로 저장한다.  

 

6.4.1 두 숫자의 합 구하기

n1, n2 = input('숫자 두 개 입력 : ').split()

print(n1+n2)

위 코드의 경우에도 input로 숫자를 입력 받았기 때문에 n1 과 n2 모두 문자열 자료형이 되어 결과값으로 1020이 출력된다. 

 

6.4.2 입력값을 정수로 변환하기

10 + 20의 결과값이 30이 나오려면 n1과 n2를 정수형으로 변환해줘야 한다.

n1, n2 = input('숫자 두 개 입력 : ').split()
n1 = int(n1)
n2 = int(n2)

print(n1+n2)

또한 아래 코드와 같이 print()함수 안에서 int형으로 변환하여 더해줘도 된다.

print(int(n1)+int(n2))

 

6.4.3 map을 사용하여 정수로 변환하기

map 을 활용하면 한 줄로 정수로 변환이 가능하다. map()에 int, input(), split()을 넣으면 split의 결과를 모두 int로 변환해준다. 

n1, n2 = map(int, input('숫자 두 개 입력 : ').split())

print(n1+n2)

6.4.4 입력받은 값을 콤마를 기준으로 분리하기

split()에 기준 문자열을 지정하면 공백이 아니라 다른 문자를 기준으로 분리하는 것이 가능하다. 아래와 같이 기준 문자열로 ,(쉼표)를 지정하면 쉼표를 기준으로 입력값이 분리된다. 

n1, n2 = map(int, input('숫자 두 개 입력 : ').split(','))

print(n1+n2)

 

6.5 퀴즈

정답은 c 이다.

정답은 a,c,e,g,h 이다.

정답은 b,c 이다.

정답은 d 이다.

 

6.6 연습문제 : 정수 3개을 입력받고, 합계 출력하기

정답은 다음 코드와 같다.

a, b, c = map(int, input().split())

 

6.7 심사문제 : 변수 만들기

정답은 다음 코드와 같다.

a = 50
b = 100
c = None

 

6.8 심사문제 : 평균 점수 구하기

정답은 다음 코드와 같다.

kor, eng, math, sci = map(int, input().split())
avg = (kor + eng + math + sci) / 4
print(int(avg))

문제 조건에 평균을 출력할 때 소수점 이하는 버리라고 했기 때문에 출력할 때 int()함수를 사용하였다.

문자 출력 함수

모니터에 하나의 문자를 출력할 때 일반적으로 사용하는 함수는 putchar() 과 fputc()가 있다.

#include <stdio.h>
int putchar(int c);
int fputc(int c, FILE * stream);
// 함수 호출 성공시 쓰여진 문자 정보, 실패시 EOF반환

putchar() 함수는 인자로 전달된 문자정보를 stdout 표준 출력 스트림으로 전송하여 모니터로 출력하는 함수이다. 

fputc()함수는 문자를 전송한다는 측면은 putchar()함수와 동일하지만 문자를 전송할 스트림을 지정할 수 있어 파일을 대상으로도 데이터를 저장할 수 있다. fputc() 함수의 두 번째 매개변수 stream은 문자를 출력할 스트림을 지정하는데 사용된다.

 

문자 입력 함수

키보드로 부터 하나의 문자을 입력 받을 때 일반적으로 사용하는 함수는 getchar() 과 fgetc()가 있다.

#include <stdio.h>
int getchar(void)
int fgetc(FILE * stream);
// 파일의 끝에 도달하거나 함수 호출 실패 시 EOF반환

getchar() 함수는 stdin으로 표현되는 표준 입력 스트림으로부터 하나의 문자를 입력받아 반환하는 함수이다. 

fgetc() 함수는 문자를 입력받을 스트림을 지정할 수 있다.

 

#include <stdio.h>

int main(void)
{
    int ch1, ch2;

    ch1 = getchar();    // 문자 입력
    ch2 = fgetc(stdin); // 엔터키 입력

    putchar(ch1);       // 문자 출력
    fputc(ch2, stdout); // 엔터키 출력
    return 0;
}

위 코드에서 문자를 int 형 변수로 선언한 이유는 getchar() 함수와 fgetc()함수의 반환형이 int 이기 때문이다. 

 

문자 입출력에서의 EOF

EOF는 End Of File의 약자로 파일의 끝을 표현하기위해 정의된 상수이다. 따라서 EOF가 반환되면 파일의 끝에 도달하여 더 이상 읽을 내용이 없음을 의미한다. 키보드를 대상으로 하느 fgetc() 와 getchar() 함수는 다음의 경우중 하나가 만족되었을 때 EOF를 반환한다.

  • 함수 호출 실패
  • Windows에서 CTRL + Z, Linux에서 CTRL + D 키가 입력되었을 경우
#include <stdio.h>

int main(void)
{
    int ch;

    while (1)
    {
        ch = getchar();
        if(ch == EOF)
            break;
        putchar(ch);
    }
    return 0;
}

위 코드를 실행하면 문자 입출력이 반복되고 EOF를 반환하는 CTRL + D 키를 입력하면 프로그램이 종료된다.

 

위 함수들의 반환형이 int 이고, int형 변수에 문자를 담는 이유는 EOF 는 -1로 정의된 상수인데, 반환형이 char 이라면 처리하는 컴파일러에 따라 char을 unsigned char로 처리하는 경우가 있어 -1을 양의 정수로 형변환 하는 경우가 발생 할 수 있다. 그래서 어떤 컴파일러라도 -1 을 유지하기 위해 반환형을 int 로 정의해둔것이고, 반환형이 int 이기 때문에 int 형 변수에 값을 저장해야 한다.

'Language > C, C++' 카테고리의 다른 글

[C++] 입출력  (0) 2021.08.21
[Project H4C] C언어 코딩도장(6)  (0) 2021.03.02
[C] 스트림  (0) 2021.01.15
[C] main 함수로의 인자 전달  (0) 2021.01.09
[C] void 포인터  (0) 2021.01.08

프로그램 상에서 키보드로 입력받아 모니터로 출력할 때 이를 연결해 주는 매개체를 스트림 이라고 한다.

스트림은 입력 장치에서 실행중인 프로그램으로 연결시켜 주는 입력 스트림과, 프로그램에서 출력장치로 연결시켜주는 출력 스트림이 있다.

 

콘솔 입출력을 위한 입력 스트림과 출력 스트림은 프로그램이 생성되면 자동으로 생성되고, 프로그램이 종료되면 자동으로 종료되기 때문에 직접 요구할 필요는 없지만, 파일과의 연결을 위한 스트림의 생성은 직접 요구해야 한다.

 

콘솔 입출력을 위한 스트림은 기본적으로 제공되는 표준 스트림(standard stream)이다. 표준 스트림은 다음과 같다.

  • stdin : 표준 입력 스트림 : 키보드 대상으로 입력
  • stdout : 표준 출력 스트림 : 모니터 대상으로 출력
  • stderr : 표준 에러 스트림 : 모니터 대상으로 출력

'Language > C, C++' 카테고리의 다른 글

[Project H4C] C언어 코딩도장(6)  (0) 2021.03.02
[C] 문자 단위 입출력 함수  (0) 2021.01.15
[C] main 함수로의 인자 전달  (0) 2021.01.09
[C] void 포인터  (0) 2021.01.08
[C] 함수 포인터  (0) 2021.01.08

main 함수는 다음과 같이 정의할 수도 있다. 

int main(int argc, char * argv[]) { ... }

프로그램 실행시 main함수로 인자를 전달할 수 있고, main 함수도 인자를 전달받을 수 있도록 한 것이다. 

#include <stdio.h>

int main(int argc, char * argv[])
{
    int i = 0;
    printf("전달된 문자열의 수 : %d\n", argc);
    
    for(i = 0; i < argc; i++)
        printf("%d 번째 문자열 : %s\n", i+1, argv[i]);
    
    return 0;
}
/* 
input : 
# ./argcargv I love you

output:
전달된 문자열의 수 : 4
1 번째 문자열 : ./argcargv
2 번째 문자열 : I
3 번째 문자열 : love
4 번째 문자열 : you
*/

위 코드와 같이 main함수를 구성하면 프로그램을 실행할 때 인자를 전달 할 수 있다. argv는 char형 더블 포인터 변수이다. 

인자 전달 과정에서 공백은 문자열을 나누는 기준이 된다. 인자로 전달된 문자열들이 배열에 묶여 main 함수의 두 번째 인자로 전달이되고, 첫 번째 인자는 문자열의 수가 전달이 된다.

#include <stdio.h>

int main(int argc, char * argv[])
{
    int i = 0;
    printf("전달된 문자열의 수 : %d\n", argc);

    while(argv[i] != NULL)
    {
        printf("%d 번째 문자열 : %s\n", i+1, argv[i]);
        i++;
    }

    return 0;
}
/* 
input : 
# ./argvNull "I Love You"

output : 
전달된 문자열의 수 : 2
1 번째 문자열 : ./argvNull
2 번째 문자열 : I Love You
*/

위 코드를 통해 전달받은 배열의 마지막에 NULL이 삽입됨을 확인할 수 있다. 또한 큰 따옴표로 묶으면 공백을 포함하는 문자열을 인자로 전달할 수 있다.

'Language > C, C++' 카테고리의 다른 글

[C] 문자 단위 입출력 함수  (0) 2021.01.15
[C] 스트림  (0) 2021.01.15
[C] void 포인터  (0) 2021.01.08
[C] 함수 포인터  (0) 2021.01.08
[C] 2차원 배열의 포인터  (0) 2020.12.30

다음과 같이 선언되는 포인터를 void형 포인터라 한다.

void * ptr;

void형 포인터 변수는 함수의 주소를 포함한 어떠한 변수의 주소값이든 담을 수 있다.

#include <stdio.h>

void SimpleFunc(void)
{
    printf("Simple function\n");
}

int main(void)
{
    int num = 20;
    void *ptr;
    
    ptr = &num;
    printf("%p\n", ptr);

    ptr = SimpleFunc;
    printf("%p\n", ptr);
    return 0;
}
/* output : 
0x7ffee8607858
0x1075fbf00
*/

위 코드처럼 어떤 형태의 변수의 주소값이든 저장할 수 있다. 그러나 void형 포인터 변수는 형(type)에 대한 정보가 없기 때문에 포인터 연산, 값의 변경, 참조가 불가능하다.

'Language > C, C++' 카테고리의 다른 글

[C] 스트림  (0) 2021.01.15
[C] main 함수로의 인자 전달  (0) 2021.01.09
[C] 함수 포인터  (0) 2021.01.08
[C] 2차원 배열의 포인터  (0) 2020.12.30
[C] 삼중 포인터  (0) 2020.12.28

프로그램 내에 정의된 다양한 함수들도 바이너리 형태로 메모리에 저장되어 호출시 실행된다. 이런 함수들의 주소도 포인터 변수에 저장할 수 있다. 배열의 이름이 배열의 시작 주소를 가리키듯, 함수의 이름도 함수가 저장된 메모리 주솟값을 나타낸다.

int SimpleFunc(int num) { ... }

위 함수의 반환형은 int 이고, 매개변수는 int num 이다. 함수의 이름 SimpleFunc는 함수의 주솟값을 의미하는 상수형태의 함수 포인터 이다. 이 함수의 포인터 형은 반환형이 int이고, 매개변수로 int형 변수가 하나 선언된 포인터형 이다.

 

포인터 변수의 선언은 다음과 같다.

int (*fptr) (int)

반환형이 int이며, 매개변수 선언이 int 하나인 함수 포인터 변수이다. 

다음과 같은 함수의 경우 아래와 같이 함수 포인터 변수를 선언한다.

int Func(int num1, int num2) { ... }
int (*fptr) (int, int);

그리고 다음과 같은 방식으로 Func 함수를 호출할 수 있다.

fptr(2,5);

다음 코드는 함수 포인터 변수를 활용한 예시이다.

#include <stdio.h>

void SimpleAdder(int n1, int n2)
{
    printf("%d + %d = %d\n", n1, n2, n1+n2);
}

void ShowString(char * str)
{
    printf("%s\n", str);
}

int main(void)
{
    char *str = "Function Pointer";
    int num1 = 10, num2 = 20;

    void(*fptr1)(int, int) = SimpleAdder;
    void(*fptr2)(char *) = ShowString;
    fptr1(num1, num2);
    fptr2(str);
    return 0;
}
/* output : 
10 + 20 = 30
Function Pointer
*/

 

#include <stdio.h>

int WhoIsFirst(int age1, int age2, int (*cmp)(int n1, int n2))
{
    return cmp(age1, age2);
}

int OlderFirst(int age1, int age2)
{
    if(age1 > age2)
        return age1;
    else if(age2 > age1)
        return age2;
    else
        return 0;
}

int YoungerFirst(int age1, int age2)
{
    if(age1<age2)
        return age1;
    else if(age2<age1)
        return age2;
    else
        return 0;
}

int main(void)
{
    int age1 = 20, age2 = 30;
    int first;

    printf("입장순서 1 \n");
    first = WhoIsFirst(age1, age2, OlderFirst);
    printf("%d세와 %d세중 %d세가 먼저 입장\n", age1, age2, first);

    printf("입장순서 2 \n");
    first = WhoIsFirst(age1, age2, YoungerFirst);
    printf("%d세와 %d세중 %d세가 먼저 입장\n", age1, age2, first);
    return 0;
}
/* output : 
입장순서 1 
20세와 30세중 30세가 먼저 입장
입장순서 2 
20세와 30세중 20세가 먼저 입장
*/

위 코드와 같이 함수의  매개변수로 함수 포인터 변수를 넣을 수 도 있다.

 

'Language > C, C++' 카테고리의 다른 글

[C] main 함수로의 인자 전달  (0) 2021.01.09
[C] void 포인터  (0) 2021.01.08
[C] 2차원 배열의 포인터  (0) 2020.12.30
[C] 삼중 포인터  (0) 2020.12.28
[C] 더블 포인터  (0) 2020.12.28

+ Recent posts