I'm Electronic Engineer :)

[Do it] 점프 투 파이썬 - 02일차 본문

Study code & programming/Python

[Do it] 점프 투 파이썬 - 02일차

Lu175 2019. 8. 3. 01:53

 

 

 

02일차.pdf
0.51MB

 

 

 

1. 기본 내용

 

 

공부 날짜: 201982()

 

 

 

2. 스터디 내용

 

 

공부 범위:

 

1장 파이썬이란 무엇인가?

2장 파이썬 프로그래밍의 기초, 자료형

3장 프로그램의 구조를 쌓는다! 제어문

4장 프로그램의 입력과 출력은 어떻게 해야 할까?

5장 파이썬 날개 달기

6장 파이썬 프로그래밍, 어떻게 시작해야 할까?

7장 정규 표현식

 

 

공부 내용:

 

2-4     튜플 자료형

 

--- 튜플은 ‘( )’로 둘러싸며 요솟값을 삭제, 수정이 불가능하다.

 

           삭제하거나 수정하려 하면 ‘TypeError’가 발생한다.

           1개의 요소만을 가질 때는 요소 뒤에 콤마( , )를 꼭 붙여야 한다.

 

--- 값이 변하지 않길 바란다면 튜플을 사용하자.

 

--- 값의 변화를 허용하지 않는 것 빼고는 리스트와 비슷하다.

 

           Indexing, Slicing, 연산 ( +, * ), len() 함수 모두 사용 가능하다.

 

--- 나 혼자 코딩! (p87)

 

 

2-5     딕셔너리 자료형

 

--- 딕셔너리는 대응 관계를 나타낼 수 있는 자료형.

 

--- (Key : Value) 쌍을 가지며, Key를 통해서 Value를 찾는다.

 

--- Key는 변하지 않는 값을 사용한다.

 

           따라서 Key에는 리스트를 사용할 수 없다. 튜플은 사용 가능하다.

           딕셔너리도 Key로 사용 불가능하다.

 

--- Value는 변하는 값, 변하지 않는 값 모두 사용 가능하다.

 

--- 딕셔너리 사용하기

 

--- 딕셔너리에 중복된 Key가 존재한다면 1개를 제외한 나머지 Key들은 무시된다.

 

--- 딕셔너리 관련 함수

 

           keys() 함수는 딕셔너리의 Key들을 모아서 dict_keys 객체로 반환한다.

 

          이 dict_keys 객체는 리스트를 사용하는 것과 차이는 없지만

          리스트 고유의 함수(append, insert, pop, remove, sort)는 사용할 수 없다.

 

           list() 함수를 이용해서 dict_keys 객체를 리스트로 바꿀 수 있다.

           values() 함수는 딕셔너리의 Vlaue들을 모아서 dict_valyes 객체로 반환한다.

           items() 함수는 딕셔너리의 Key Value 쌍을 튜플로 묶어서 dict_items 객체로 반환한다.

           clear() 함수로 딕셔너리의 모든 요소를 없앨 수 있다.

           dict() 함수로 비어 있는 딕셔너리를 만들 수 있다.

           get() 함수에 Key를 넣으면 Value를 얻을 수 있다.

           dic[‘hi’]를 입력하면 Error가 나는 반면에 dic.get(‘hi’)None이 반환된다.

           get(‘Key’, 기본 값) 형태도 유용하다.

 

           ‘in’을 사용하면 딕셔너리에 Key가 존재하는지 여부를 알 수 있다.

 

--- 나 혼자 코딩! (p96)

 

 

2-6     집합 자료형

 

--- 집합은 set 키워드로 만들 수 있다.

 

           집합은 중복을 허용하지 않으며, 순서가 없다.

 

--- Ordered 자료형: 리스트, 튜플    -> (Indexing 가능)

 

--- Unordered 자료형: 딕셔너리, 집합    -> (Indexing 불가능)

 

--- 교집합 ( & ), 합집합 ( | ), 차집합 ( - ) 구하기

 

--- 집합 자료형 관련 함수

 

 

2-7     불 자료형

 

--- (True), 거짓(False)을 나타내는 자료형

 

           조건문의 반환 값으로 사용되기도 한다.

 

--- 자료형의 참, 거짓

 

           문자열, 리스트, 튜플, 딕셔너리, 집합은 비어 있으면 False이고 채워져 있으면 True이다.

           ‘숫자형0이면 Flase이고 0이 아닌 숫자는 True이다.

           ‘None’은 거짓이다.

           위의 사진은 리스트의 참, 거짓 사용의 예시이다.

 

--- 불 연산

 

 

2-8     자료형의 값을 저장하는 공간, 변수

 

--- CJAVA와는 다르게 Python은 변수에 저장된 값을 스스로 판단하여 자료형을 지정한다.

 

--- 변수는 값이 저장된 메모리의 주소를 가리킨다.

 

           id() 함수로 메모리의 주소를 알 수 있다.

           is 키워드로 같은 객체를 가리키는지 알 수 있다.

           위와 같이 같은 객체를 가지고 있다면 a를 변경했을 때 b, c의 값도 변경되기 때문에

           상황에 따라 문제가 발생할 수 있다.

 

--- 값을 복사하여 다른 객체로 만들기

 

           Slicing 하거나 copy 모듈을 사용하면 다른 객체로 값을 복사할 수 있다.

           (문제 발생 !)

           (뒤쪽에 발생한 문제를 자세히 다룸.)

 

--- 변수를 만드는 여러가지 방법

 

           튜플로 값을 대입할 수 있다.                                         (a, b)

           리스트를 변수로 만들 수 있다.                                      (c, d)

           여러 개의 변수를 대입할 수 있다.                                  (e, f)

           swap함수를 사용하지 않고 두 변수의 값을 바꿀 수 있다.    (a, b)

 

--- 나 혼자 코딩 (p111)

 

           리스트는 Mutable한 객체이므로 위와 같이 두 변수에 같은 리스트를 할당하면

           다른 메모리 주소를 가져야만 한다.

 

           반면 문자열은 Immutable한 객체이므로 같은 문자열을 두 변수에 할당하면

           서로 같은 메모리 주소를 갖는다.

 

 

 

3. 스터디 후기

 

스터디 도중 발생한 문제, 어려웠던 점을 어떻게 해결했는지?

 

발생한 문제

 

--- 문자열을 Slicing 해서 값을 다른 변수에 복사했더니 원래 변수와 같은 메모리 주소를 가진다

 

--- 리스트를 Slicing 해서 다른 변수에 복사했더니 리스트 주소는 다른데 요소는 같은 주소이다

 

 

문제를 위한 공부

 

--- 재할당

 

           변수의 값을 재할당하게 되면 변수의 메모리 주소가 바뀐다.

           리스트의 요소의 값을 재할당하면 재할당한 요소만 메모리 주소가 바뀐다.

 

 --- Mutable(가변) 객체와 Immutable(불변) 객체

 

--- 얕은 복사와 깊은 복사

 

           얕은 복사는 메모리 주소를 공유하고 있는 형태의 복사이다.

           ab가 같은 객체를 가리키기 때문에 a리스트의 요소를 수정하면

           b리스트에서 가리키는 객체도 변하는 것이므로 a, b 리스트 둘 다 변한다.

           (사실상 a, b는 동일하다.)

 

           b = a[:] 와 같이 Slicing으로 복사하는 방법은 a리스트를 수정했을 때

           a, b리스트가 동시에 변경되는 문제를 해결해준다.

 

           그러나 b = a[:] 와 같이 Slicing으로 복사하는 방법도 얕은 복사이다.

           내부 객체 (객체 안의 객체)를 새롭게 copy하지 못하기 때문이다.

           그래서 a, b 리스트는 서로 다른 주소를 갖지만 요소는 서로 같은 주소를 갖는다.

 

           위와 같은 이유로 mutable 객체 안의 mutable 객체가 있는 상황에서는

           b = a[:]에 의해서 얕은 복사가 된다.

 

           mutable 객체 안의 mutable 객체도 새롭게 copy하려면 깊은 복사를 사용해야한다.

 

 

 

참고한 페이지: https://wikidocs.net/16038

 

 

문제 해결

 

--- 문자열을 Slicing 해서 값을 다른 변수에 복사했더니 원래 변수와 같은 메모리 주소를 가진다

 

           >>> 애초에 string은 불변 객체이므로 수정할 수 없다. 따라서 메모리 주소가 다를 필요가 없기 때문에

                  메모리 최적화를 위해 같은 문자열은 같은 메모리 주소를 공유하도록 한 것 같다.

                  확인해보지 않았지만 다른 Immutable 객체도 같을 것으로 보인다.

 

--- 리스트를 Slicing 해서 다른 변수에 복사했더니 리스트 주소는 다른데 요소는 같은 주소이다

 

           >>> 여기서 요소는 int 자료형을 갖으며, Immutable하다. 따라서 첫번째 문제와 같이 변하지 않는 객체에

                  대해서 같은 메모리 주소를 할당하는 것은 메모리 관리 측면에서 합리적이라고 생각한다.

 

 

간단한 소감

Mutable 객체와 Immutable 객체에 대해서 알게 되었고, 얕은 복사와 깊은 복사의 예제를 보았다.

 

 

다음 스터디 예정일

201983()