if 문

- if 문을 조건문이라고 한다. 어떤 조건에 맞으면 문들을 수행하고 그렇지 않으면 건너뛴다.


※ C / C++ 의 형식과 똑같다. 단지 else if가 elif로 바뀐 것 뿐.


if문의 일반적인 형식.

if 조건식1:

<문들1>

elif 조건식2:

<문들2>

else:

<문들3>

조건식 1이 참이면 <문들1>이 수행, 그렇지 않으면 조건식2를 검사해서 참이면 <문들2>가 수행된다. 그렇지 않으면 <문들3>이 수행된다.


주의할 점은 조건식이나 else 다음에 콜론( : )을 잊지 말고 입력해야 한다. 

콜론( : )은 다음 문들이 현재의 문 내부 블럭에 속한다는 것을 알려준다. (if, for, while 제어문들과 def, class와 같이 내부 블럭을 가지는 문들에서만 콜론이 사용된다.)


여기서 if-elif-else 는 줄(열)이 잘 맞아야 한다. 그렇지 않으면 에러가 발생한다. 또한, 문들도 줄이 일정하게 맞아야 한다.


선택문에 있어서 때로는 사전을 이용하는 것이 더 편할 때도 있다. if문을 이용한 것과 사전을 이용한 것과 동일한 결과를 보여준다.






for 문

- foreach 문하고 상당히 비슷하다.

for <타겟> in <객체>:

<문1>

else:

<문2>

<객체>는 시퀀스 형 자료여야 한다. <객체>의 각 항목은 <타겟>에 치환되어 <문1> 혹은 <문2>를 수행한다. 반복 횟수는 <객체>의 크기가 된다.


※ for문을 이용할 때, 요소의 값 뿐 아니라 인덱스 값도 함께 필요하다면 enumerate() 내장 함수를 이용하면 좋다.

enumerate() 내장 함수는 (인덱스, 요소 값) 튜플 자료를 반복적으로 넘겨준다. 즉, iterate 한다.


ex) enumerate() 활용 예제.



for문의 else

for 문에서 else 블록은 for 문이 break 문으로 중단됨 없이 종료했을 때 수행된다. 







while 문

- for 보다 일반적인 반복 제어문이다. 헤더 부분의 조건식 테스트 결과가 참인동안 내부의 블록은 반복적으로 수행된다. 

else 부분은 조건식이 거짓이 되어 while 문을 빠져나올 때 수행된다. break로 빠져나올 때는 else 블록을 수행하지 않는다.

while <조건식>:

<문1>

else:

<문2>



Posted by scii
:

쓰레기 수집

- 파이썬에서는 특별히 사용자가 관리해야 할 메모리는 없다. 모든 것은 자동으로 생성되고 자동으로 환원된다. 

추가로 필요한 메모리가 있으면 시스템에서 알아서 확장해 준다. 더 이상 사용되지 않는 객체들은 자동적으로 사라진다. 이러한 작업을 쓰레기 수집(Garbage Collection)이라 한다.

파이썬은 모든 것이 객체로 관리되며, 모든 객체는 레퍼런스 카운트(Reference Count)라는 값을 가지고 있다. 이것은 얼마나 많은 부분에서 객체를 참조하고 있는가를 나타내 주는 정수이다.



레퍼런스 카운트를 얻는 법

- sys 모듈의 getrefcount 함수를 이용하면 된다.


여기서 레퍼런스 카운트가 1씩 증가되서 출력되는 것은 getrefcount 함수가 이 객체를 처리하기 위해서 새로운 카운트 값을 1 증가시켰기 때문이다.

따라서, 실제의 카운트 값은 getrefcount 함수가 넘겨주는 값보다 1 작다.






객체의 신원 식별하기

- 대부분의 경우에는 필요 없겠지만 id 내장 함수를 이용하면 객체의 주소를 식별할 수 있다. 두 객체의 id가 동일하다면, 같은 객체를 참조하고 있는 것이다.

a, b는 모두 같은 id의 객체를 가리키고 있다.

만일 두 이름 a, b가 같은 객체를 참조하고 있는가를 알려면 a is b를 이용한다.


여기서 a = 1, b = 1 했는데... 와우.. 이 결과를 보기 전까지 나는 a, b가 서로 다른 객체를 가리키고있지 않을까? 하며 생각했었다....

그런데 여기 결과는 같은 객체를 이름 a,b가 가리키고있다..

곰곰히 생각해보니 당연한 결과였다. 왜냐하면, 똑같은 객체를 굳이 다시 한번 만들필요없으니 말이다... 아항!!!

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

예약어 pass  (0) 2012.11.26
Python 제어문(if, for, while)  (0) 2012.11.25
파이썬의 객체 자료형  (0) 2012.11.25
변경 가능성 (python에서 정말 중요하다고 생각하는 개념)  (0) 2012.11.25
리스트, 튜플, 사전  (0) 2012.11.25
Posted by scii
:

'BooleanType'                                 -    부울 자료형

 'BufferType'                                   -    buffer() 함수로 생성된 버퍼 객체 형

 'BuiltinFunctionType'                        -    len(), sys.exit()와 같은 내장 함수의 이름

 'BuiltinMethodType'                         -    BuiltinFunction의 또 다른 이름

 'ClassType'                                   -    사용자 정의 클래스 자료형

 'CodeType'                                   -    compile() 함수에 의해 리턴되는 코드 객체 형

 'ComplexType'                              -    복소수형

 'DictProxyType'                            -    

 'DictType'                                    -    사전 형

 'DictionaryType'                            -    DictType의 또 다른 이름

 'EllipsisType'                                -    Ellipsis 자료형

 'FileType'                                    -    sys.stdout과 같은 오픈된 파일 객체 형

 'FloatType'                                  -    실수 형

 'FrameType'                                -    traceback 객체 tb 안의 tb.tb_frame과 같은 프레임 객체 형

 'FunctionType'                             -    사용자 정의 함수, 람다 함수 형

 'GeneratorType'                           -    발생자 객체

 'GetSetDescriptorType'                  -    

 'InstanceType'                            -    사용자 정의 클래스 인스턴스 형

 'IntType'                                    -    정수 형

 'LambdaType'                            -    FunctionType의 또 다른 이름

 'ListType'                                  -    리스트 형

 'LongType'                                -    롱 형

 'MemberDescriptorType'               -        

 'MethodType'                            -    사용자 정의 클래스 인스턴스의 메쏘드 형

 'ModuleType'                            -    모듈 형

 'NoneType'                              -    None 객체 자료형

 'NotImplementedType'                -    

 'ObjectType'                            -    

 'SliceType'                              -    slice()에 의해 리터된 자료형

 'StringType'                            -    문자열 형

 'StringTypes'                           -    StringType과 UnicodeType을 모두 포함하는 타입. 일반 문자열, 유니 코드 문자열을 

같이 취급하고자 할 때. (ex : isinstance(s, StringTypes))

 'TracebackType'                      -    sys.exc_traceback과 같은 traceback 객체 형(1.5 이후에 사용하지 않음)    

 'TupleType'                            -    튜플 형

 'TypeType'                            -    type 객체의 자료형(type()으로 리턴되는 자료형)

 'UnboundMethodType'             -    MethodType의 또 다른 이름

 'UnicodeType'                        -    유니 코드 문자열 형(ex: u'Spam')

 'XRangeType'                         -    xrange()에 의해 리턴된 range 형

 '__builtins__'                          -    

 '__doc__'                              -    

 '__file__'                               -    

 '__name__'                            -    

 '__package__'                        -    



Posted by scii
:

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
:

자료형의 종류

Programming/Python 2012. 11. 25. 16:16 |

자료형이란, 컴퓨터로 표현할 수 있는 자료의 종류를 의미한다. 

파이썬에서는 여러 가지의 정보를 저장할 수 있는 자료형을 미리 정해 놓고 있는데, 이를 내장 자료형(Built-in Types)이라고 한다.


※ 파이썬은 다른 언어에서 제공하지 못하는 고수준의 편리한 자료형이 준비되어 있다. 파이썬의 자료형은 강력하여 다른 언어에서는 해야 할 많은 번거로운 작업을 줄여 준다.

대부분의 경우 별다른 자료 구조의 설계 없이, 파이썬에서 제공되는 자료형만 가지고 작업을 충분히 할 수 있다.


파이썬의 내장 자료형 중 중요한 몇가지들


1. 수치 형(Numbers)    - 정수, 롱형 정수, 실수, 복소수 등을 표현.


2. 문자열(Strings)    - 문자들의 모임이다. (내용 변경 불가능)


3. 튜플(Tuples)    - 순서를 가지는 파이썬의 임의 객체의 집합. (내용 변경 불가능)


4. 리스트(Lists)    - 순서를 가지는 파이썬의 임의 객체의 집합.


5. 사전(Dictionaries)    - 순서를 가지지 않는 객체의 집합. 키(key)로 값을 꺼낸다.


6. 파일(Files)    - 파일에 자료를 입/출력하기 위한 객체.


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
: