python 자료형의 분류


 자료형

저장 모델 

변경 가능성 

접근 방법 

수치 형 

리터럴(scalar) 

불가 

직접 

문자열 

리터럴 

불가 

시퀀스 

튜플 

저장 

불가

시퀀스 

리스트 

저장 

가능 

시퀀스 

사전 

저장 

가능 

매핑(mapping) 






















자료형들을 구분하는 또 다른 중요한 구분 기준.

- 자료 값을 변경할 수 있는가? 이다.


변경할 수 있는 자료형을 '변경 가능하다(Mutable)' 고 하고, 그렇지 않은 자료형을 '변경 가능하지 않다(Immutable)' 고 한다. 


변경 가능한 자료형 - 리스트, 사전

변경 가능하지 않은 자료형 - 숫자, 문자열, 튜플




ex) >>> a = 1

>>> a = 2

이렇게 있다고 생각한다면...

결론부터 말해서 a는 숫자 2로 변경된 것이 아니다. 

1은 변경되지 않고 다만 a가 다른 객체(2)를 참조할 뿐이다.

※ python 에서는 객체와 이름은 별도로 관리된다. 이름에 직접 값이 저장되는 것이 아니고, 이름은 언제나 객체를 참조(Referencing) 하게 되어 있다.


a    --->    1    # a=1 한 후

a    --->    2    # a=2 한 후 ( 객체 1은 참조되지 않으므로 버려진다.)


결국, 숫자 객체 1은 값이 변경되지 않았다. 이름 a가 다른 객체를 참조한다. 이때 객체 1은 참조되지 않으므로 메모리에서 제거된다. 

즉, 이름에 의해 참조만 바뀌는 것.


ex) >>> L1 = [1,2]

>>> L2 = [3,4]

이것도 마찬가지로 이름에 의해 참조만 바뀌는 것이다. 

그러나 객체 내부의 값을 변경할 때에, 리스트는 값을 변경할 수 있다.


즉, 어떠한 이름으로 객체 전체를 바꾸는 것은 객체 전체를 변경하는 것이 아니며, 새로운 객체를 할당하는 것이다.


객체 변경의 의미는? 객체 내부의 값을 변경할 수 있는가이다.





python의 이름이라는 것이 c/c++의 포인터와 참조자의 개념과 정말 똑같다. 이름(변수)를 포인터 혹은 참조자라고 인식하면 될 것 같다.

Posted by scii
:

리스트

[]를 사용하는 리스트는 임의의 객체를 저장하는 집합적 자료형이다. 각 자료는 순서를 가지고있고 순서에 따라 접근 가능하다.


리스트는 메쏘드(객체 함수)를 가진다.




튜플

()를 사용하는 튜플도 문자열과 리스트와 유사한 특정을 가진다.


튜플과 리스트의 차이라면, 튜플은 값의 변경이 안 되고, 리스트는 가능하다는 것이다.


또한, 리스트는 다양한 메쏘드를 가지지만, 튜플은 그렇지 않다.




사전

사전은 옵셋이 아닌 키를 사용하여 값을 얻는 자료 구조이다. 이것은 사상 함수와 같은 역할을 한다. 

함수 f는 f:x -> y와 같이 x를 y로 사상시킨다. 사전의 역할이 이와 동잃다. 사전에 x라는 키(key)를 주면 값 y를 돌려준다.

또한 키에 대응하는 값(value)을 저장할 수도 있다.

사전은 초기화할 때 {}를 사용한다. 초기 값은 '키:값' 의 형태로 준다.



Posted by scii
:

인덱싱(Indexing)으로 각각의 문자를 취할 수 있다.

>>> s = 'abcd'

>>> s[0]

'a'


슬라이싱(Slicing)으로 부분 문자열을 취할 수 있다.

>>> s[1:3]

'bc'

>>> s[:2]

'ab'


슬라이싱의 시작 위치가 생략되면 '처음부터', 마지막 위치가 생략되면 '끝까지'의 의미이다. 둘 다 생략되면, 처음부터 끝까지.


슬라이싱은 세 가지 값을 가질 수 있다. (Start : Stop : Step) 이것을 확장 슬라이스라고 한다. 

시퀀스 자료형인 문자열, 리스트, 튜플에 모두 적용된다. 

생략되었을 경우, start는 0, stop은 자료형의 크기, step은 1의 값을 가진다.


>>> s[::2]    # 2칸 단위로.

>>> s[::-1]    # 거꾸로.


그리고 멤버십 테스트를 이용하여 부분 문자열의 존재를 확인할 수 있다.

>>> 'good' in s    # good이라는 문자열이 s에 존재하냐는 뜻이 된다.


※ 문자열은 값이 변경되지 않는다. 그래서 만약 변경을 하려면 아래와 같이 해야 한다.

>>>s = 's' + [1:]




슬라이싱과 연결을 이용하여 문자열을 변경.





Posted by scii
:

원하는 문자열을 프로그램 실행 중이라도 마음대로 만들 수 있기 때문에 문자열로 표현된 파이썬 코드를 실행하는 것은 유용할 수 있다. 

이런 코드를 실행하는 방법은 몇 가지가 있다.


eval 함수

eval (expression[, globals[, locals]])

여기서 global은 전역 영역 사전, local은 지역 영역 사전이다. 이들 인수는 선택적이다.


eval() 내장 함수는 문자열로 된 파이썬 식(Expression) 을 실행한다.

※ evaluation = "값을 구함" 이란 뜻.


즉, eval('a+10') 는 문자열로 된 a+10의 값을 구한다라는 뜻이 된다.


그리고 식만을 수행할 수 있기 때문에 문(statement)을 실행하려고 하면 SyntaxError 예외가 발생한다.




exec 함수

exec code [ in globals [, locals]]

exec는 문자열로 된 문(Statement) 을 수행한다.


exec 'a = a + 5'    ==> 문자열로 된 'a = a + 5' 이 문을 실행하라. 라는 뜻이 된다.


exec는 여러 개의 문일 수 있다.

여기서 따옴표(')가 연속적으로 3개 들어가면 긴~ 문장을 쓰겠다는 뜻이된다. 테스트 결과, 2개나 4개 이상은 안된다. 꼭 3개만 된다.




Compile 함수

compile (string, filename, kind)

=> 여기서 string은 코드 문자열, filename은 코드 문자열이 저장된 파일명이다. 코드 문자열이 파일에서 읽혀지지 않았다면 <string>이 된다. 

kind는 어떤 종류의 코드가 컴파일되야 하는지 지정한다.

'exec'라면 여러 개의 문들을 컴파일하며, 'eval'이면 하나의 식을, 'single'이면 하나의 대화적 문을 컴파일한다.

※ help(complie) 입력하면 자세히 나옴.


exec나 eval은 문자열로 입력된 코드를 분석해서 파이썬 컴파일 코드로 변환한다. 만일 이러한 코드를 반복적으로 수행하게 되면 변환에 필요한 시간은 크게 늘어나게 된다. 효율적인 수행 방법은 문자열을 파이썬 코드로 한번 변환해 둔 후에, 반복 실행할 때마다 이 코드를 활용하는 것이다. 

compile() 내장 함수는 문자열을 컴파일하여 파이썬 코드를 리턴한다. 



eval은 식만 실행할 수 있다. 그런데 a = a + 1 이 코드 문자열로 되어있다... 이건 문이다.

그런데 실행이 잘~ 된다.

확실치는 않지만 아마도... compile 함수로 파이썬코드로 바꿔주어서 그런 것 같다.



Posted by scii
:

파이썬은 다른 많은 언어와는 달리 변수의 이름과 값 객체가 분리되어 있다. 예를 들어, a = 1 이란 문에서 숫자 1이 변수 a에 저장되는 것이 아니다. 

파이썬에서는 a를 이름, 숫자 1을 객체라고 하며, 두 개념은 분리되어 있다.


그림으로 표현하면 이렇다. 

(이름 a)  -----------------> (객체 1)

즉, 이름 a는 객체 1을 가리킨다. 객체1은 별도의 위치에 존재하고 있는 것이다.


※ 일반적인 컴파일러 언어(소스 코드를 기계어 수준으로 번역해서 실행하는 언어. C언어가 대표적이다.) 는 이름과 객체의 개념이 분리되어 있지 않다. 컴파일러 언어에서의 이름은 번역될 때 실제 메모리 주소로 모두 변환되므로 프로그램을 수행하는 런타임 시점에서는 이러한 심볼의 이름들은 의미가 없다. 

즉, 변수 혹은 객체의 이름은 해당 객체의 주소로 변환된다.


이에 반해서 파이썬과 같은 동적인 자료형을 가지는 언어에서는(대부분의 스크립트 언어) 변수의 생성과 소멸이 언제든지 일어날 수 있기 때문에 이름이 주소로 변환되지 않고 별도의 장소에 이름이 보관된다.

그리고, 이름과 객체와의 관계 정보를 추가로 가지고 있다. 이름이 저장되는 장소를 '심볼 테이블(Symbol Table)' 이라고 한다.



객체의 치환



간단한 테스트를 통해 a의 값을 바꿔서 b,c의 값이 바뀌는지를 확인하면,

공유객체인지 아니면 분리된 객체인지 (참조로 되는지, 복사로 되는지를) 확인할 수 있다.


a[1]의 값만을 변경했는데 b와 c가 같이 변했다. 이 결과는 객체가 공유된다는 뜻이다. 

사실 이름 a는 객체의 레퍼런스를 나타내는 것이므로 b와 c는 동일 객체의 레퍼런스만 저장하고 있는 것이다. 


※ 일반적으로 python에서의 치환은 대부분 레퍼런스에 의해 이루어진다.

만일 객체의 복사를 원한다면 객체에 따른 방법을 적용하거나 일괄적으로 copy 모듈을 이용하면 된다.




python에서 일반적인 변수가 C언어의 pointer 변수와 똑같구나..!!

'Programming > Python' 카테고리의 다른 글

자료형의 종류  (0) 2012.11.25
문자열로 된 파이썬 코드 실행  (0) 2012.11.22
파이썬의 keyword  (0) 2012.11.21
파이썬 환경 변수 설정  (0) 2012.11.21
리눅스에서 스크립트 실행하기  (0) 2012.11.21
Posted by scii
:

keyword.kwlist 를 입력하면 파이썬에서 쓰는 키워드들이 리스트로 쭉 나온다.

그런데, 책에서는 키워드가 29개였는데.. 2.7.2 버전의 파이썬은 키워드가 31개이다.


비교해보니, as 와 with 라는 키워드 2개가 더 생겼다는 것을 확인할 수 있었다. 



with 문은 무슨 파일 I/O와 관련있는 것 같은데.. 책 모두 공부하고 as와 with를 알아봐야겠다

Posted by scii
:

IDLE(Python GUI)

-> 파이썬 표준의 GUI 대화식 인터프리터이다. GUI 부분은 Tcl/tk의 tk를 이용하여 만들어졌다.


Module Docs

-> 원하는 모듈을 쉽게 찾을 수 있는 도구이다.


Python(Command Line)

-> 도스 창에서 수행되는 파이썬 대화식 인터프리터.


Python Manuals

-> HTML 파일 형식의 파이썬 온라인 문서 모음이다. 여러 가지 문서가 있으나 '라이브러리 레퍼런스(Library Reference)' 를 주로 참조하게 된다.

'Programming > Python' 카테고리의 다른 글

파이썬의 keyword  (0) 2012.11.21
파이썬 환경 변수 설정  (0) 2012.11.21
리눅스에서 스크립트 실행하기  (0) 2012.11.21
파이썬의 특징  (0) 2012.11.21
Python  (0) 2012.11.21
Posted by scii
:

파이썬의 특징

Programming/Python 2012. 11. 21. 03:13 |

# 대화 기능의 인터프리터 언어

-> 파이썬은 객체지향 기능을 강력히 지원하는 대화형 인터프리터 언어다. 컴파일하고, 실행해 보고, 에러를 고치는 기존의 절차에서 벗어나 작성한 다음 바로 테스트하는 간단한 언어다. 따라서 테스트 과정이 크게 단축된다. 

자바와 같이 바이트 코드를 생성하지만 명시적으로 컴파일할 필요도 없다. 그저 프로그램을 작성하고 수행하면 된다. 그러면 필요한 바이트 코드가 자동으로 생성된다.


# 동적인 데이터 타입 결정 지원

-> 파이썬은 동적으로 데이터 타입을 결정하므로 데이터 타입에 관계없는 일반화된 코드를 작성할 수 있다. 

ex) def add(a, b):

return a+b

이렇게 작성하면 정수, 문자열, 리스트등 자료가 입력되었을 때, 그 자료에 맞는 +메쏘드 (C++의 operator+와 같은 것을 말하는 듯) 를 자동으로 호출한다. 

또한 복잡한 형 선언이나 크기 선언을 해 줄 필요도 없다.


# 플랫폼 독립적 언어

-> 대부분의 운영체제에서 동작한다. 바이트 코드를 생성하므로 소스 코드 없이도 다른 컴퓨터에서 즉시 수행된다.


# 개발 기간 단축에 초첨을 둔 언어

-> 파이썬은 실행의 효율성보다는 개발 기간 단축에 초점을 둔 언어다. 실행 속도로 말하자면 어셈블리 언어를 제외하고는 C에 견줄 만한 프로그래밍 언어는 없다. 

그러나, 실행속도가 조금 느리더라도 개발 기간을 단축할 수 있는 언어를 택할 것이다.  수행 속도 10분을 줄이기 위해 29일을 손해 볼 수는 없는 법.


# 간단하고 쉬운 문법

-> 파이썬은 begin ... end나 { }를 사용하지 않는다. 

들여쓰기(Indentation)로 블럭을 구분한다. 프로그래머들에게 강제적으로 블록에 대한 줄을 일관되게 맞추어 프로그램을 작성하게 함으로써 프로그램의 가독성과 이해도를 높이고 있다.


# 고수준의 내장 객체 자료형 제공

-> 파이썬은 일반적으로 사용되는 리스트(List), 사전(Dictionary),  문자열(String), 튜플(Tuple) 등의 자료 구조를 제공한다. 


# 메모리 자동 관리

-> 파이썬은 쓰레기 수집(Garbage Collection) 기능을 사용하여 필요할 때 메모리를 자동 할당하고 사용이 끝났을 때 자동으로 해제한다. 또한 필요에 따라 메모리를 늘리기도 하고 줄이기도 한다.


# 쉬운 유지 보수

-> 파이썬의 깔끔한 코드는 이해하기 쉬워서 코드의 유지 보수가 용이하다.


# 많은 수의 라이브러리 제공

-> 파이썬은 이미 만들어진 많은 수의 라이브러리를 제공한다. 정규식 매칭부터 네트워킹까지 원하는 웬만한 기능은 이 라이브러리에서 찾을 수 있다. 

또한 서드파티에서 제공하는 수많은 외부 모듈이 있다.


# 짧아지는 코드

-> 파이썬은 일급 함수(First Class Function : 1. 함수 객체를 변수에 저장 가능 2. 함수에서 리턴값으로 사용 가능 3. 함수에 인수로 전달 가능한 함수) 를 지원하며, 다중 상속과 지연 바인딩 기능을 지원하는 객체지향 언어이다. 


# 높은 확장성

-> 파이썬을 일명 접착제 언어(Glue Language)라고도 한다. 다른 언어나 라이브러리에 쉽게 접근해 그들을 사용할 수 있기 때문이다. 가장 보편적인 언어인 C와는 아주 잘 결합된다. 


# 확장(Extending) 및 내장(Embedding) 가능

->  C 등 다른 언어에서 파이썬을 호출할 수 있고, 그 응용 프로그램에 내장시켜 사용할 수 있다.파이썬에서 C 모듈을 호출하는 것도 물론 가능하다.

'Programming > Python' 카테고리의 다른 글

파이썬의 keyword  (0) 2012.11.21
파이썬 환경 변수 설정  (0) 2012.11.21
리눅스에서 스크립트 실행하기  (0) 2012.11.21
파이썬의 요소들  (0) 2012.11.21
Python  (0) 2012.11.21
Posted by scii
: