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)

 

+ Recent posts