파이썬을 공부해봅니다_4

파이썬의 기초과정
https://steemit.com/kufmba/@grooveflow/1

파이썬 구조 또는 명령어 익히기 시작
https://steemit.com/kufmba/@grooveflow/2

파이썬 Data type 의 이해
https://steemit.com/kufmba/@grooveflow/3

에 이어서 계속해 봅니다.
(Lecture Note의 31페이지입니다.)

Dictionary를 공부해봅니다.
딕셔너리는 Key와 Value를 한쌍으로 갖는 자료형(Data type)입니다.
사전으로 생각해보면 쉽습니다.
Key가 "baseball"이면 "value"는 야구입니다.

가장 기본적인 딕셔너리 구조를 보겠습니다.

{Key1:Value1, Key2:Value2, Key3:Value3 ...}

이런식이죠.
만약에 dic이라는 변수에 {'Tom' : 23, 'Saint' : 38, 'Stone' : 40} 를 집어넣어보겠습니다.

> dic= {'Tom' : 23, 'Saint' : 38, 'Stone' : 40}
> dic['Tom']    #dic에서 Tom의 값은?



23이 결과값으로 나오며, 변수 상태창에도 type은 dic, size는 3으로 되있음을 확인할 수 있습니다.
또한 dic라는 변수에 추가 입력도 가능합니다.

> dic['Woo']=29    #dic에 'Woo'(의 value는 29)를 추가


이렇게 입력하였더니

변수 상태 창에 'Woo' : 29 가 추가되었고, size도 4개로 됨을알 수 있습니다.

이번엔 dic의 개수를 구해봅니다.size 값이 나와야겠죠.

> len(dic)

dic 내의 items 구성요소들을 불러오고, key들만 불러오고, value들만 불러오고,구성요소들을 모두 clear도 해봅니다.

> dic.items()    #dic의 모든 items
> dic.keys()    #dic의 모든 key들
> dic.values()    #dic의 모든 value들

> dic.clear()   #dic의 모든 내용 clear


dic이라는 껍데기만 남고 구성요소가 모두 사라졌습니다.

dic에 다른 dictionary의 구성요소를 더할 수 도 있습니다.
만약 a라는 변수가 있고, 그 변수의 내용을 변수 dic에 update 해봅니다.
아. 먼저 dic 내의 변수들을 다시 집어넣고..(아무것도 없으면 업데이트인지, change 인지 구분안되므로)


> a={'Yeon':40, 'Kim':38}    #a라는 변수에 'Yeon':40, 'Kim':38 을 입력


> dic.update(a)    #dic의 모든 내용에 a를 업데이트, a도 dictionary이면 가능


dic 내의 구성요소를 하나씩 삭제할 수 도 있습니다.

> del dic['Tom']    #dic 내의 Tom을 삭제하라


실행하면

dic이라는 변수 내에 Tom이라는 Key가 value(23)와 함께 사라졌음을 볼 수 있습니다.

dic을 통으로 삭제하는 것도 가능합니다.

> del dic


실행하면

dic의 구성요소는 물론 dic 변수 자체가 지워짐을 볼 수 있습니다.

이번에는 Turple을 공부해봅니다.
본문의 33페이지입니다.

튜플은 몇가지 점을 제외하고는 리스트와 유사합니다.
먼저 표기하는 법
List는 []로 표기하지만 Turple은 ()로 둘러쌉니다. ()로 둘러싸지 않아도 됩니다.
다음을 직접 실행해봅니다.

> a=[1,2,3,4]    #a라는 변수에 []를 사용하여 구성요소 넣기 = list
> b=(1,2,3,4)    #b라는 변수에 ()를 사용하여 구성요소 넣기 = turple
> c=1,2,3,4    #a라는 변수에 괄호 없이 구성요소 넣기 = turple


변수 상태창을 확인해 봅니다.

리스트와 튜플은 서로 변환이 됩니다.

> d=tuple(a)
> e=list(b)


변수 상태창을 보면

와 같이 변환되었음을 알 수 있습니다.

'python'이라는 문구를 리스트와 튜플화 해보면

> f=list('python')
> g=tuple('python')



역시나 유사한 형태를 띠고 있음을 알 수 있습니다.

이렇게 유사한테 왜 리스트와 튜플이라는 별개의 type이 존재할까요?
튜플은 리드온리입니다. 수정 및 삭제가 어렵습니다.
그래서 혹여 데이터 작업을 하는 중에 변수에 영향을 미치진 않을지 고민되면 튜플을 사용합니다.
어떤 의미인지 좀 더 들여보겠습니다.
위의 변수 f와 g를 예로 들어서

> del f[0]    #f의 0번 인덱스(첫번째) 값을 삭제
> del g[0]    #g의 0번 인덱스(첫번째) 값을 삭제

하면

리스트인 f는 0번 인덱스 값인 P의 삭제를 실행했습니다.
튜플인 g는 0번 인덱스 값의 삭제 명령을 에러처리했습니다.
변수 창을 보면 다음과 같은 결과를 볼 수 있습니다.

변수 f의 0번 인덱스인 p가 삭제되었습니다. g는 변화가 없구요.

구성요소의 변경도 리스트는 가능하나, 튜플은 에러처리납니다.
다시 f와 g에서(f는 f=list('python') 재실행합니다) 0번 인덱스의 값을 q로 바꾸는 명령을 해보겠습니다.

> f[0]='q'    #f의 0번 인덱스에 q를 입력
> g[0]='q'    #g의 0번 인덱스에 q를 입력


리스트인 f는 실행이 되고, 튜플인 g는 에러메세지가 뜹니다.
변수상태 창을 보니

리스트는 바뀌었으나, 튜플은 그대로인 것을 알 수 있습니다.

따라서 프로그램이 실행되는 동안 그 값이 항상 변하지 않기를 바란다거나 값이 바뀔까 걱정하고싶지 않다면 주저하지 말고 튜플을 사용해야 하며, 이와 반대로 수시로 그 값을 변화시켜야할 경우라면 리스트를 사용해야 합니다. 실제 프로그램에서는 값이 변경되는 형태의 변수가 훨씬 많기 때문에 평균적으로 튜플보다는 리스트를 더 많이 사용하게 된다고 합니다.

다음은 set(집합)를 공부해봅니다. 드디어 Datatype(자료형)의 마지막입니다.

집합은 중복을 허용하지 않으며, 순서도 없습니다.
그래서 HELLO를 입력해도 HELO만 저장되며, 순서가 없기 때문에 인덱싱으로 값을 얻을 수 도 없습니다.
직접 실행해보며 무슨 내용인지 이해해보겠습니다.

다음을 입력해봅니다.

> a=[1,1,2,2,2,3]
> b=set(a)


변수상태창을 보니 의외의 결과가 나와있습니다.

b가 없습니다.

왜 없을까요? 있긴 합니다. 단, Default로 지원하지 않습니다.

오른쪽 끝 위의 톱니바퀴를 클릭하면 1,2,4번째 항목이 체크가 되어있습니다.
4번의 체크를 풀어보세요.

그리고 변수상태창을 봅니다.

표시되네요.
지금까지와는 달리, 구성요소가 표시되지 않고 'set object of builtins module'라고 표시됩니다.
내장모듈의 집합 객체라고 해석됩니다만...의미가 확 와닿지 않습니다.
좀 더 배우면 이해할 수 있을까요.
일단 이 상태로 set(집합)을 공부해보겠습니다.

실행창에 b를 입력하면?

a에 1을 2개, 2를 3개, 3을 1개 입력했는데 그걸 set화한 b는 {1,2,3}의 변수가 각 1개씩만 노출됩니다.
즉 중복을 허용하지 않습니다.

조금전 a={1,2,3}이었습니다. 구성요소를 더해봅니다.

> a.add(4)    #a에 4를 더함

a는 어떤 집합이 될까요?

a에 4라는 구성요소가 추가되었습니다.
그렇다면 만약 a.add(3)를 하면 어떻게 될까요? 3이 두개? 중복을 허용하지 않으므로 한 개?

네. a에 이미 들어있는 값을 추가하면 갯수가 늘진 않습니다.

집합에는 이런 명령어도 사용가능합니다.
a={1,2,3}
b={3.4}라고 입력 후

> a.intersection(b)    #a와 b의 교집합
> a.difference(b)    #a와 b의 차집합
> a.union(b)    #a와 b의 합집합
> b.issubset(a)   #b는 a의 부분집합인가
> a.update(b)    #a를 b로 업데이트

를 실행해보면

와 같이 교집합, 차집합, 합집합, 부분집합, 업데이트 등으로 사용됨을 알 수 있습니다.

자 이제 데이터 타입은 모두 정리 되었고, 이들 객체들을 복사하는 기능에 대해 보겠습니다.

> a=1    #a에 1을 입력
> b=a    #b는 a와 같음
> id(a)     #a의 id는?
> id(b)     #b의 id는?
> id(a)==id(b)    #a의 id와 b의 id는 같은가

객체와 id라는 용어가 생소할 수 있어서 잠시 정리하자면
(사실 처음의 처음인 파이썬이란 무엇인가...등의 개론 때 배우고는 흘리는 내용입니다만;;)
객체 (Objects)는 파이썬이 데이터(data)를 추상화한 것(abstraction)입니다. 파이썬 프로그램의 모든 데이터는 객체나 객체 간의 관계로 표현됩니다.모든 객체는 아이덴티티(identity), 유형(type), 값(value)을 갖습니다. 객체의 ID(아이덴티티)는 고유번호를 의미하며 컴퓨터 메모리 상의 저장 위치입니다.

a는 변수입니다. 1이라는 객체를 담는 변수입니다. 객체1은 ID, 유형, 값이 있습니다

다시 위의 내용을 실행시키면

"아. 객체 1을 넣은 a(변수)를 복사한 b(변수)는 서로의 id가 같구나"를 알 수 있습니다.
그렇다면 궁금해집니다. 변수에 대입하지 않은 객체 1의 ID 또한 저 값과 같을까?

같네요.
위에서는 숫자만 복사를 해보았고, 다른 타입도 복사해보겠습니다.

> a=[1,2,3];b=a;
> id(a)
> id(b)
> id(a)==id(b)


변수 a에 객체 1,2,3을 []로 묶어서 (list 1,2,3으로) 넣고 변수 b는 a와 같다고 처리한 후
id를 비교하면 서로 같은 값이 나옵니다.

> a=[4,5,6];b=a
> b[0]=5
> a[0]==5


변수 a에 객체 4,5,6을 넣고 b의 0번째 인덱스를 5로 바꾸면 a의 0번째 인덱스 또한 5로 바뀝니다.

> a=[6,7,8]
> b=a.copy()
> id(a)==id(b)


이건 좀 다르죠? 변수 a에 객체[리스트 6,7,8]이 입력되어있는데 변수 a의 내용을 b에 카피해오는 것입니다.
그렇게 되면 같은 내용을 가졌지만 서로의 id는 다르다고 나옵니다.

왜 그렇지? 숫자 1이라는 객체는 다른 변수에 넣어도 id가 같다고 나오는데?
다음을 봅시다.

아. 리스트는 구성요소가 같더라도 완전히 변수를 통일하지 않는 이상 각자가 다른 id를 갖게 되는군요.

만약 리스트가 아닌 튜플로 하게 될 경우는 어떨까요?

> a=(6,7,8)    #변수 a에 객체 6,7,8을 튜플 형태로 입력
> id(a)     #a의 id는?
> b=a.copy()     #a의 속성을 b에 복사


튜플은 copy가 안되니 직접 b를 같은 방식으로 만들어 비교해보겠습니다.

> b=(6,7,8)    #변수 b에 객체 6,7,8을 튜플 형태로 입력
> id(b)     #b의 id는?


아. 튜플로 하여도 같은 구성요소를 가진 a와 b의 ID가 서로 다름을 알 수 있습니다.

정리하자면, 객체가 단일 값인 경우에는 서로 다른 변수를 사용하여도 ID가 같지만
객체가 두개 이상의 값의 조합인 경우에는 구성요소를 같이 한다고 해도 ID는 다르게 됩니다.

여기까지 하고 연습문제를 풀어보겠습니다.
다음 노래의 가사를 봅니다.

lyrics = """Love, love, love
Love, love, love
Love, love, love

There's nothing you can do that can't be done
Nothing you can sing that can't be sung
Nothing you can say but you can learn how to play the game
It's easy

Nothing you can make that can't be made
No one you can save that can't be saved
Nothing you can do but you can learn how to be you in time
It's easy

All you need is love
All you need is love
All you need is love, love
Love is all you need"""

#(1) lyrics의 길이는?( 몇글자인가)
> len(lyrics)

#(2) lyrics의 내용을 전부 소문자로 바꾸기
> lyrics.lower()

#(3) 단어가 몇개인가
> a=lyrics.split()
> len(a)

#(4) love가 몇 개 들어가나
> b=lyrics.split('ove')    #L의 대소문자 구별대신 ove로 구분하여 쪼갬
> len(b)-1    #ove를 중심으로 문장이 쪼개지므로 총 갯수에서 1개를 빼야 함 
 # 또는
> lyrics.count('love')+lyrics.count('Love')    #Love와 love 의 갯수를 구해서 더함

#(5) o가 몇 개 들어가나
> c=lyrics.split('o')     #'o'를 중심으로 문장을 쪼갬
> len(c)-1      #'o'를 중심으로 문장이 쪼개지므로 총 갯수에서 1개를 빼야 함
 # 또는
> lyrics.count('o')    #'o'의 갯수를 구함

#(6)   love와 money를 바꾸어 새로운 string을 만드시오
Love는 Money로 love는 money로 바꾸어야 하므로
> K=lyrics.replace('Love','Money')
> L=K.replace('love','money')
> print(L)

정말 간단한 연습문제를 푸는데도 기억이 나질 않아서 더듬더듬 찾아서 해결했습니다.
다음시간에는 Function과 조건문을 공부하겠습니다.

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now
Logo
Center