코드 내용과 출력 결과를 따로 작성하는 것보다는, 가독성을 높이기 위해서 주제별로 코드블럭을 나누고 코드 내에 주석으로 출력내용을 같이 담았습니다. 강의 내용을 자세히 적어, 천천히 읽어보면서 따라하면 강의 없이 코드블럭만 보고도 복습할 수 있도록 했습니다.
# Chapter-04-02
# 시퀀스형
# 컨테이너(Container : 서로다른 자료형[List, tuple, collections.deque])
# 플랫(Flat : 한개의 자료형[str, bytes, bytearray, array.array, memoryview])
# 가변(list, bytearray, array, memoryview, deque)
# 불변(tuple, str, bytes)
# 리스트 및 튜플 고급
# Python은 표현할 수 있는 문법이 다양하다.
# Tuple Advanced
# Unpacking
1. divmod() 함수, '*' 키워드를 통한 유연한 Unpacking
# b, a = a, b 다른 언어에는 temp 변수를 만들지만 Python에서는 이렇게 할 수 있다.
# divmod는 첫 번째 인자를 두 번째 인자로 나눈 몫과 나머지를 Tuple로 반환한다.
print(divmod(100,9)) # (11, 1)
# (100, 9)라는 Tuple을 인자로 넣고 싶으면 * 키워드를 사용한다. (그렇지 않으면 오류)
print(divmod(*(100,9))) # (11, 1)
# 반환된 Tuple을 * 키워드를 이용해 Unpacking한 것이다.
print(*divmod(100, 9)) # 11, 1
print()
# 이제 변수를 선언해서 Unpacking을 더 연습해보자
# x, y, rest = range(10) 변수보다 할당할 값이 더 많기 때문에 오류가 발생한다.
x, y, *rest = range(10) # * 키워드를 이용했기 때문에, rest에 나머지 할당할 값들이 List형으로 저장된다.
print(x, y, rest) # 0 1 [2, 3, 4, 5, 6, 7, 8, 9]
# 다음 상황도 보자
# x, y, rest = range(2) 변수보다 할당할 값이 더 적기 때문에 오류가 발생한다.
x, y, *rest = range(2) # 오류 없이 rest에 아무 값도 할당되지 않은 빈 List형이 할당된다.
print(x, y, rest) # 0 1 []
# 또 다른 상황
x, y, *rest = 1, 2, 3, 4, 5
print(x, y, rest) # 1 2 [3, 4, 5]
2. Muatble(가변형), Immutable(불변형) 자료형의 연산과 id값
l = (15, 20, 25) # Tuple: 불변형
m = [15, 20, 25] # List: 가변형
print(l, id(l)) # (15, 20, 25) 2906358948392
print(m, id(m)) # [15, 20, 25] 2906358919496
# l과 m에 곱하기 2 연산을 해보자
l = l * 2
m = m * 2
print(l, id(l)) # (15, 20, 25, 15, 20, 25) 2906358885448
print(m, id(m)) # [15, 20, 25, 15, 20, 25] 2906358910088
# l과 m이라는 변수에 재할당을 해주었기 때문에 id 값이 바뀐 것을 볼 수 있다.
# 다음과 같이 연산을 해보자
l *= 2
m *= 2
print(l, id(l)) # (15, 20, 25, 15, 20, 25) 2906357544568
print(m, id(m)) # [15, 20, 25, 15, 20, 25] 2906358910088
# Tuple형은 불변형이기 때문에 재할당을 해주어 id 값이 바뀌었지만
# List형은 가변형이기 때문에 재할당을 해주지 않았기 때문에 id 값이 안 바뀌었다
# 즉 연산을 많이 하려면 가변형 Container를 사용하는 것이 좋다(재할당을 하지 않으므로)
3. sort vs sorted 함수와 reverse, key 인자
# sorted: 정렬 후 새로운 객체 반환
# sort: 정렬 후 객체 직접 변경(원본이 변경됨)
f_list = ['orange', 'apple', 'mango', 'lemon', 'strawberry', 'coconut']
# sorted 함수를 통해 새로운 객체를 반환받고 출력
print('sorted - ', sorted(f_list))
# print: sorted - ['apple', 'coconut', 'lemon', 'mango', 'orange', 'strawberry']
# 원본은 유지되는 것을 확인할 수 있음
print(f_list)
# print: ['orange', 'apple', 'mango', 'lemon', 'strawberry', 'coconut']
# sorted 함수에서 reverse 인자를 True로 바꿔서 역순으로 정렬할 수 있다.
print('sorted - ', sorted(f_list, reverse = True))
# print: sorted - ['strawberry', 'orange', 'mango', 'lemon', 'coconut', 'apple']
# key 인자를 len으로 바꿔서 길이 순으로 정렬할 수 있다. (단 reverse 인자가 더 뒤에 온다)
print('sorted - ', sorted(f_list, key = len, reverse = True))
# print: sorted - ['apple', 'mango', 'lemon', 'orange', 'coconut', 'strawberry']
# key 인자에 lambda 함수를 넣어줄 수 있다.
# 마지막 글자를 기준으로 정렬한 것
print('sorted - ', sorted(f_list, key = lambda x: x[-1]))
# print: sorted - ['orange', 'apple', 'lemon', 'mango', 'coconut', 'strawberry']
# sort: 정렬 후 객체 직접 변경
# 반환 값 확인(None)
# f_list.sort() 는 list를 반환하는 함수가 아니라, 따지고 보면 void 함수인 것이다. 따라서 반환값은 None
print('sort - ', f_list.sort(), f_list)
# print: sort - None ['apple', 'coconut', 'lemon', 'mango', 'orange', 'strawberry']
# reverse 인자도 가지고 있음
print('sort - ', f_list.sort(reverse = True), f_list)
# print: sort - None ['strawberry', 'orange', 'mango', 'lemon', 'coconut', 'apple']
# key 인자도 마찬가지로 가지고 있음
print('sort - ', f_list.sort(key = len), f_list)
# print: sort - None ['mango', 'lemon', 'apple', 'orange', 'coconut', 'strawberry']
# sorted에서 했던 마지막 예제
print('sort - ', f_list.sort(key = lambda x: x[-1], reverse = True), f_list)
# print: sort - None ['strawberry', 'coconut', 'mango', 'lemon', 'apple', 'orange']
List vs Array
List: 융통성, 다양한 자료형, 범용적 사용
Array: 숫자 기반(머신러닝, 고속연산)
Dict: json 형태의 파일