python (1) - 할당
01 Jul 2019 | python빅데이터 청년인재 Day 1
목차
- 식별자와 표현식
- 네임스페이스
- 메모리
- is와 ==
- type
- overflow
- 함수 사용 예시
- 부동소수
- bool
- container
- 용어정리
- 에러 정리
>>> import this
— python 철학 출력
>>> import antigravity
— site로 연결됨
>>> import keyword
>>> dir(keyword)
# 주피터 노트북에서는 아래처럼 나오고 인터프리터에서는 한 줄로 나옴.
['__all__',
'__builtins__',
'__cached__',
'__doc__',
'__file__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'iskeyword',
'kwlist',
'main']
- dir : 인자가 있으면, 현재 지역 스코프에 있는 이름들의 리스트를 돌려준다. 인자가 없으면, 현재 객체에 유효한 어트리뷰트의 리스트를 돌려주려고 시도한다. docs
언더바 두개 (__) 붙은거 : magin method, special method (어떤 연산을 실행할 때 묵시적으로 호출되는 메소드)
kw : keyword 줄임말
kwlist : keyword 리스트 보여줌
>>> keyword.kwlist
# 주피터 노트북에서는 아래처럼 나오고 인터프리터에서는 한 줄로 나옴.
['False',
'None',
'True',
'and',
'as',
'assert',
'async',
'await',
'break',
'class',
'continue',
...]
>>> len(keyword.kwlist)
35
1) 식별자와 표현식
a=1+2 (왼쪽 : 식별자 (identifier) / 오른쪽 : 표현식)
식 = 하나의 결과값으로 축약할 수 있는 것
ex) 1+2는 3으로 축약할 수 있음
>>> regolas = 1
>>> print(regolas)
1
식별자 선언 시
- 메모리에 공간 확보
- 그 메모리를 가르키는 공간 확보 (binding)
2. 네임스페이스
>>> a = 1
>>> b = 3 if a>0 else 5
>>> x
NameError
NameError : 정의되지 않은 언어를 출력할 때 에러 발생
%whos
어느 객체가 선언되었는지 네임스페이스를 보여준다.
%whos를 입력하였을 때 없는 객체를 입력하면 에러가 발생한다.
즉 네임 스페이스에 없는 객체를 선언할 때 NameError 발생
%who
%who_ls
3. 메모리
# 출력되는 output(주석)은 메모리 주소
>>> id(a)
443780512
>>> hex(id(a))
'0x108deb5a0'
>>> a=1000
>>> hex(id(a))
'0x10bd9c3f0'
>>> b=1000
>>> hex(id(b))
'0x10bd9c490'
# -5~256 사이에 있는 정수이면 똑같은 메모리를 가르킨다. (interning)
>>> a=10
>>> id(a)
4443780800
>>> b=10
>>> id(b)
4443780800
1) 재할당
기존 객체에 다른 값으로 바꾼다. 재할당하면 기본적으로 메모리 주소 또한 바뀐다.
>>> a=1000
>>> id(a)
4493790128
>>> a=1000
>>> id(a)
4493789552
아래의 예에서는 인터닝 때문에 메모리가 안 바뀐다. (그렇지만 파이썬 3.7부터는 인터닝 기법 바뀌었음)
>>> a=3
>>> id(a)
4443780576
>>> a=3
>>> id(a)
4443780576
2) mutable의 메모리 주소
>>> a=[2]
>>> id(a)
4494359304
>>> a.append(3)
>>> id(a)
4494359304
id는 주소 값에서 첫번째 주소를 가리킨다. 때문에 변한 것이 없어보이지만 실제로 할당량은 바뀌었다. C언어의 포인터 개념으로 생각하면 된다.
4. is와 ==
>>> a=10
>>> b=10
>>> a == b
True
>>> a is b
True #(is 연산자는 메모리까지 본다)
>>> a=1000
>>> b=1000
>>> a == b
True
>>> a is b
False #(메모리 주소가 달라서)
5. 타입
>>> a=1.
>>> type(a)
float
>>> a=.1
>>> type(a)
float
6. overflow
>>> import sys
>>> dir(sys)
>>> sys.maxsize
9223372036854775807
>>> 9223372036854775807+1
9223372036854775808
현대 프로그래밍 언어에서 overflow가 되는 언어는 적다. python 또한 overflow는 없지만 내부적으로 처리하는 속도는 급격히 떨어진다.
7. 함수 사용 예시
>>> a=-1
>>> dir(a) # a에 사용할 수 있는 함수들 출력됨
>>> a.__abs__
<method-wrapper '__abs__' of int object at 0x108deb560>
>>> a.__abs__()
1
>>> -1.__abs__()
SyntaxError : invalid syntax
.을 float로 생각하여 에러가 출력된다.
SyntaxError : 문법적으로 잘못 접근
>>> -1 .__abs__()
-1
>>> (-1).__abs__()
1 #(연산자 우선순위)
8. 부동소수
1) 부동소수점의 overflow
>>> sys.float_info #부동소수점에 대한 정보
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
2) 무한대
- 파이썬에는 무한대가 있고 무한대는 부동소수로 표현한다.
>>> x = float('inf')
>>> x = float('infinity')
>>> t=float('nan') # 파이썬에는 숫자가 아닌 것도 지정할 수 있다.
>>> t
nan
>>> a = float('inf')
>>> a == a+1
True # (무한대+무한대는 무한대이므로 주의!)
>>> a=1.7976931348623157e+308 # 부동소수점의 max값
>>> a+1
1.7976931348623157e+308
- 부동소수는 정확하게 구할 수 없다.
# output :
0.2
>>> 0.1+0.1+0.1
0.300000000004
-
무한대 개념은 float 타입
-
파이썬에서 복소수 표현은 j 사용
>>> a=3+2j >>> type(a) complex #(complex는 복소수 타입) >>> dir(a) # a에 사용할 수 있는 함수들 출력됨 >>> a.conjugate() 3-2j #(켤레복소수)
9. bool
>>> type(True) # output :
bool # (bool타입은 숫자)
>>> issubclass(bool, int)
True #(bool 타입은 int형에서 상속되었느냐)
>>> True+True
2
>>> True is 1
1
10. container
1) 문자열
>>> a='abc' # 한꺼번에 a,b,c를 남는다
>>> a[0]
'a'
>>> a[4]
IndexError
>>> a[1:3]
'bc' #(slice)
>>> a='abc'
>>> a[1:5]
'bc' #(slice는 범위를 벗어나도 에러가 발생하지 않는다.)
>>> a='반지의제왕'
>>> a[slice(0,2)]
'반지'
IndexError : 인덱스의 범위를 벗어날 때 발생
2) 리스트
안에 들어갈 수 있는 데이터 타입이 다양(헤테로) 하고 순서가 중요(시퀀스)하다.
>>> a = [1, 'a']
>>> a
[1, 'a']
>>> range(100)[50]
50
3) set
안에 들어갈 수 있는 데이터 타입이 다양(헤테로)하고 순서가 없다 (중복 X).
순서가 없으니 indexing, slicing 불가능하다.
>>> a={3,1,2}
>>> a
{1, 2, 3}
>>> a={3,1,2,1,1}
>>> a
{1, 2, 3}
>>> a=frozenset({3,1,2})
>>> a
frozenset({1, 2, 3})
용어 정리
-
mutable(가변) : 값을 변경할 수 있는 객체들
ex) list, set, dict 등
-
immutable(불변) : 값을 변경할 수 없는 객체들
ex) int, str, tuple, frozen set 등
-
호모지니어스 (Homogenous) : 안에 들어갈 데이터 타입이 같은 것
ex) str 삼총사, range 등
-
헤테로지니어스 (Heterogenous) : 안에 들어갈 데이터 타입이 다른 것
ex) set, list 등
-
시퀀스 타입 (sequence type) : 순서가 중요하다. indexing, slicing 가능
ex) list, str, tuple, bytes, range 등
-
순서 중요 X
ex) set, frozen set, dictionary 등
ex) 문자열 : 안에 들어갈 데이터 타입이 같고 순서가 중요하다. (homogenous한 sequence type)
ex) 리스트 : 안에 들어갈 데이터 타입이 여러가지이고 순서가 중요하다. (heterogenous한 sequence type)
에러 정리
- NameError : 정의되지 않은 언어를 출력할 때 에러 발생
Comments