본문 바로가기

Python

파이썬 중급 (Inflearn Original) 8편 - 지능형 리스트(Comprehending Lists), filter, map 함수의 차이점, Generator, 깊은 복사와 얕은 복사


코드 내용

# Chapter-04-01
# 시퀀스형
# 컨테이너(Container : 서로다른 자료형[List, tuple, collections.deque])
# 플랫(Flat : 한개의 자료형[str, bytes, bytearray, array.array, memoryview])
# 가변(list, bytearray, array, memoryview, deque)
# 불변(tuple, str, bytes)
# 리스트 및 튜플 고급

# 지능형 리스트(Comprehending Lists)
chars = '+_)(*&^%$#@!'
code_list1 = []

for s in chars:
    # 유니코드 리스트
    code_list1.append(ord(s))


print(code_list1)

# Comprehending Lists
code_list2 = [ord(s) for s in chars]

print(code_list2)


# Compreheding Lists + Map , Filter
code_list3 = [ord(s) for s in chars if ord(s) > 40]
print(code_list3)

code_list4 = list(filter(lambda x : x> 40, map(ord, chars)))
# filter는 두 개의 인자를 받는데, 하나는 '익명함수'이고, 나머지 하나는 list이다. 
# map과 비슷하지만, filter는 리스트의 길이가 줄어들 수 있음.
# map은 list 안의 요소들에게 같은 함수를 적용시켜서 새로운 list를 반환하는 함수이다. 
# 단, 무조건 같은 길이의 리스트가 반환됨.
print(code_list4)

print()
print()

# 전체출력
print(code_list1)
print(code_list2)
print(code_list3)
print(code_list4)
print([chr(s) for s in code_list1])            # ord 함수는 문자를 유니코드로, chr 함수는 유니코드를 문자로 바꿔주는 함수임.
print([chr(s) for s in code_list2])
print([chr(s) for s in code_list3])
print([chr(s) for s in code_list4])

print()
print()

# Generator? 다음번에 반환할 값을 가지고 있다. (강력한 Iterator이다.)
# 순환가능한 자료구조에서 dir(str) 을 하면 __iter__ 를 가지고 있는 것을 확인할 수 있다.
# Coroutine?


# Generator 생성
import array      #array 사용해보자

# Generator : 한 번에 한 개의 항목을 생성(메모리 유지x)
# 생성방법 : List Comprehension에서 대괄호를 소괄호로 바꿔주면 된디 [] -> ()

# tuple형 Generator
tuple_g = (ord(s) for s in chars)

# array형 Generator, array(타입, tuple형 Generator) << 이렇게 인자를 받는다.
array_g = array.array('I',(ord(s) for s in chars))

# Generator의 type 확인
print(type(tuple_g))
print(type(array_g))

# Generator가 가리키는 값는 next(generator) 또는 generator.__next__()로 반환할 수 있다.
print(next(tuple_g))
print(tuple_g.__next__())

print()
print()

# Generator 예제

# '%s' -> type이 문자열임을 선언. 
for s in ('%s' % c + str(n) for c in ['A', 'B', 'C', 'D'] for n in range(1,21)):
    print(s)



print()
print()

# 깊은 복사, 얕은 복사

marks1 = [['~'] * 3 for n in range(4)]
marks2 = [['~'] * 3] * 4
print(marks1)
print(marks2)

# 차이점이 뭘까?

# 수정
marks1[0][1] = 'X'
marks2[0][1] = 'X'
print(marks1)                   # [['~', 'X', '~'], ['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]
print(marks2)                   # [['~', 'X', '~'], ['~', 'X', '~'], ['~', 'X', '~'], ['~', 'X', '~']]
# 즉, marks1에서는 각각 모두 다른 주소값을 가지고 있지만, marks2는 세 개의 주소값이 네 개로 복사된 것이다.

# 증명
print([id(i) for i in marks1])  # [2619073677832, 2619073677768, 2619073677640, 2619073677576]
print([id(i) for i in marks2])  # [2619073677512, 2619073677512, 2619073677512, 2619073677512]

출력 결과

PS C:\Users\82107\Desktop\파이썬중급강의\p_study>  cd 'c:\Users\82107\Desktop\파이썬중급강의\p_study'; & 'C:\Users\82107\AppData\Local\Programs\Python\Python37\python.exe' 'c:\Users\82107\.vscode\extensions\ms-python.python-2020.5.80290\pythonFiles\lib\python\debugpy\wheels\debugpy\launcher' '58364' '--' 'c:\Users\82107\Desktop\파이썬중급강의\p_study\chapter04_01.py' 
[43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33]
[43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33]
[43, 95, 41, 42, 94, 64]
[43, 95, 41, 42, 94, 64]


[43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33]
[43, 95, 41, 40, 42, 38, 94, 37, 36, 35, 64, 33]
[43, 95, 41, 42, 94, 64]
[43, 95, 41, 42, 94, 64]
['+', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!']
['+', '_', ')', '(', '*', '&', '^', '%', '$', '#', '@', '!']
['+', '_', ')', '*', '^', '@']
['+', '_', ')', '*', '^', '@']


<class 'generator'>
<class 'array.array'>
43
95


A1
A2
A3
A4
A5
A6
A7
A8
A9
A10
A11
A12
A13
A14
A15
A16
A17
A18
A19
A20
B1
B2
B3
B4
B5
B6
B7
B8
B9
B10
B11
B12
B13
B14
B15
B16
B17
B18
B19
B20
C1
C2
C3
C4
C5
C6
C7
C8
C9
C10
C11
C12
C13
C14
C15
C16
C17
C18
C19
C20
D1
D2
D3
D4
D5
D6
D7
D8
D9
D10
D11
D12
D13
D14
D15
D16
D17
D18
D19
D20


[['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]
[['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]
[['~', 'X', '~'], ['~', '~', '~'], ['~', '~', '~'], ['~', '~', '~']]
[['~', 'X', '~'], ['~', 'X', '~'], ['~', 'X', '~'], ['~', 'X', '~']]
[2619073677832, 2619073677768, 2619073677640, 2619073677576]
[2619073677512, 2619073677512, 2619073677512, 2619073677512]
PS C:\Users\82107\Desktop\파이썬중급강의\p_study>