본문 바로가기

Python

파이썬 중급 (Inflearn Original) 9편 - divmod 함수, 가변형 컨테이너와 불변형 컨테이너, sorted 와 sort의 차이


코드 내용과 출력 결과를 따로 작성하는 것보다는, 가독성을 높이기 위해서 주제별로 코드블럭을 나누고 코드 내에 주석으로 출력내용을 같이 담았습니다. 강의 내용을 자세히 적어, 천천히 읽어보면서 따라하면 강의 없이 코드블럭만 보고도 복습할 수 있도록 했습니다.


# 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 형태의 파일