-Summary-
bool, str, list, tuple, 시퀀스 자료형
01-20 (Unit 8.1 ~ Unit 10.5)
-Bool-
Bool은 참과 거짓을 나타내는 자료형이다.
True(참), False(거짓)이 두 값만 가질 수 있고 보통 if문 같이 조건을 판단하는 곳에 많이 쓰인다.
위 사진 3번째 줄을 보면 1 > 0이라는 식을 적었는데, 1이 0보다 큰건 사실이므로 참인 True를 출력하게 된다. 반대로 4번째 줄은 1 < 0 , 즉 1이 0보다 작은 것은 사실이 아니므로 거짓인 False를 출력하게 되는 것이다.
-부등호, 비교 기호
== : 앞, 뒤 값이 서로 같은지
!= : 앞, 뒤 값이 서로 다른지
>= : 앞의 값이 뒤의 값보다 같거나 큰지
<= : 앞의 값이 뒤의 값보다 같거나 작은지
> : 앞의 값이 뒤의 값보다 큰지
< : 앞의 값이 뒤의 값보다 작은지
변수, 문자열 또한 비교가 가능하다.
-is, is not
is, is not은 ==, !=이랑 비슷한 기능을 한다.
==, !=이랑 다른점은 ==, !=은 값 자체를 비교하지만, is, is not은 객체를 비교한다고 한다.
is, is not은 값을 비교하는 것 보다는 값 뿐만이 아니라 자료형 같은 것도 같은지 확인하는 것 같다.
-id 함수
id는 객체가 메모리에 위치한 주소를 구해주는 함수다.
위 사진을 보면 1을 넣은 a와 1.0을 넣은 b의 주소가 다른데, is, is not은 이를 비교해서 True, False를 구분해주는 것 같다.
-논리 연산자
and : 두 값이 모두 참일시 참
or : 둘중 하나라도 참일시 참
not : 참이라면 거짓을 거짓이라면 참으로 바꿈
1행은 and 연산인데, 둘다 True이므로 True를 출력해주고, 2행은 하나가 False라 False를 출력해준다. 3행은 or 연산이라 둘중 하나가 True라 True를 출력해준다. not은 True면 False를 False면 True를 출력해주는걸 4,5행에서 볼 수 있다.
위 사진은 비교 기호와 논리 연산자들을 섞어서 실습해 본 사진이다.
1행은 and 연산에서 1 == 1 (참), 1 > 0 (참)이므로 True를 출력해주고, 2행은 or 연산에서 1 != 1 (거짓), 1 > 0 (참)이므로 참을 출력해준다. 3행은 1 == 1은 True지만 앞에 not이 붙었기에 False를 출력한다.
-다른 자료형 bool 형으로 변환
바꾸고자하는 값에 bool()을 해준다면 bool 형으로 형 변환이 된다.
정수, 실수일 경우 바꿀 값이 0인 경우 False로 변하고, 0이 아닌 경우에는 모두 True로 변한다.
문자열은 ''같이 아무 문자도 없는 경우 False가 되고 문자가 있다면 True로 변한다. 심지어 공백만 존재해도 True로 해준다.
위 사진과 같이 0이 아닌 값들은 모두 True로 변한다.
위 사진과 같이 ''같이 아무 문자도 들어있지 않을 경우만 False로 변한다.
-단락 평가-
단락 평가란 첫 번째 값만으로도 결과를 결정할 수 있을 때, 두번째 값은 확인을 안한다는 것이다. 예를 들어 True or False라는 식 같이 or는 하나라도 참일 경우 참이므로 뒤의 False를 볼 필요도 없이 앞의 True만 보고 True로 판단하는 것이다. and 역시 False and True라는 식이 있을 때, and는 하나라도 거짓일시 False로 판단하므로 뒤의 True 값을 볼 필요도 없이 앞의 False 하나만 보고 False로 결정하는 것이다.
신기한건 위의 사진의 1행을 본다면 원래대로라면 둘다 참이므로 True를 출력해야하는데 두번째 값인 'a'를 출력한다는 것이다. 2행은 첫번째 값부터 False이므로 당연히 False를 출력한다.
처음 안 사실인데 파이썬에서는 단락평가에 따라 논리 연산자의 결과를 판단한다고 한다. 위 사진처럼 'a'가 그대로 출력된 이유는 1행에서 첫번째 값이 True이므로 두번째 값에 논리 연산이 참일지 거짓일지가 달려 있다. 그래서 파이썬은 두번째 값을 결과로 출력해 주는 것이다.(만약 위 사진과 달리 'a' 부분이 True였다 치면 두번째 값이 True가 반환된다.)
위 사진처럼 and 연산 같은 경우 첫번째 값이 참이라면 두번째 값을 결과로 출력해준다는 것을 알 수 있다.
or도 역시 첫번째 값을 참인 경우 단락 평가에 의해 더 볼 필요 없이 참이 되므로 첫번째 값을 그대로 출력해 준다.
x는 5와 같다는 x == 5로 식을 적으면 된다.
a : 2*3은 6이므로 6 == 2*3은 True다.
b : 2+2는 4므로 4 != 2+2는 False다.
c : 2*3 = 6, 3+3 = 6이지만 is로 연산해줘서 햇갈렸지만 파이썬 쉘에서 실행하니 True를 출력하는 것을 보아 자료형이 같고 같은 값이면 같은 객체로 해주는 것 같다.
d : 4 * 2.0 = 8이므로 언뜻 보기에는 True 같지만 실수형과 정수형을 연산하면 실수형 결과가 나오므로 is 연산에서 서로 객체가 달라 False가 나올 것 같다.
e : e번 역시 실수 연산이 존재해서 False가 맞지만, 애초에 6-1.1은 4.9이므로 값도 서로 같지 않다.
a에는 10이 들어있고 b에는 20이 들어있는 상태다.
a : a == 10 (True) or b == 10(False), or 연산이므로 결과는 True
b : a >= 10 (True) and b < 30 (True), and연산이고 둘다 True이므로 결과는 True
c : not a == 10 (True), a == 10은 True지만 not이 붙었으므로 그 반대인 False가 결과다.
d : b != 20 (False) or a !=10(False), 둘다 False이므로 False
e : not b != 20 (False) and a > 5 (True), and 연산에서 첫번째 식인 b != 20이 False이므로 False가 될 것 같지만 앞에 not이 붙었으므로 그 반대 값이 True가 되어 뒤에 식인 a > 5 또한 True 이므로 True를 출력한다.
결과를 뒤집는 연산자는 not이다.
과목중 하나라면 50점 미만이면 불합격이므로 과목 모두 50 이상인지 확인하는 논리식을 짜면 된다.
korean = 92
english = 47
mathematics = 86
science = 81
print((korean+english+mathematics+science) >= 200)
처음에는 하나라도 50점 미만이면 불합격이므로 나는 전체 합쳤을 때 200 미만일 경우 False가 출력되도록 짯지만 생각해보니 이건 평균 50점 미만일 경우 불합격을 출력하는 코드라서 다시고쳤다.
korean = 92
english = 47
mathematics = 86
science = 81
print((korean >= 50) and (english >= 50) and (mathematics >= 50) and (science >= 50))
국어 90점 이상, 영어 80점 초과, 수학 85점 초과, 과학 80점 이상이라는 조건식이 주어졌다.
2줄의 코드로 작동하도록 작성해야하므로 1행은 입력, 변수에 값 할당, 2행에 조건을 적어서 참과 거짓을 출력하면 될 것 같다.
kor, eng, math, scien = map(int,input().split())
print((kor >= 90) and (eng > 80) and (math > 85) and (scien >= 80))
-문자열-
파이썬에서 문자열을 만드는 방법은 여러가지가 있다.
1. ' '안에 문자열을 넣는 방법
2. " "안에 문자열을 넣는 방법
3. ''' '''안에 문자열을 넣는 방법
4. """ """안에 문자열을 넣는 방법
특히 3번째나 4번째 방법은 shell에서 코딩할 때 유용한데, 문자열을 여러줄에 나눠서 넣고 싶을 때 사용할 수 있다.
참고로 파이썬 쉘에서 print 함수 없이 변수만 입력해서 출력을 하는 경우
이렇게 줄바꿈 부분이 \n으로 대체되서 나타난다.
1번째, 2번째 방법은 상황에 따라 다르게 쓰이는데, 특히 저장할 문자열에 '나 "가 들어갈 때 1번째 2번째 방법을 바꿔가며 쓴다.
위 사진처럼 문자열에 '가 들어가야할 때는 ' ' 대신 " "로 감싸준다면 오류없이 변수에 문자열을 넣을 수 있다.
"역시 '로 써준다면 오류없이 문자열을 넣어줄 수 있다.
1번째 2번째 방법 외에도
\를 앞에다 붙여준다면 위 사진처럼 오류없이 문자열을 넣을 수 있고, """ """, ''' '''또한 가능하다.
a : ' '나 " " 등으로 감싸주지 않았다. X
b : " "로 잘 감싸 줬다. O
c : ` `로 감싸면 안된다. X
d : ' '로 잘 감싸줬다. O
e : [ ]로 감싸면 안된다. X
여러줄로 표현하기 위해서는 """ """, ''' ''', \n을 이용한다면 가능하다.
a : ''' '''로 잘 감싸줬다. O
b : ``` ```로 감싸면 안된다. X
c : """ """로 잘 감싸줬다. O
d : """ """, ''' '''로 감싸주지 않았다. X
e : #은 주석이다..
'나 "를 문자열안에 넣는 법은 '을 넣을 경우 " "로 감싸주고, "을 넣을 경우 ' '로 감싸준다. 또는 둘다 앞에 \를 붙여주면 된다.
a : \로 앞에 잘 붙여줬다. O
b : ' ' 안에 '가 들어가면 오류난다. X
c : " " 안에 '을 넣을 수 있다. O
d : """ """안에 "을 넣을 수 있다. O
e : " "안에 "은 못들어간다. X
Python is a programming language that lets you work quickly and integrate systems more effectively. 을 실행 결과 형식으로 작성하면 되므로 """ """, ''' ''' 또는 \n로도 가능하다.
근데 주어진 줄이 3줄이므로 """ """, ''' '''중으로 쓰면 된다.
s = """Python is a programming language that lets you work quickly
and
integrate systems more effectively."""
print(s)
결과를 보니 문자열에 ' , "이 들어간다. '," 앞에 \를 써줘도 되지만 4개나 써야하므로 """ """로 감싸겠다.
s = """'Python' is a "programming language"
that lets you work quickly
and
integrate systems more effectively."""
print(s)
-List-
List는 다른 언어에서의 배열과 비슷한 역할을 하는 자료형이다.
list는 목록이라는 뜻이 있는데, 이 뜻과 비슷하게 여러개의 값들을 한 변수에 넣을 수 있다.
저장 방법은 (변수명) = [(값),(값),(값).....] 이렇게 해주면 된다.
(변수명) = [] 또는 (변수명) = list()로 해준다면 빈 리스트도 만들 수 있다.
참고로 split함수는 문자열을 나눠서 리스트형으로 저장을 해준다.
위 사진처럼 변수를 3개 만들어 일일이 값을 넣어줄 수도 있지만 List를 사용한다면 값을 한번에 집어 넣고 한번에 출력할 수 있다.
무엇보다 파이썬의 List는 다른 언어의 배열과 달리 다른 자료형의 값들도 List로 한 변수에 저장할 수 있다.
-range-
range는 연속된 숫자를 생성해주는 함수다.
range(<숫자(횟수)>), range(<시작 숫자>,<끝 숫자>), range(<시작 숫자>,<끝 숫자>,<증가 폭>) 이런식으로 사용이 가능하다.
첫번째 방법은 예를 들어 listA = range(5)을 한다면 0,1,2,3,4까지 총 5개의 숫자를 listA에 저장해 준다. 단 5는 넣어주지 않는다.
두번째 방법은 시작 숫자부터 끝 숫자 전까지 생성해주는데, 이 역시 끝 숫자까지는 생성을 안해준다. 예를 들어 listA = range(1,5)를 한다면 listA에는 1,2,3,4까지의 숫자가 저장된다.
세번째 방법은 시작 숫자부터 끝 숫자 전까지 정해둔 증가폭(음수도 가능하다) 규칙으로 생성을 해준다. 예를 들어 listA = range(1,6,2)를 한다면, listA에는 1, 3, 5가 저장된다.
참고로 list()없이 그냥 range만 써둔다면 원하는 결과가 나오지 않기 때문에 list()로 꼭 자료형 변환을 해줘야한다.
-튜플-
튜플은 List와 비슷한 자료형이다. 값을 여러개 넣을 수 있고, 리스트와 마찬가지로 다른 자료형의 값 또한 넣을 수 있다. 솔직히 처음 배웠을 때는 List와 똑같은데 왜 튜플을 따로 지정해뒀지라고 생각을했는데, 튜플에는 List가 갖고 있지 않는 기능이 하나 있다. 값의 추가, 변경 등이 불가능하다는 것이다. 다른 언어의 상수라는 것처럼, 고치면 안되는 값들을 저장하는데 쓰이는 것 같다.
위 사진처럼 값을 추가하거나 변경하려하면 오류가 뜬다.
-값이 하나인 튜플 생성
값이 하나인 튜플을 생성하려고 집어넣을 값 안에 괄호를 쳐서 할당해 줬지만 type 함수로 확인해보니 int형이라고 나왔다. 확인해 보니 값이 하나인 튜플을 생성하려면 a = (1,)이런식으로 콤마를 붙여주면 가능하다.
값이 한 개 있는 튜플은 쓸모 없을거라 생각이 들지만 가끔 함수나 클래스에 튜플을 넣어야하는 상황이 생긴다고 한다.
-tuple(range)
앞서 list에서 range를 이용해서 연속된 값을 한번에 넣었듯이 튜플에서 또한 range로 값을 한번에 넣어줄 수 있다.
list와 마찬가지로 range함수 앞에 tuple()로 감싸준다면 range로 만들어진 값들이 tuple로 형변환이 된다.
-tuple -> list, list->tuple
튜플에서 리스트로, 리스트를 튜플로 바꾸는 방법은 간단하다. 앞서 정수를 실수로, 실수를 정수로 바꾸는 것처럼, list(), tuple()로 감싸준다면 쉽게 형 변환이 가능하다. 내 생각이지만, 이를 이용해서 튜플의 값을 추가하거나 변경하며 써도 될 것 같다.
-문자열 -> List, Tuple-
문자열의 경우 저렇게 tuple() 또는 list()로 감싸준다면 알아서 나눠서 저장이 된다.
-List Tuple의 값들 옮기기-
리스트와 튜플의 값들을 여러 변수에 나눠서 저장할 수 있다.
위 사진처럼 리스트나 튜플 안의 값을 담을 변수를 선언해준다면 리스트의 값들을 옮길 수 있다.
튜플 역시 리스트와 마찬가지로 변수를 통해 나눠 담을 수 있다.
리스트를 만드는 방법은 [ ]로 값들을 감싸주는 것이다.
a : []로 잘 감싸줬다. 참고로 []안이 비었다하더라도 list형으로 인식해준다. O
b : ()는 튜플이다. X
c : []로 잘 감싸줬다. O
d : range도 list()로 감싸서 쓴다면 list형으로 결과를 받을 수 있다, O
e : []로 감싸주지 않았다. X
튜플은 ()로 감싸주면 만들어진다. 단 값을 하나만 넣을 경우 값뒤에 ,를 써줘야한다.
a : []는 리스트다. X
b : ()로 감싸주지 않았다. X
c : ()로 잘 감싸줬다. O
d : []는 리스트다. X
e : 리스트형은 tuple()을 써준다면 튜플로 만들어줄 수 있다. O
-10, -7, -4, -1, 2 ...을 본다면 3씩 커진다는 규칙이 있다. range의 3번째 인자로 증가폭을 정해줄 수 있으므로, range(-10,10,3)으로 range식을 짜고, 튜플은 tuple()로 range식을 감싸준다면 된다.
a : tuple로 바꿔주지 않았다. X
b : list형이다. X
c : range를 써주지 않아, -10, 10, 3 값이 그대로 튜플에 들어간다. X
d : 맞게써줬다. O
e : range도 tuple()도 써주지 않았다. X
5,3,1,-1....를 리스트로 만들어 출력하게 해야한다. 보면 -2라는 규칙으로 5~-9까지 출력해야한다. range(5,-10,-2)로 해주면 될 것 같다. 또한 리스트로 출력해야하므로
a = list(range(5,-10,-2))
print(a)
이렇게 코드를 작성하면 될 것 같다.
range의 시작하는 숫자는 -10, 끝나는 숫자 10이 주어져 있고 증가폭은 사용자가 입력한 만큼으로 지정해야한다.
또한 range로 만들어진 값들을 튜플로 저장하고 출력해야한다는 조건이 있다.
i = int(input())
tu = tuple(range(-10,10,i))
print(tu)
나는 위 코드처럼 1행에서 입력을 받고, 받은 입력을 int형으로 바꿔서 i에 저장하고, 2행에서 range함수의 증가폭을 i로 해주는 방식으로 문제를 해결했다.
01-21 (Unit 11.1 ~Unit 11.9)
-시퀀스-
시퀀스(sequence)의 뜻은 연속된이라는 의미이다.
파이썬에서 시퀀스는 리스트, 튜플, range, 문자열 등처럼 값이 연속적으로 이어진 자료형을 시퀀스 자료형이라고 한다.
시퀀스 객체 : 시퀀스 자료형으로 만든 객체
요소 : 시퀀스 객체에 들어있는 각 값
예를 들어 a = [1,2,3,4]라는 리스트 변수 선언이 있을 때 a를 시퀀스 객체라 부르고 1,2,3,4 같은 값들을 요소라고 부른다.
위 사진은 코딩도장 Unit 11.1에 나와있는 사진이다. 앞서 배웠던 list, tuple, range등이 시퀀스 자료형인걸 알 수 있고, 또한 처음 알았는데 str, 즉 문자열 또한 시퀀스 자료형이다. 그외로는 bytes, bytearray가 있지만 안배웠으니 넘어가겠다.
이 파이썬에서 시퀀스 자료형들은 공통된 동작, 기능을 제공한다.
-in
in은 시퀀스 객체에서 특정 값이 있는지 확인하는 역할을 한다.
사용은 (값) in (시퀀스 객체)
위 사진과 같이 특정 값이 시퀀스 객체에 있는지 확인하고, 존재한다면 True, 존재하지 않다면 False를 반환한다.
위 사진처럼 str, 튜플 등 다른 시퀀스 자료형도 사용할 수 있다.
-+
시퀀스 객체에서 + 기호를 사용한다면 객체를 서로 연결 시킬 수 있다.
위 사진처럼 a,b에 각각 1,2와 3,4가 들어 있는 시퀀스 객체가 있을 때, 이 두 객체를 +로 이어준다면 둘을 연결해서 1,2,3,4 출력해주게 된다.
+역시 다른 시퀀스 자료형도 사용할 수 있지만 range에 사용할 때는 반드시 list나 tuple 등로 묶어주고 사용해줘야지, 오류없이 연결된다.
또한 문자열의 경우 실수나 정수와 문자열을 연결할 때 str()로 실수나 정수를 시퀀스 자료형으로 형 변환을 시켜준다면 연결이 가능하다.
-*
*는 시퀀스 객체를 반복해주는 기호다. 예를 들어 [1,2] * 3을 해준다면 [1,2]가 3번 반복되어 [1,2,1,2,1,2]가 결과로 도출될 것이다.
마찬가지로 다른 시퀀스 객체에서도 사용할 수 있다. range는 당연히 list나 tuple로 묶어주고 사용해야한다.
-len
len는 시퀀스 객체의 요소 개수를 구해주는 역할을 한다. 사용은 len(<시퀀스 객체>) 이런식으로 사용하면 된다.
UTF-8에서 한글은 글자 하나당 3바이트를 차지한다고한다.
위 사진처럼 한글 문자를 utf-8로 인코딩 한 후(encode는 인코딩해주는 함수다.) 길이를 구해보면 14((한글 4글자*3)+공백(1)+!(1))가 나오는 것을 볼 수 있다.
-index(인덱스)
시퀀스 객체의 연속된 요소들은 순서가 정해져 있는데, 이 순서를 index라고 한다.
예를 들어 a = [1,2,3,4]로 선언된 list형 시퀀스 객체 a가 있다 가정할 때, a의 값 1은 0이라는 인덱스를 가지고 2는 1, 3은 2, 4는 3을 가진다.
인덱스는 1부터 시작하는게 아니라 0부터 시작한다는 점을 유의해야한다.
위 사진처럼 a의 0번째 값(0번째 인덱스) a[0]은 1이 나온다.
위 사진처럼 튜플, 문자열 등 모든 시퀀스 객체에서 인덱스를 사용할 수 잇다.
앞에서 계속 써봤듯이 인덱스를 지정해주지 않는다면, 전체를 출력해준다.
인덱스는 음수로도 지정할 수 있는데, 음수 인덱스를 써줄 경우 뒤를 기준으로 인덱스에 해당하는 것을 가리킨다.
예를들어 a = [1,2,3]이 있을 때 a[-2]는 뒤에서 2번째인 2가 된다.
지금은 적은 수의 요소를 다뤄, 인덱스를 지정하기 쉽지만 조금 긴 요소를 마주한다면, 맨 끝의 index를 알기 위해서는 일일이 세 봐야할지도 모른다.
하지만 앞서 배웠던 len을 적절히 응용하면 단숨에 마지막 index를 구해줄 수 있다.
1행의 a에는 1에서 100까지 3의 증가폭으로 생성된 값들이 들어간다.
2행에서 len을 통해 a의 길이가 33라는 것을 구할 수 있지만, 3행에서 a[len(a)]로 마지막 index의 값을 출력하려하면 index out of range라는 오류가 뜬다. 여기서 index out of range란 시퀀스 객체에서 범위를 벗어난 인덱스에 접근하려하면 나타나는 오류다.
a[len(a)]가 오류가 뜨는 이유는 시퀀스 자료형에서 인덱스는 0부터 시작하기 때문이다. len은 0부터 시작하는게 아닌 1부터 시작해서 해당 시퀀스 객체의 길이를 구하므로 결국 인덱스 범위를 벗어나게 된다.
따라서 마지막 행처럼 len(a)-1로 해준다면 마지막 인덱스의 값을 출력할 수 있다.
-__getitem__
앞에서는 index를 이용해 a[2] 같이 인덱스를 지정해서 값을 출력하게 만들었다.
사실 a[2]를 지정해서 값을 출력하게 한다면, 파이썬에서 자동으로 __getitem__(2)이라는 함수를 호출해 해당 인덱스의 값을 반환해 주는 것이다.
사용 방법은 위 사진처럼 (객체).__getitem__(인덱스번호) 이렇게 사용하면 되지만, 아직까지 __getitem__의 큰 메리트는 모르겠어서 그냥 a[2] 이런식으로 간편하게 호출하면 될 것 같다.
-요소에 값 할당
시퀀스 객체의 요소들에 값을 할당해 주는 방법은 간단하다. <시퀀스 객체>[<인덱스>] = <값> 이런식으로 값을 할당 할 수 있다.
-del
del은 앞에서는 변수(객체)를 지우는데 주로 사용했었다.
시퀀스에서 del은 요소를 삭제해주는 역할도 할 수 있다. 요소에 값 할당하는 법과 비슷하게 del 객체[인덱스] 이런식으로 써준다면 특정 인덱스의 요소만 삭제가 가능하다.
위 사진처럼 인덱스를 지정한다면 그 인덱스에 해당하는 값을 지워주는데, 단순히 값을 지워주는 뿐만 아니라 존재(?) 자체도 지워주므로 a[0]이 del되기 전 a[1]에 해당하는 값이 del 된 후 a[0]이 된다는 것을 알 수 있다.
-슬라이스
시퀀스 자료형은 슬라이스라는 기능을 자주 사용한다고 한다. 슬라이스(slice)는 단어 그대로 시퀀스 객체의 일부를 잘라주는 기능을 제공한다. 이 슬라이스 기능을 사용할 때 자르는 기준은 인덱스를 통해 결정된다.
슬라이스를 배우면서 느낀 점이 슬라이스 할 인덱스들을 지정하는 방식이 range 함수와 굉장히 비슷하다는 점인데, range 함수에서 시작할 값, 끝 값(끝 값은 포함되지 않는다), 증가폭을 지정해주는 것처럼 슬라이스에서도 시작할 인덱스 번호, 끝 인덱스 번호(끝 인덱스는 포함되지 않는다), 증가폭 이런식으로 사용된다.
슬라이스는 위 사진처럼 사용한다. 1행은 list a 선언하고 값을 할당해 줬고, 2행에서 [0:3]이라는걸 적어줬는데, 이 의미는 인덱스 0번부터 2번까지 잘라달라는 의미다. 따라서 출력된 값을 보면 인덱스 0,1,2에 해당하는 1,2,3이 출력됐다. 이 말고도 범위를 [1:3]으로 지정해준다면 인덱스 1부터 2까지 출력해 주는 등 시작 번호와 끝 번호는 자유롭게 지정해 줄 수 있다.
참고로 슬라이스는 객체를 아에 자르는건 아니고 잘른 부분을 출력해주는 것과 같은 역할을 한다. 3행을 보면 위에서 [0:3]으로 슬라이스를 해줬지만, a를 출력해보니 뒷부분은 잘려지지 않은 상태로 남아있는 것을 볼 수 있다.
또한 원래 list a에 index 번호 3번은 존재하지 않지만 슬라이스를 할 때 끝 값 바로 전까지 출력해주기 때문에 끝값으로 3을 써줘도 index out of range 오류는 뜨지 않는다.
위에서 슬라이스는 range처럼 증가폭이란게 있다고 적었는데, 위 사진은 증가폭을 이용해 슬라이스를 해준 모습이다.
1~20까지의 숫자가 들어있는 list a를 a[0:15:2]로 슬라이스를 해주게 되는데, 이 경우 0~14까지 2만큼 증가하며 출력을 해준다. 따라서 인덱스 0, 2, 4, 6, 8....에 해당하는 값들인 1,3,5,7,9....가 출력됐다.
음수 또한 증가폭으로 지정해줄 수 있다.
또한 슬라이스는 위 사진처럼 맨 처음부터 하거나, 맨 끝까지 자를때는 굳이 0이나 끝 인덱스 값을 지정해둘 필요없이 아무것도 적지 않는다면 자동으로 맨 처음, 혹은 맨 끝까지로 인식해서 출력해준다.
참고로 위사진처럼 둘다 공백으로 둔다면 시퀀스 객체의 처음부터 끝까지 모든 요소를 출력해준다.
위 사진처럼 처음, 혹은 끝 인덱스를 생략해준 상태에서도 증가폭을 사용할 수 있다.
-슬라이스 요소 할당
위에서 주로 슬라이스로 특정 부분에서 특정 부분까지 출력하는 것을 주로 배웠는데, 슬라이스를 응용한다면, 특정 부분을 원하는 값으로 바꿀 수도, 아에 삭제해버릴 수도 있다.
위 사진처럼 특정부분을 슬라이스하고 = 연산 기호를 사용해서 값을 지정해 주면, 슬라이스 된 부분을 원하는 값으로 바꿀 수 있다.
4행 같은 경우 0~2까지 슬라이스 했으므로 3개의 값이 들어갈 수 있는데, 그 보다 더 많은 값을 집어넣게 되도 잘 들어가게 된다. 대신 그만큼 시퀀스 객체의 요소 개수가 늘어나게 된다.
또한 증가폭을 사용해서 값 할당이 가능하다.
위 사진처럼 슬라이스 된 부분을 지울 수 있다. 이 역시 증가폭을 사용해서 값을 지울 수 있다.
-slice 객체 사용
slice라는 객체를 이용해서 변수처럼 slice를 사용할 수 있다.
위 사진처럼 slice 객체를 만들어둔다면, 위에서 했던 것처럼 범위를 지정해주지 않아도 기록된 범위, 증가폭으로 시퀀스 객체들을 슬라이스 해준다.
위에서는 list를 주로 사용해서 실습을 해봤는데, tuple, string 같이 다른 시퀀스 자료형들도 slice를 사용해서 값들을 슬라이스 할 수 있다. 단 tuple, range, 문자열은 범위를 지정해도 요소 할당은 불가하다. 또한 del로 요소를 삭제하는 것 또한 불가능하다.
a : in은 시퀀스 객체 안에 특정 값이 있는지 확인한다. X
b : range는 *연산자로 반복이 가능하다.(이부분이 많이 햇갈렸는데, 그냥 range는 불가능하지만 list나 tuple로 형을 변환 시켜서 *연산 기호를 사용하면 반복이 가능하다.) O
c : 문자열은 시퀀스 자료형이 맞다. O
d : 첫번째 객체 안에 두번째 객체가 들어가지 않는다. X
e : len함수는 시퀀스 객체의 요소 개수를 구하는 함수다. O
a : 0번째 인덱스에 해당하는 값은 10이 맞다. O
b : 인덱스 1의 값은 20이다. X
c : 인덱스 3의 값은 40이 맞다. O
d : 인덱스 -1(맨 끝에서부터)의 값은 60이다. X
e : 인덱스 -1의 값은 60이다. O
11,55, 99는 4간격으로 서로 떨어져 있다. 그러므로 slice를 사용해 시작 값(아무것도 안써줘도 됨) 0, 맨 끝값, 증가폭 4를 써주면 된다. 답 : c, e
a : 새 객체가 아닌 기존 객체에서 값이 바뀐다. X
b : 문자열도 슬라이스가 가능하다. O
c : 튜플도 슬라이스가 가능하다. X
d : range 객체는 슬라이스로 범위를 지정해 요소 할당이 불가능하다. O
e : 정확히 일치해야한다. O
3년간의 연도, 인구수를 출력해야하므로 슬라이스를 사용하면 된다.
year = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]
population = [10249679, 10195318, 10143645, 10103233, 10022181, 9930616, 9857426, 9838892]
print(year[-3:])
print(population[-3:])
인덱스가 홀수인 요소만 출력하면 되므로 이 역시 슬라이스를 사용하면 된다.
n = -32, 75, 97, -10, 9, 32, 4, -15, 0, 76, 14, 2
print(n[1::2])
입력받은 리스트 x에서 마지막 요소 5개를 삭제한 뒤 튜플로 출력되게 만들어야하므로 del과 tuple()를 사용하면 될 것 같다.
x = input().split()
del x[-5:]
print(tuple(x))
문자열 2개가 행을 바꿔서 입력되는데, 첫번째 문자열은 인덱스가 홀수인 문자, 두번째 문자열은 인덱스가 짝수인 문자를 연결해서 출력하면 된다. 단 0은 짝수다.
이 문제는 슬라이스에서 증가폭을 적절히 사용하면 될 것 같다.
x,y = input(),input()
tmp = x[1::2] + y[0::2]
print(tmp)
줄이면 1줄, 2줄로도 작성할 수 있을 것 같지만 주어진 줄이 3줄이므로 3줄에 맞춰 작성했다.
'Old (2021.01 ~ 2021.12) > Programming' 카테고리의 다른 글
파이썬 코딩도장 Unit 27 ~ 37 (0) | 2021.01.31 |
---|---|
파이썬 코딩도장 Unit 23 ~ 26 (0) | 2021.01.27 |
파이썬 코딩도장 Unit 20 ~ 22 (0) | 2021.01.26 |
파이썬 코딩도장 Unit 12 ~ 19 (0) | 2021.01.24 |
파이썬 코딩도장 Unit 1 ~ 7 (0) | 2021.01.19 |