본문 바로가기

부스트캠프 AI Tech 3기/이론 : U-stage

[Day2] Python 2-1. Variables : Variable & memory, List

Variable 

1. 변수 : Variables

값을 저장하기 위한 메모리 공간

a=5

5가 값, a가 메모리 공간의 이름이자 변수

변수는 메모리 주소를 가지고 있고, 값은 메모리 주소에 할당된다.

 

2. 변수 이름 작명법

  • 예약어 불가
  • 대소문자 구문
  • 의미 있는 단어로 표시  ex) aaa,axx 같은 것은 별로 좋지 않다
  • _, 영어 대소문자, 숫자 가능

3. 기본 자료형 : primitive data types

  • integer : 정수형 : 양의정수와 음의정수와 0 : 32bit
  • float : 실수형 : 소수점이 포함된 실수
  • string : 문자형 : ""이나 '' 로 묶인 문자
  • boolean : 참 또는 거짓 두 가지 값으로만 이루어짐 : a=True
a=True
type(a)

type() 으로 자료형을 알 수 있다

Dynamic Typing

코드를 실행하는 시점에 자료형을 결정하는 것

중간에 자료형을 바꾸는 과정이 편하다.

JAVA는 python과 달리 변수 선언시 자료형을 미리 쓴다.

 

데이터 형 변환

a=2
a=float(a)
# a에 float(a)로 다시 저장해 주어야 a가 float형으로 할당됨

b=2.4
b=int(b)
b
>>>2

소수점이 있는  float에 int()를 취해주면 소수점 내림이 적용된다.

4. 연산자 : operator

숫자뿐 아니라 문자도 피연산자가 될 수 있다.

  • +,- ,/(나누기), %(나머지), **(제곱)
  • 할당연산자 : 증가연산, 감소연산
    a=2
    # 1번 방법
    a=a+1
    # 2번 방법
    a+=1​
    
    #감소연산
    a-=3
    1번 방법과 2번 방법이 같다.
    /=, **= 등 도 가능하다

 

List

시퀀스 자료으로 여러 다른 자료형의 데이터들을 하나의 변수에 넣기 위한 데이터 구조이다.
그래서 다양한 data type이 하나의 list에 들어갈 수 있다.

 

1.  인덱싱 Indexing

: 특정 위치에 있는 값을 참조하는 것

list 의 값들은 주소(offset)을 가진다.

각 요소를 element라고 부른다

blood=['A','B','AB','O']
print(blood[2])

offset으로 각 element를 하나씩 불러서 사용할 수 있다.

-1은 끝에서 첫번째 값을 의미한다

blood[-2]
>>'AB'

 -를 사용하면 끝에 있는 값들을 사용하기 쉽다

 

보통이 주소를 index라고 부른다

2. 슬라이싱 : Slicing

: 일부 범위를 추출하는 것

blood[0:2]
>>['A','B']

list를 원하는 길이만큼 잘르는 것을 슬라이싱이라고 한다.

[시작값:끝값] 이라면 시작값~끝값-1 만큼의 부분을 슬라이싱한다.

 

blood[:-2]
>>['A','B']

 -를 사용해서 슬라이싱을 할 수 있다

blood[1:4:2]
>>>['B', 'O']

[시작 index, 끝 index, step]

step은 몇 개씩 띄고 슬라이싱할 것인지를 의미한다.

 

blood[::-1]
>>>['O', 'AB', 'B', 'A']

 비우면 처음과 끝이 자동으로 지정된다.

그래서 이 코드는 처음부터 끝까지 역으로 거꾸로 슬라이싱한다.

 

3. 리스트 연산

  • concatenation
    blood+blood
    >>>['A', 'B', 'AB', 'O', 'A', 'B', 'AB', 'O']
    blood*2
    >>>['A', 'B', 'AB', 'O', 'A', 'B', 'AB', 'O']​
  • is_in
    'A' in blood
    >>>True​
    blood라는 리스트에 'A'라는 elemen가 존재하기 때문에 True 반환
  • append
    리스트의 맨 끝에 element를 추가한다
    blood.append('A+')
    blood
    >>>['A', 'B', 'AB', 'O', 'A+']​
    blood=blood.append() 처럼 할당을 하지 않아도 저장됨에 주의하자
  • extend
    리스트의 끝에 리스트를 연장(추가)시킨다.
    blood.extend(['B+','B-'])
    blood
    >>>['A', 'B', 'AB', 'O', 'A+', 'B+', 'B-']​
  • remove
    blood.remove('A+')
    blood​
    >>>['A', 'B', 'AB', 'O', 'B+', 'B-']
    해당 값을 가진 element를 앞에서 부터 차례로 지워나간다.
    그래서 같은 값이 여러 개 있다면 앞에서 부터 없어진다

  • del
    del blood[2]
    blood​
    >>['A', 'B', 'O', 'B+', 'B-']
    2번 인덱스에 있던 'AB'값이 사라졌습니다.

4. 메모리 저장 방식

리스트 변수에는 리스트 주소값이 저장된다 

blood=['A','B','AB','O']
data=blood
blood[1]='B+'
blood
>>>['A', 'B+', 'AB', 'O']
data
>>>['A', 'B+', 'AB', 'O']

그래서 data=blood라고 하면 blood 주소값을 data주소값에 들어가게 되어서 두 리스트가 같은 주소에 연결된다.

그러한 이유로 blood[1]만 바꾸었지만 data도 blood의 값들을 가리키고 있기 때문에 두 리스트가 동시에 바뀐다.

이런 현상을 피하려면

data=blood[:]

처럼 전체를 슬라이싱해서 각 값들을 복사하면 된다.

또는

.copy()를 사용해서 list자체를 복사해도 된다. 하지만 이것은 이차원리스트부터는 작동하지 않는다.

또는

import copy
blood=['A','B','AB','O']
blood_copy=copy.deepcopy(blood)
blood_copy[1]='B-'
blood
>>['A', 'B', 'AB', 'O']

copy 모듈의 deepcopy를 사용해도 된다.

이 방법은 다차원 리스트에서 사용할 수 있다.

 5. 패킹과 언패킹

blood=['A','B','AB','O'] #패킹
kim, lee, park, choi=blood
print(kim, choi)
>>>A O

 blood라는 한 변수에 여러 데이터를 넣는 것을 패킹이라고 한다.

 그리고 리스트 각각 하나씩이 변수에 풀어서 저장되는 것을 언패킹이라고 한다.