본문 바로가기
컴퓨터 사이언스/TIL 정리

[프론트엔드][파이썬] TIL Day-31

by 메리뉴데이 2022. 5. 14.

깊은 복사(deepcopy) 방법

① list()로 리스트 객체 생성

② import copy한 뒤, deepcopy() 메소드로 깊은 복사

 

 

슬라이싱(slicing)

한 번에 여러 개의 항목을 추출하며, 원래의 리스트를 손상시키지 않고 새로운 리스트가 생성되어 반환되게 한다.

첫 번째 인덱스를 생략하면 무조건 리스트의 처음부터를 의미한다. 또한 두 번째 인덱스가 생략되면 리스트의 끝까지를 의미한다.

둘다 생략되고 콜론만 존재하면 처음부터 끝까지를 의미하며, 이것은 객체의 주소가 달라져 깊은 복사처럼 보이지만,  리스트 안의 리스트는 주소가 달라지지 않는 것을 보아 결국 얕은 복사로 보는 것이 맞겠다.

 

 

함수로 인수를 전달하는 방식

; 파이썬에서는 객체의 종류에 따라서, 즉 변경이 불가능한 객체이냐 아니면 변경이 가능한 객체이냐에 따라 호출방식이 자동적으로 다르게 결정된다.

 변경이 불가능한 객체는 int, float, str, tuple 등의 단일값이거나 정적인(static) 속성을 지닌 것을 말하며, 값으로 호출된다.

 변경이 가능한 객체는 list, dict, set 등으로 추후에 변경이 가능한 것을 말하며, 참조로 호출된다.

 

값으로 호출하기(Call-by-Value) : 함수가 인수를 받을 때, 변수에 담긴 인수 값 자체를 복사해서 함수의 매개변수로 넘겨준다. 즉, 전달받은, 인수값을 담은 변수는 인수값 자체(주소값)가 아니라, 인수값(주소값)의 또다른 복사 값이기 때문에, 함수 내에서 해당 인수의 변수를 바꾸었다고 해도 원본 변수는 변하지 않는다. 원래의 값이 건드려지지 않고 보존된다. 단, 복사로 인한 메모리 사용량의 증가가 있을 수 있다.  

참조로 호출하기(Call-by-Reference) : 인수 값으로 인수의 변수가 가리키는 주소 값을 전달한다. 이 때의 인수값을 담은 변수는 변수의 주소값이기 때문에, 함수 내에서 해당 인수를 조작하면, 원래 변수의 주소 값이기 때문에 해당 값 자체가 바껴버린다. 이때, 주소값이 복사되는 것이 아니고, 직접 참조하기 때문에 빠르다는 장점이 있으나, 원래의 값이 영향을 받아 뜻하지 않은 문제가 야기될 수도 

 

 

리스트 함축(list comprehensions)

파이썬 만의 특이한 문법이다. 리스트 함축은 집합의 정의와 유사하다. 

형식 : [수식 for (변수 in 리스트) if (조건) ]
ex) squares = [ x**2 for x in range(10) if x % 2 == 0 ]
cf) 일반 반복 루프로 만들어 비교해 보면,
    squares = [ ]
    for x in range(10) :
            if x % 2 == 0 :
                    square.append(x**2)

 

그 외, 다양한 리스트 함축 형태가 있다.

 

 

 

<위 파일의 실행 화면>

 

 

[프로그래밍 문제 풀어보기]

<위 파일의 실행 화면>

 

<위 파일의 실행 화면>

 

 

파이썬의 자료구조

가장 기초적인 자료구조는 시퀀스(sequence)이고, 이 시퀀스는 요소(element)로 구성되어 있고 요소 간에 순서가 잇어 번호를 부여받는다. 이들 번호를 인덱스라고 한다. 6개의 내장 시퀀스(str, bytes, bytearray, list, tuple, range)를 가지고 있다.

시퀀스에 속하는 자료 구조들은 인덱싱, 슬라이싱, 덧셈 연산, 곱셈 연산 등의 동일한 연산을 지원한다.

이에 더해 내장 함수인 len(), max(), min() 등을 사용하기도 한다. 

 

 

튜플

튜플은 리스트와 유사하지만, 리스트와 다르게 튜플은 변경이 불가능하다.

형식 : 튜플 이름 = (항목1, 항목2, ...)               
ex) fruits = ( )       ... 공백 튜플 생성
       fruits = ('apple', 'banana', 'grape')       ... 3개의 항목을 가진, 초기값을 가진 튜플 생성
       result = fruits[1]        ... 인덱스를 사용하여 요소에 접근한다.(banana에 접근)    but, 변경은 불가하다.                                  

 

괄호없이 항목들을 쉼표로만 분리하여도 자동으로 튜플이 생성된다.

ex) fruits = 'apple', 'banana', 'grape'

다만, 요소가 하나뿐인 튜플을 만들 때는 요소의 끝에 반드시 쉼표를 추가하여야 한다. 

ex) singleTuple = ('apple',) 

 

튜플도 반복 루프를 이용하여 요소를 하나씩 처리할 수 있다. 

fruits = ('apple', 'banana', 'grape', 'pear', 'cherry')

for f in fruits :

    print(f +'s', end=' ')

<위 파일 실행 화면>

 

 

 

tuple() 함수list() 함수

튜플과 리스트는 tuple() 함수와 list() 함수를 사용하여 서로의 자료구조로 변환할 수 있다.

                                             생성 함수

 

 

튜플의 += 연산자

튜플은 한 번 생성되면 요소를 추가하거나, 변경, 삭제할 수 없다.

하지만, +=연산자를 사용하여 기존의 튜플에 다른 튜플을 더 추가하는 것은 가능하다.

이 때, 기존의 튜플이 추가된 형태로 변경되는 것은 아니고, 추가된 형태로 새로운 튜플이 생성되어 반환되는 것이다.

그리고, 튜플 안의 리스트는 변경이 가능하다.

 

+=연산자를 이용하여 튜플을 리스트에 추가하는 것은 가능하고, 리스트에 튜플을 추가한 후 타입을 확인해보니 리스트임을 확인할 수 있었다.

 

 

튜플 패킹(packing)과 언패킹(unpacking)

여러 개의 항목을 가지는 하나의 튜플을 생성하는 것을 튜플 패킹이라고도 한다. 여러 개의 데이터(항목)들이 하나의 변수(튜플이름) 안으로 압축되는 느낌이다. ex) t = ('apple', 'banana', 'coconut')

이와 반대로 하나의 튜플 안에 저장된 데이터를 풀어서 개별 변수에 저장할 수도 있는데, 이것은 튜플 언패킹이라고 한다. 

ex) (s1, s2, s3) = t        ... t라는 튜플 안에 각각의 항목(데이터)이 변수 s1, s2, s3에 각각 저장되게 된다.

 

이 때, 서로 다른 자료형에 대해서도 패킹과 언패킹이 가능하다.

 

패킹과 언패킹을 이용하여 데이터의 순서를 바꾸기도 한다. 

 

 

enumerate() 함수 

for 문을 리스트에 사용하면 리스트의 요소들을 하나씩 접근해 처리할 수 있었는데, 이때 리스트 요소의 인덱스 값이 필요한 경우에는 enumerate() 함수를 사용하면 인덱스 값과 요소 값 모두에 접근할 수 있고, 각 요소에 대해 (인덱스 값, 요소 값) 형태의 튜플을 반환한다. enumerate() 함수는 리스트에서도, 튜플에서도 사용 가능하다.

enumerate() 함수가 반환하는 결과가 튜플을 반환하는 것을 볼 수 있다. 반환 결과를 리스트에 저장한 후 출력하기도 하고, 튜플에 저장한 후 출력해보기도 하였다.

 

 

튜플의 장점

- 튜플은 리스트와 달리 변경 불가능한 객체이기 때문에, 처리 코드가 간단해지고, 리스트를 통하여 반복하는 것보다 튜플을 통하여 반복하는 것이 더 빠르다. 

- 딕셔너리의 키는 변경 불가능해야 하는데, 이때 튜플을 이용할 수 있다. 

- 튜플의 특성 때문에, 변경을 원하지 않는 특정 데이터에는 튜플을 사용하면 된다. 

 

참고로, 튜플은 약 33개의 메소드를 지원하고, 리스트는 약 46개의 메소드를 지원한다.