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