Unit 20. FizzBuzz문제

20.1 1 부터 100 까지 숫자 출력하기

for 반복문을 이용하여 다음과 같이 1부터 100까지 반복해주면 된다.

for i in range(1,101):
    print(i)

반복 되는 마지막 숫자는 끝나는 숫자보다 1 작으므로 101 을 넣어주면 된다.

 

20.2 3의 배수일 때와 5의 배수일 때 처리하기

다음 코드는 3의 배수일 때는 Fizz를, 5의 배수일 때는 Buzz를, 나머지 숫자는 숫자를 출력하는 코드이다. 

for i in range(1,101):
    if i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)

3의 배수는 i를 3으로 나눴을때 나머지가 0 이며 5의 배수는 i를 5로 나눴을 때 나머지가 0이다. 이 두 경우에 해당하지 않으면 숫자를 출력한다. 

 

20.3 3과 5의 공배수 처리하기

위의 코드는 공배수일 경우 3의 배수인 Fizz가 출력된다. 3과 5의 공배수를 처리 하려면  다음 코드와 같다. 

for i in range(1,101):
    if i % 3 == 0 and i % 5 == 0:
        print('FizzBuzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)

and 연산으로 3의 배수와 5의 배수 동시에 만족시키는 경우를 처리해 줘야 한다. if의 조건식이 만족하면 뒤의 elif의 조건식은 검사하지 않기 때문에 공배수를 처리하는 조건식은 반드시 if에 들어가야 함을 주의해야 한다. 

 

20.4 논리 연산자를 사용하지 않고 3과 5의 공배수 처리하기 

3과 5의 최소공배수는 15이기 때문에 15의 배수도 3과 5의 공배수이다. 그래서 다음과 같이 코드를 수정하면 된다. 

for i in range(1,101):
    if i % 15 == 0:
        print('FizzBuzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)

결과 값은 위와 같다. 15라는 숫자는 3과 5의 최소공배수라는 의미를 담고 있는데, 이를 명확하게 들어내기 위해 20.3의 방식으로 하는것이 더 좋은 방법이긴 하다.

 

20.5 코드 단축하기

다음과 같이 코드를 단축하여 문제를 해결할 수도 있다. 

for i in range(1, 101):
    print('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i)

결과값은 위의 값들과 같다. 

위 예시와 같이 문자열에 False를 곱하면 아무것도 출력되지 않고, 문자열에 True를 곱하면 문자열이 그대로 출력된다. 또한 or 연산은 둘다 참이면 앞의 것을 출력하기 때문에 3의 배수 이면 Fizz를, 5의 배수이면 Buzz를, 3과 5의 공배수면 FizzBuzz를, 모두 아니면 숫자를 출력하게 된다.

 

20.6 퀴즈

정답은 d이다. 

정답은 d,e 이다. 

 

20.7 연습문제: 2와 11의 배수, 공배수 처리하기

정답은 다음과 닽다.

1. i % 2 == 0 and i % 11 == 0

2. i % 2 == 0

3. i % 11 == 0

 

20.8 심사문제: 5와 7의 배수, 공배수 처리하기

정답은 다음 코드와 같다.

start, stop = map(int, input().split())

for i in range(start, stop+1):
    if i % 5 == 0 and i % 7 == 0:
        print('FizzBuzz')
    elif i % 5 == 0:
        print('Fizz')
    elif i % 7 == 0:
        print('Buzz')
    else: 
        print(i)

 

Unit 21. 터틀 그래픽스로 그림 그리기

터틀은 거북이가 기어가는 모양대로 그림을 그리는 모듈이다.

 

21.1 사각형 그리기

터틀은 다음과 같이 터미널에서 실행할 수 있다.

t.shape()는 거북이의 모양을 설정하며, 아무 값도 설정하지 않으면 화살표가 나온다. 

위와 같은 명령어를 입력하면 거북이를 100픽셀 만큼 앞으로 이동시킨다. 

거북이가 오른쪽으로 이동했고, 검은 선이 그려진 것을 확인할 수  있다.

다음 코드를 입력하면 거북이의 방향을 오른쪽으로 90도 회전시킨다. 각도에 다른 숫자를 지정하면 해당 각도 만큼 방향이 바뀐다.

이렇게 앞으로 100픽셀 가고, 거북이의 방향을 바꾸는 행위를 계속 하며 거북이를 조종하여 사각형을 그릴 수 있다.

앞으로 이동, 오른쪽으로 회전 외에도 뒤로이동, 왼쪽으로 회전 등도 가능하며 다음과 같이 코드를 줄여 쓸 수도 있다.

  • 앞으로 이동: forward, fd
  • 뒤로 이동: backward, bk, back
  • 왼쪽으로 회전: left, lt
  • 오른쪽으로 회전: right, rt

위에 그린 사각형을 fd와 rt를 이용하여 작성한 코드는 다음과 같다.

import turtle as t
 
t.shape('turtle')
 
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)

 

스크립트 파일을 실행시 터틀 창이 바로 사라지는 경우가 생긴다면 다음 코드를 스크립트 파일 마지막 부분에 추가하면 된다.

t.mainloop()

 

21.2 다각형 그리기

다음과 같이 반복문을 사용하여 사각형을 그릴 수도 있다.

import turtle as t

t.shape('turtle')

for i in range(4):
    t.forward(100)
    t.right(90)

t.mainloop()

결과물이 나오자마자 바로 사라졌기 때문에 mainloop를 추가하였다. 

 

21.1.1 오각형 그리기

다각형에서 외각의 합은 항상 360도이기 때문에 하나의 외각은 360을 5로 나누면 된다. 소스코드는 다음과 같다.

import turtle as t

t.shape('turtle')

for i in range(5):
    t.forward(100)
    t.right(360 / 5)

t.mainloop()

오각형이기 때문에 5번 반복 하였다. 

 

21.1.2 다각형 그리기

다음과 같이 사용자로부터 입력을 받아 해당 숫자에 해당하는 다각형을 그릴 수 있다.

import turtle as t

n = int(input())
t.shape('turtle')

for i in range(n):
    t.forward(100)
    t.right(360 / n)

t.mainloop()

위는 6을 입력하여 육각형을 그린 예시이다. 

 

21.2.3 다각형에 색칠하기

다음은 빨간색으로 색칠된 육각형을 그리는 코드이다. 

import turtle as t

t.shape('turtle')
t.color('red')
t.begin_fill()

for i in range(6):
    t.forward(100)
    t.right(360 / 6)
t.end_fill()

t.mainloop()

t.color()로 펜의 색을 지정하고, 도형을 그리기 전에 t.begin_fill()로 색칠할 준비를 한다. 도형이 그려진 후에는 t.end_fill()을 이용하여 도형 전체에 펜 색이 칠해진다.

 

21.3 복잡한 도형 그리기 

터틀에서 원을 그릴 때는 circle() 함수를 사용하면 된다. 괄호 안에는 반지름의 길이가 들어간다.

 

21.3.1 원을 반복해서 그리기

다음은 for을 사용해서 원을 반복해서 그리는 코드이다. 

import turtle as t

n = 60
t.shape('turtle')
t.speed('fastest')
for i in range(n):
    t.circle(120)
    t.right(360 / n)
t.mainloop()

speed()는 거북이의 속도를 설정할 수 있다. 속도는 다음과 같이 문자열이나 숫자로 설정할 수 있다. 숫자는 0.5에서 10 까지 설정할 수 있다.

  • 'fastest' : 0
  • 'fast' : 10
  • 'normal' : 6
  • 'slow' : 3
  • 'slowest' : 1

 

21.3.2 선으로 복잡한 무늬 그리기

import turtle as t

t.shape('turtle')
t.speed('fastest')
for i in range(300):
    t.forward(i)
    t.right(91)
t.mainloop()

반복문으로 선의 길이가 0 부터 299까지 점점 길어지게 반복되고, 91도씩 회전하면서 미세하게 틀어진 사각형이 그려지면서 바깥쪽으로 퍼져나간다. 

터틀의 모양으로 설정할 수 있는 것은  'arrow', 'turtle', 'circle', 'square', 'triangle', 'classic' 등이 있다. 

 

21.4 퀴즈 

정답은 d 이다. lt는 왼쪽으로 회전하는 것이다.

정답은 d이다.

 

21.5 연습문제: 오각별 그리기

    t.forward(100)
    t.right(72*2)
    t.forward(100)
    t.left(72)

문제 설명을 따라서 코드를 작성하면 문제를 해결할 수 있다.

 

21.6 심사문제: 별 그리기

정답은 다음 코드와 같다. 

for i in range(n):
    t.fd(line)
    t.rt((360/n)*2)
    t.fd(line)
    t.lt(360/n)

 

Unit 22. 리스트와 튜플 응용하기

22.1 리스트 조작하기

22.1.1 리스트에 요소 추가하기

리스트에 요소를 추가하는 메서드는 다음 3가지가 있다.

  • append: 요소 하나를 추가
  • extend: 리스트를 연결하여 확장
  • insert: 특정 인덱스에 요소 추가

22.1.2 리스트에 요소 추가하기 

append(요소)는 리스트에 요소 하나를 추가한다. 

위 코드들을 보면 리스트에 50이라는 요소가 추가된 것을 확인할 수 있다. 또한 다음과 같이 빈 리스트에도 값을 추가할 수 있다.

 

22.1.3 리스트 안에 리스트 추가하기

append()안에 리스트를 넣으면 리스트 안에 리스트가 들어가는 중첩리스트가 된다. append()로 추가된 요소들의 길이는 항상 1이다.

 

22.1.4 리스트 확장하기 

리스트에 요소를 여러 개 추가할 때는 extend()를 사용한다. extend() 안에는 리스트가 들어가며 그 리스트의 요소들이 추가된다.

extend를 사용하면 리스트의 길이는 extend에 전달된 리스트의 길이만큼 증가한다. extend에 전달된 리스트의 요소들을 반복하면서 각 요소들을 리스트 a에 추가하는 것이다.

 

22.1.5 리스트의 특정 인덱스에 요소 추가하기

원하는 위치에 요소를 추가하고 싶을 때는 insert()를 사용한다. insert(인덱스, 요소)의 형식으로 사용하며 특정 인덱스에 요소 하나를 추가한다. 

a의 2번 인덱스에 200이 추가된 것을 확인할 수 있다.

insert()에서 자주 사용되는 패턴은 다음 두 가지 이다.

  • insert(0, 요소): 리스트의 맨 처음에 요소를 추가
  • insert(len(리스트), 요소): 리스트 끝에 요소를 추가

len(리스트)는 마지막 인덱스보다 1 크기 때문에 리스트의 마지막에 값이 추가된다. 

insert()에 리스트를 넣으면 리스트 안에 리스트가 들어가는 중첩 리스트의 형태가 된다. 

리스트 중간에 요소를 여러개 추가하려면 슬라이스를 이용하면 된다. 다음과 같이 시작 인덱스와 끝 인덱스 같게 하면 해당 인덱스의 요소를 덮어쓰지 않고도, 요소 여러개를 중간에 추가할 수 있다.

 

22.1.6 리스트에서 요소 삭제하기 

리스트에서 요소를 삭제하는 방법은 다음 두 가지가 있다. 

  • pop : 마지막 요소 또는 특정 인덱스의 요소를 삭제
  • remove : 특정 값을 찾아서 삭제

 

22.1.7 리스트에서 특정 인덱스의 요소를 삭제하기

pop()은 리스트의 마지막 요소를 삭제한 뒤 삭제한 요소를 반환한다.

pop() 괄호 안에 원하는 인덱스를 지정하면 그 인덱스에 해당하는 요소를 삭제한 뒤 반환한다. pop()대신 del 을 사용해도 상관 없다.

 

22.1.8 리스트에서 특정 값을 찾아서 삭제하기

리스트에서 원하는 값을 찾아서 삭제할 때는 remove()를 사용한다. remove(값)은 특정 값을 찾아서 삭제한다. 

리스트에 같은 값이 여러개 있을 경우 처음 찾은 값만 삭제한다.

 

리스트로 스택과 큐 만들기

append와 pop호출 형태를 90도로 돌려서 세로로 만들면 스택이되고, pop()대신 pop(0)을 사용하면 큐가 된다. 파이썬에서 스택은 리스트로 사용해도 되지만, 큐는 더 효율적으로 사용할 수 있도록 덱(deque, Double Ended QUEue)이라는 자료형을 제공한다. 덱은 양쪽 끝에서 추가, 삭제가 가능한 자료 구조이다.

collections 모듈에서 deque를 가져와야 한다. append()는 덱의 오른쪽에 요소를 추가하고, popleft()는 덱의 왼쪽 요소를 삭제한다. appendleft()로 덱의 왼쪽에 요소를 추가할 수도 있고, pop()로 덱의 오른쪽 요소를 삭제할 수도 있다. 

 

22.1.9 리스트에서 특정 값의 인덱스 구하기

index(값)은 리스트에서 특정 값의 인덱스를 구한다. 같은 값이 여러개일 경우 가장 처음 찾은 값의 인덱스를 반환한다. 

 

22.1.10 특정 값의 개수 구하기

count(값)으로 리스트 안의 특정 값의 개수를 구할 수 있다. 

a에는 2가 4개 들어 있어 4가 반환되었다.

 

22.1.11 리스트의 순서를 뒤집기

reverse()는 리스트 내 요소의 순서를 반대로 뒤집는다.

 

22.1.12 리스트의 요소를 정리하기

sort()는 리스트의 요소를 오름차순으로 정렬한다. sort(reverse=True)는 리스트의 요소를 내림차순으로 정렬한다.

리스트의 요소를 정렬하는 함수는 sorted()도 있다. sort()는 사용한 리스트를 변형시키지만, sorted()는 새로운 리스트를 생성하여 정렬한다.

 

22.1.13 리스트의 모든 요소를 삭제하기

clear()은 리스트의 모든 요소를 삭제하여 빈 리스트를 만든다.

del a[:]과 같이 시작리스트와 끝 리스트를 모두 생략하여 del로도 모든 요소를 삭제할 수 있다.

 

22.1.14 리스트를 슬라이스로 조작하기

메서드를 사용하지 않고, 슬라이스로 조작할 수도 있다. 

위 코드는 슬라이스를 사용하여 리스트 끝에 값을 하나 추가했다. len(a)는 리스트의 마지막 인덱스 보다 1 크기 때문에 리스트 끝에 값을 추가할 수 있다. 이때는 인덱스의 범위를 벗어난 리스트를 사용할 수 있다.

리스트 끝에는 여러개의 요소를 추가할 수 도 있다.

리스트가 비어있는지 확인하려면 len으로 확인할 수 도 있지만 리스트를 바로 if 조건문으로 판단이 가능하다.

if not seq:    # 리스트가 비어 있으면 True
if seq:        # 리스트에 내용이 있으면 True

리스트 인덱스에서 -1은 리스트의 마지막 인덱스를 의마한다. 리스트가 비어있을 경우 -1 인덱스를 지정하면 에러를 발생한다.

 

22.2 리스트의 할당과 복사 알아보기

다음과 같이 리스트를 만든 후 다른 변수에 할당하면 리스트는 두개가 아니라 다음과 같은 형태인 하나의 리스트가 있는것이다.

a 와 b를 is d연산자로 비교해보면 같은 True가 나온다. 변수 이름만 다를 뿐 같은 객체인 것이다.

두 변수 중 하나의 리스트에 적용되어도 같은 객체이기 때문에 두 변수 모두 반영된다.

a 와 b를 완전히 다른 두 객체로 만들려면 copy 메서드로 복사해야 한다. copy 메서드로 복사한 두 리스트는 is 연산자로 비교시 False로 나오며, == 연산자로 비교하면 요소가 모두 같기 때문에 True로 나온다. 둘 중 리스트 하나의 값을 변경해도 다른 리스트에 반영되지 않는다.

 

22.3 반복문으로 리스트의 요소를 모두 출력하기

22.3.1 for 반복문으로 요소 출력하기

for 반복문은 다음과 같이 in 뒤에 리스트를 지정하면 된다. 

for i in a: 는 리스트 a 에서 순서대로 요소를 꺼내 i에 저장하는 것을 반복한다. in 뒤에 변수가 아닌 리스트를 직접 지정할 수도 있다.

 

22.3.2 인덱스와 요소를 함께 출력하기

for 반복문에서 요소를 출력할 때 인덱스도 함께 출력하려면 enumerate를 사용한다. 

enumerate()에 리스트를 넣으면 인덱스와 요소를 동시에 꺼내올 수 있다. 

다음과 같이 start를 지정하여 시작할 인덱스의 숫자를 지정할 수 있다.

enumerate(a, start=1)은 enumerate(a, 1)처럼 간소화 시켜 사용할 수 있다. 

 

22.3.3 while 반복문으로 요소 출력하기

인덱스를 설정할때는 i <  len(a)로 리스트 길이는 마지막 인덱스 보다 1 크기 때문에 더 작게 해야 한다. 만약 <= 연산자를 사용할 경우 리스트의 범위를 벗어나 에러를 출력하게 된다.

 

22.4 리스트의 가장 작은 수, 큰 수 구하기

다음에 나오는 방식들은 튜플에서도 사용 가능하다.

 

22.4.1 가장 작은 수와 가장 큰 수 구하기

반복문을 이용하여 리스트에서 가장 작은 수를 구하는 방법은 다음과 같다.

리스트의 첫 번째 요소를 변수(smallest)에 저장하고, for 반복문으로 리스트의 요소를 바꾸며 smallest보다 작으면 smallest에 i 를 할당한다. 
가장 큰 수를 구하려면 다음과 같이 부등호를 반대로 바꾸면 된다.

리스트를 정렬하는 sort 메서드를 이용하여 구할 수도 있다. 오름차순으로 정렬하면 첫번째 요소가 가장 작은 숫자이고, 내림 차순으로 정렬하면 첫번째 요소가 가장 큰 숫자이다. 

파이썬에서 제공하는 min, max 함수를 사용해서도 구할 수 있다.

min은 가장 작은 값을 구하고, max는 가장 큰 값을 구한다. 

 

22.4.2 요소의 합계 구하기 

리스트 요소의 전체 합계를 구할 때는 다음과 같이 반복문을 사용할 수 있다.

합계를 구하는 sum 함수도 제공한다.

min,max,sum은 리스트 뿐 아니라 모든 반복 가능한 객체들(튜플, 딕셔너리, range, 세트 등)에 사용할 수 있다.

 

22.5 리스트 표현식 사용하기

파이썬은 리스트 안에 for 반복문이나 if 조건문을 넣을 수 있다. 리스트 안에 식, for문, if문 등을 지정하여 리스트를 생성하는 것을 리스트 컴프리헨션(list comprehension)이라고 하며 여기서는 리스트 표현식이라 한다. 

리스트 표현식은 다음과 같은 형태로 사용한다.

  • [식 for 변수 in 리스트]
  • list(식 for 변수 in 리스트]

range로 0 부터 9까지 i를 이용하여 꺼내고, i를 이용하여 리스트를 만드는 것이다. 

다음과 같이 i를 다른 값과 연산하면 각 연산의 결과를 리스트로 생성한다.

 

22.5.1 리스트 표현식에서 if 조건문 사용하기

if 조건문은 다음과 같이 for 반복문 뒤에 지정한다. 

  • [식 for 변수 in 리스트 if 조건식]
  • list(식 for 변수 in 리스트 if 조건식)

반복문 뒤에 if 조건문을 지정하면 숫자를 생성한 뒤 if 조건문에서 특정 숫자만 뽑아 내어 리스트를 생성한다. 위 코드의 경우에는 range로 생성한 0~9까지의 숫자들 중 짝수를 리스트에 넣었다.

if 조건문을 사용할 때도 i를 다른 값과 연산하여 리스트를 만들어도 된다.

 

22.5.2 for 반복문과 if 조건문 여러 번 사용하기

다음과 같이 for과 if를 여러 번 사용할 수 있다.

[식 for 변수1 in 리스트1 if 조건식1	for 변수2 in 리스트2 if 조건식2	...	for 변수n in 리스트n if 조건식n]
list(식 for 변수1 in 리스트1 if 조건식1	for 변수2 in 리스트2 if 조건식2	...	for 변수n in 리스트n if 조건식n)

다음은 2단부터 9단까지 구구단 리스트를 생성하는 코드이다.

다음과 같이 코드를 여러 줄로 입력하고, 들여쓰기를 하는 것도 가능하다. 들여쓰기는 안해도 되지만 가독성을 위해 하는 것이 좋다.

리스트에 for문이 여러개 일때는 뒤에서 부터 처리한다. 

 

22.6 리스트에 map 사용하기

map은 리스트의 요소를 지정된 함수로 처리하는 함수이다. 이때 원본 리스트를 변경하지 않고 새 리스트를 생성한다. 튜플에도 사용 가능하다.

다음과 같이 실수가 담긴 모든 리스트를 정수로 변환하는 코드는 map을 이용하면 더 간결하고 편하게 작성할 수 있다.

리스트의 모든 요소를 int를 사용해서 정수로 변환하고, list함수를 이용해 다시 리스트를 만들어 준 것이다. 

map은 리스트 뿐 아니라 모든 반복 가능한 객체를 넣을 수 있다. 다음 코드는 range로 생성된 정수들을 문자열로 변환한 것이다. 

 

22.6.1 input().split()과 map

input().split()의 결과는 리스트 인것을 확인할 수 있다.

map을 사용하여 정수로 입력받으면 결과는 다음과 같다.

map로 입력받으면 map object로 저장된다. 안에 들어있는 값을 보기 위해서는 리스트 함수를 이용해 리스트로 만들어 줘야 한다. 

이 리스트를 변수 두 개에 저장하면 지금까지 여러개의 변수를 입력 받을 때 저장했던 방식이다.

map 이 반환하는 맵 객체(map object)는 이터레이터 변수라서 변수 여러개에 저장하는 언패킹이 가능하다. 그래서 다음 코드 처럼 list()를 생략 한 것이다. 

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

이를 풀어서 쓰면 다음과 같다.

x = input().split()	# 문자열 리스트
m = map(int, x)		# 리스트의 요소를 정수로 형변환, 맵 객체
a, b = m			# 맵 객체는 여러 변수에 저장 가능

 

22.7 튜플 응용하기

튜플은 리스트와 달리 내용을 변경할 수 없기 때문에 내용을 변경하는 메서드는 사용할 수 없고, 요소 정보를 구하는 메서드만 사용할 수 있다.

 

22.7.1 튜플에서 특정 값의 인덱스 구하기

index(값)을 활용하면 된다. 같은 값의 요소가 여러개일 경우 처음 찾은 값의 인덱스를 반환한다. 

 

22.7.2 특정 값의 개수 구하기

count(값)으로 튜플에서 특정 값의 개수를 구할 수 있다. 

a 리스트에는 2가 3개 들어 있기 때문데 3을 반환한다.

 

22.7.3 for 반복문으로 요소 출력하기

방법은 리스트와 동일하다.

 

22.7.4 튜플 표현식 사용하기

다음과 같은 방식으로 사용한다.

tuple(식 for 변수 in 리스트 if 조건식)

다음과 같이 괄호 안에 표현식을 넣으면 튜플이 아니라 제너레이터 표현식이 된다.

 

22.7.5 tuple에 map 사용하기

튜플에 map사용도 리스트와 동일하다.

위 코드는 튜플 자체를 변화시킨 것이 아니라 , 각 요소들을 int로 매핑시켜 새로운 튜플을 만들어 준 것이다. 

이 과정을 코드로 작성하면 다음과 같을것 같다.

 

22.7.6 튜플에서 가장 작은 수, 가장 큰 수, 합계 구하기

min()으로 가장 작은 수를, max()로 가장 큰 수를, sum()으로 합계를 구할 수  있다.

 

22.8 퀴즈

정답은 a,d이다.

정답은 e이다.

정답은 a,d,e이다.

정답은 b이다. 튜플은 값의 변형이 불가능하다.

정답은 d 이다.

정답은 c이다.

 

22.9 연습문제 : 리스트에서 특정 요소만 뽑아내기 

정답은 다음 코드와 같다.

[i for i in a if len(i) == 5]

리스트 표현식에 for문을 사용하여 리스트 요소들을 각각 가져와서 len()함수로 길이를 검사하고, 길이가 5이면 b리스트에 저장한다.

 

22.10 심사문제: 2의 거듭제곱 리스트 생성하기

정답은 다음 코드와 같다.

n1, n2 = map(int, input().split())

li = [2**i for i in range(n1, n2+1)]

del li[1]
del li[-2]

print(li)

리스트 li에 표현식을 첫번째 입력 값부터 두번째 입력 값(포함) 까지 2의 거듭제곱을 저장하였다. 두번째 요소와 뒤에서 두번째 요소는 del을 이용하여 1번 인덱스와 -2번 인덱스를 삭제하고 리스트를 출력하였다.

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