Data science/Python

1. 기본자료형, Python Built-in Code

연금(Pension)술사 2019. 3. 5. 14:59


print("{1} {0} {owner} blog".format("this", "is", owner="lemoncandy's"))



본글에서는 파이썬의 기본 자료형(문자열, 논리, 기본연산자 등)을 다루고, 이에 대한 예시를 들어 독자의 설명을 돕고자합니다.




파이썬 & 객체


파이썬의 중요한 특징 중 하나는, 객체 모델이다. 숫자, 문자열, 자료구조, 함수, 클레스, 모듈은 모두 파이썬 객체라는 것으로, 객체라는 것에 저장된다. 이 객체에 해다하는 자료구조들에 대한 것만 살펴보도록한다. 파이썬의 자료구조는 크게 4가지로 분류할 수 있는데, 문자열(String), 리스트(List), Tuple(튜플), 사전(dictionary)에 해당된다. 추가하자면 파일 등을 덧붙일 수 있을 것 같다.


아래는 파이썬 내장 자료형에 대한, 내장함수와 기본적으로 알아야할 부분에 대한 오버뷰이다. 해당 내용중에 모르는 것이 있으면 자료구조를 더 이해하는 것이 바람직하다.



Python 내장 자료형 (요약)

  1. String: "" or ''으로 묶여진 문자의 모임
    1. Indexing
    2. Slicing : [Start index: Stop index : Step] 파이썬 2.3부터 지원
    1. immutable: 문자열은 중간 값이 변경되지 않는다
    2. Membership test
  2. List
    1. List offset:
    2. 순서있음
    3. List length
    4. List slicing
    5. List 
    6. List 덧셈
    7. 확장 슬라이스
    8. Membership test
    9. Append
    10. del
    11. L.reverse() : 리버스하면 바로 리스트가 변경된체로 저장되어진다.
    12. L.sort(): 리버스와 마찬가지로, 정렬된 리스트가 변수에 담겨진다.
  3. Tuple
    1. indexing: 순서가 있다.
    2. Slicing
    3. 연결: 리스트와 똑같이 +으로 연결한다
    1. Membership test
    2. immutable
  4. Dictionary
    1. Key vs offset
    2. 순서
    3. Membership test
    4. mutable
    5. dic.keys() : 사전의 키만 추출
    6. dic.values() : 사전의 값만 추출
    7. dic.tiems(): 키와 값을 엮어서 리스트로 출력한다.

자료 저장 방법에 따른 자료형의 분류

직접 자료형 

직접 자료를 표현하는 자료형

정수, 실수, 롱형 정수 

시퀀스 형

다른 자료를 포함하는 자료형

(순서를 가진다 = 인덱싱 및 슬라이싱이 가능하다)

리스트, 튜플, 문자열 

매핑 형다른 자료를 포함하는 자료형 
(순서를 가지지 않는다)
딕셔너리 


자료 변경 가능성에 따른 자료의 분류


변경가능(Immutable) 

자료의 값을 변경할 수 있다. 

dic, list 

변경 불가능(Immutable)

자료의 값을 변경할 수 없다. 

수치형, 문자열, 튜플 



자료 변경 가능성에 따른 자료의 분류


 자료형저장 변경 가능성 기타 

수치형(int)

리터럴 (한 가지 종류의 데이터만 저장가능)

변경 불가 

직접 접근 (주소값으로)

문자열(str)리터럴변경 불가 시퀀스 

리스트(list)

저장 가능

변경 가능 

시퀀스

튜플(tuple)저장 가능변경 불가 시퀀스 
사전(dict)저장 가능변경 가능 매핑 

시퀀스자료는 여러 개의 항목 값들이 순서대로 모여 있는 자료형을 순차자료라고한다. 튜플, 리스트, 문자열은 모두 순차자료에 해당된다. (사전은 순차자료가 아니다, 그렇기 때문에 사전에다가 [1]을 붙여서 인덱싱하려고해도 안되는 것이다.) 

직접접근(주소값)에 대한 이해,
예를 들어, 아래와 같은 a, b에 할당이 있다고 하자. a는 'hello my world'을 의 주소값을 가르키고 있기 때문에 문자형이고, b도 문자형이다. 그러나, a가 가르키고 있는 주소와 b가 가르키고 있는 형태가만 같을 뿐, 주소가 다르기 때문에, 3번의 결과와 4번의 결과가 차이가 난다. 아래의 예제를 통해 할 수 있는 것은 문자열은 직접접근하는 형태가 아니라, 주소의 형태로 접근한다는 것을 알 수이싿.
1
2
3
4
= 'hello my world'
= 'hello my world'
print(a==b) # true
print(a is b) # false
cs


        파이썬 자료형의 확인

        자료형을 지정하는 예약어를 사용하여 확인한다.

        1
        type(123== int
        cs



        String Object & Method


        문자열의 슬라이싱과 인덱싱

        문자열 종류의 자료형은 문자열과 슬라이싱은 잘 설명되어 있는 사이트가 있어, 참조를 바란다. [https://wikidocs.net/2838]. 음수인덱싱을 하는 경우가 있어 해당 인덱싱만 설명한다.


        음수 인덱싱

        string[시작인덱싱:-음수]: 인 경우에는 음수 -1 은 뒤에서 역순으로 2번째 문자를 의미한다. 예를 들어, 문자 abcd가 있는 경우, a[-1]은 d를 가르킨다. 그러나, 범위로 슬라이싱을 하는 경우에는 맨 끝의 위치에 해당하는 인덱스를 제외한 결과를 출력하므로 a[0:-1]은 abc을 출력한다. 반대로 a[::-1]은 순서를 거꾸로 해달라는 경우이므로, 역순으로 출력된다. 역순으로 출력되는 경우는 

        1
        2
        3
        = 'abcd'
        print(a[-1])
        print(a[0:-1])
        cs





        str.split(separator, maxsplit): 

         -separator: 나누고자 하는 구분자

         -max split: 최대로 나누고자하는 숫자. 만약 3이면 출력물은 3개는 분리되고, 나머지 1개는 그대로인 상태로 총 길이라 4개인 리스트가 나온다. 즉, 3개까지만 분리를하고 나머지는 그냥 쭉 이어서 배출한다.


        1
        2
        3
        4
        5
        6
        7
        8
        9
        >>> syntax = 'separator : The is a delimiter. The string splits at this specified separator. If is not provided then any white space is a separator. \
        >>> maxsplit : It is a number, which tells us to split the string into maximum of provided number of times. If it is not provided then there is no limit.'
        >>> syntax.split(' ',3)
         
         
        ['separator',
         ':',
         'The',
         'is a delimiter. The string splits at this specified separator. If is not provided then any white space is a separator. maxsplit : It is a number, which tells us to split the string into maximum of provided number of times. If it is not provided then there is no limit.']
        cs


        str.upper()

        str.lower()

        str.count(): 문자열에서 함수 안에 부분 문자열이 있는 횟수를 리턴

        str.find(): 문자열에서 함수 안에 있는 부분 문자열의 offset(시작인덱스)를 리턴

        str.find(like, 3): 문자열에서 함수 안에 있는 like의 offset(시작인덱스)를 3번 인덱스부터 탐색

        s.rfind(): find의 reverse. 뒤에서부터 검색한다.

        s.index(): find와 같다. offset을 리턴한다.

        s.rindex(): index와 같으나, 뒤에서 부터 검색한다.

        s.startswith(): 함수내에의 부분문자열로 시작하는 스트링인지 T/F 리턴

        s.endswith(): 함수내의 부분문자열로 끝나는 스트링인지 리턴

        s.startswith('like',7): 7번 문자열이 like로 시작하는가

        s.replace(원래문자, 바꿀문자)

        str.strip(): 좌우 공백을 없앤다.

        str.rstrip(): 우측 공백을 제거

        str.lstrip(): 좌측 공백을 제거

        str.splitlines(): 라인 단위로 분리

        ':'.joint(t):  ':' 문자로 결합. t = list형태, 

        u.center(): 전체 문자를 x개로 만들고, 문자를 가운데 위치시킨다.

        1
        2
        3
        >>> string = "spoon and egg race"
        >>> string.center(60'-')
        '---------------------spoon and egg race---------------------'
        cs

        str.ljust(): 전체문자를 x개로 만들고, 문자를 왼쪽에 위치시킨다.

        str.rjust(): 전체문자를 x개로 만들고, 문자를 우측에 위치시킨다.

        str.isdigit()

        str.isalph():

        str.isalnu(): 숫자 혹은 영문자인가?

        str.islower():

        str.isupper():

        str.isspace():

        문자열 내에서 전체 자리수 지정하기

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        = '내용 {0:15}을 전체 자리 15자리로 맞추어 출력합니다'.format("python help")
        print(s) # 우측으로 공백
        = '내용 {a:10}을 전체자리 10자리로 맞추어 출력합니다.'.format(a=13)
        print(k) # 좌측 공백
        = 'hello'
        = '내용 {:3}와 {:10}의 자리수를 각각 맞춥니다'.format(a, 3.14)
        print(s) # 전체 다 나옴
        = '내용 {:<3}와 {:<10}의 자리수를 각각 맞춥니다'.format(a, 3.14)
        print(s) # 둘다 좌측 정렬
        = '내용 {:>3}와 {:>10}의 자리수를 각각 맞춥니다'.format(a, 3.14)
        print(s) # 둘다 우측 정렬
        = '내용 {:^10}와 {:^10}의 자리수를 각각 맞춥니다'.format(a, 3.14)
        print(s) # 둘다 중앙 정렬
        = '내용 {:!<10}와 {:*^10}의 자리수를 각각 맞춥니다'.format(a, 3.14)
        print(s) # 빈공간을 !로 
        = '''숫자 {0:.4f}와 {1:0.4f}의 소수점 이하 자리수를 
        4자리 까지만 표현합니다'''.format(3.143259485734.32184)
        print(s)
         
         
        cs


        str.replace(원래문자, 바꿀문자)

        1
        2
        3
        4
        s1 = "Hello my name is Hong kil-dong"
        s2 = s1.replace("Hong"'Kim')
        print(s1)
        print(s2)
        cs



        List Method



        Min, Max

        1
        min(my_list), max(my_list)
        cs


        -추가 관련 함수

        List.append: 마지막에 추가해서 바로 변경됨. (Inplace =True)

        List.insert(index, object): 자료를 지정된 위치(object)에 삽입. (Inplace =True). 해당하는 index에 위치시킨다.

        1
        2
        list_data = ['apple''banana''cherry']
        list_data.insert(2'abc')
        cs



        -인덱스 관련 함수

        List.index(value ,start, stop, position) : return first index of value. 

         - value = 찾을 패턴

         - start, stop = 시작 인덱스, 마지막 인덱스. 즉 범위를 지정할 수 있다.

        1
        2
        3
        4
        5
        ref = [56'abc'7'apple']
        >>> print(ref)
        [56'abc'7'apple']
        >>> ref.index('abc'15)
        2
        cs



        List.extend(value): 변수값 뒤에 리스트를 붙여준다.

        1
        2
        3
        4
        5
        6
        >>> a = ['abcd']
        >>> b = ['b','bbb']
        >>> print(a.extend(b)) 
        None
        >>> a.extend(b)
        >>> a
        cs

        List.count(value): 자료값의 개수를 카운트



        -정렬 관련 함수

        List.reverse(): 인덱스 순서를 반대로 돌려놓고, 저장시킴. 리턴 값 없음

        List.sort(): 값의 순서대로 돌려놓고, 저장함. 리턴 값 없음

        sorted(): 이는 범용함수이다. 리턴 해주고, 저장은 안함


        -삭제 관련 함수

        List.clear(): 리스트의 모든 항목을 제거

        List.del()

        List.remove(value): 리스트 원소중 value인 원소 맨 처음 원소 삭제

        List.pop(index): 마지막의 요소를 리턴하고, 리스트에서 바로 제거

        >>> s.pop(0): 가장 뒤에 있는 요소를 꺼낸다.


        리스트의 슬라이싱

        1
        2
        list_data[-1:-5:1# 라면 start가 end보다 커서 안나옴
        list_data[-1:-7:-1# 스텝이 마이너스이면 나오지만
        cs



        List Comprehension(리스트 내장)

        [Expression for exp1 in sequence 1

                         for exp2 in sequnce 2....]


        10보다 작은 정수 중 홀수의 제곱만 리턴한다.

        >>> [k for k in range(0,10) if k%2 ==1]


        2의 배수와 3의 배수중 두수의 합이 7의 배수가되는 두수의 곱의 리스트를 만든다.

        List comprehension 작성시, expression부분이 튜플일 경우 꼭 활호로 감싸야한다.


        >>>[(i, j) for i in range(0, 100, 2) \

            for j in range(0, 100,3 ) if (i+j) %7 ==0]


        Range()

        # 순차적인 값을 할당할 때 사용한다.

        >>> a, b, c, d = range(0,4)


        None 이 포함된 리스트 생성

        1
        2
        3
        4
        #내용 없는 리스트 생성
        = [None] *10
        for i in range(0,10,2):
            L[i] = i
        cs


        리스트로 2차원 배열 표현

        1
        2
        3
        #리스트로 2차원 배열 표현
        = [ [1,2,3],[4,5,6],[7,8,9]]
        L[2][2]
        cs


        리스트의 슬라이스

        *리스트를 슬라이스 할 때, 리스트[시작인덱스:마지막인덱스:단계] 의 구문으로 한다. 단계(step)을 이요한 슬라이드를 하는 경우 이를 확장슬라이드(extended slice)라고한다. 주의할 것은 확장슬라이드를 이용하여 변수를 치환할 경우 무조건 좌측의 확장슬라이드 값과 우측의 확장 슬라이드의 값이 동일해야한다.

        1
        2
        my_list = list(range(0,10))
        my_list[::3= list(range(5,9))
        cs





        파이썬 함수와 메소드


        적용하고자 하는 변수에 바로 저장이되는 경우 메소드가 많고, 그렇지 않으면 함수인 경우가 많다. 함수는 범용적으로 사용하는 경우가 많은데, 예를 들어서. len()과 같은 함수는 list.len()을 사용하지 않고 모든 자료에 대해서 len(List), len(string)등 다양한 자료형을 커버할 수 있기에 함수이다. 즉, 해당 객체만 사용할 수 있는 경우는 메소드라고 생각하면 편하며, 다양한 객체에 대해서 사용할 수있다면 함수라고 이해하면 된다.


        산술연산
        몫 (/)

        정수형 연산. 결과는 실수형:  9/5

        실수형 연산. 결과는 실수형:  9.0 / 5.0 

        실수형 연산. 결과는 몫만: 9.0 //5.0 

        나머지 (%)

        >>> 9 % 5. 4

        >>> divmod(9, 5)

        reutrn (1, 4)



        파이썬 예약어

        >>> import keyword

        >>> keyword.keylist


        연속라인의 표시

        \

         

        문자열로 된 파이썬 코드의 실행

        eval (expression[, globals[, locals]]): 파이썬에 사용되고 있는 식(expression)을 실행

        >>> a = 4

        >>> a = eval('a+4')

        >>> print(a)

        8


        exec code [ in globals [, locals]] : 문자열로 된 문(statment)을 수행

        >>> a = 5

        >>> exec 'a = a+4'

        >>> a

        9


        compile (string, filename, kind): 코드를 반복적으로 수행할 때, 컴파일 일하여 파이썬 코드를 리턴

        1
        2
        3
        4
        >>> code = compile ('a+1''<string>''eval')
        >>> a= 1
        >>> for k in range(10):
             a = eval(code)

        cs

        Console 입출력

        pprint


        1
        2
        3
        >>> import pprint 
        >>> pprint.pprint(변수명)
         

        cs



        enumerate(): 

        인덱스 값도 같이 필요한 경우 사용하는 함수. (인덱스, 요소 값) 튜플 자료로 반복적으로 넘겨준다.

        1
        2
        3
        = ['cat''dog','bird''pig','spam']
        for k, animal in enumerate(L):
            print(k, animal)
        cs










        Tuple


        튜플의 + 연산

        1
        2
        = (1,2,3)
        t + ('adsl','adsp')
        (1, 2, 3, 'adsl', 'adsp')
        cs



        튜플: 변경 불가능(immutable)


        튜플 패킹(Tuple packing): 튜플안에 어려 종류의 데이터를 보관

        >>> t = 1,2, 'hello'


        튜플 언패킹(Tuple unpacking): 튜플에서 데이터를 꺼내오는 것

        >>> x, y, z = t  (튜플에 x,y,z을 할당)


        리스트와 튜플의 차이

        리스트와의 차이

        메소드를 가지지 않는다.


        튜플을 사용하는 경우

        1) 함수에서 리턴을 2개 이상할 때, 튜플로 묶어서 리턴

        2) 문자열 포매팅

        1
        print('id: {}, name: {}'.format('kkk','jjjj'))
        cs

        3) 튜플에 있는 값을 함수의 인수로 사용할 때

        1
        2
        args=(4,5)
        calc(*args)
        cs

        4) 그외 고정된 값을 표현하기 위해







        Dictionary


        Key 와 value을 이용한 자료형식 구조이다. 

        Key에는 문자, 논리, 튜플, 대소문자를 구별해서 같은 글자를 넣을 수 있다. 완전히 대소문자까지 똑같이 입력할 수는 없다. DISTICT해야한다.

        한편, Value는 딕셔너리, 문자 , 논리, 리스트를 사용할 수 있으면 중복이되어도 상관이 없다. 위에서 key을 이용하였기 때문에, 자료의 순서가 없다. 따라서, 자료의 순서를 이용해서 입출력을 하는 append, extend, insert의 함수를 사용할 수 없다. 단, pop은 key을 인자로 제공한다면, 사용할 수는 있다.


        Dic.items(): (key,value)을 리턴

        Dic.get('key')

        Dic.setdefault('key', 'value'): key가 없으면, 키/값을 새로 만들어준다.

        Dic.popitem(): list의 pop과 동일

        key in D: 멤머십테스트 D가 key을 가지고 있으면 True

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        # keys, values 출력
        my_dic = {'fruit':'apple''number':1'sport':'golf'}
        print('-'*20"keys")
        for fav in my_dic:
            print(fav)
        #---------------------------
        for fav in my_dic.keys():
            print(fav)
        #---------------------------
        print('-'*20"values")
        for value in my_dic.values():
            print(value)
        #---------------------------
        print('-'*20"items")
        for pair in my_dic.items():
            print(pair)
            
        # Key의 중복
        dict_data2 = {1:'hello'0:'World', True:'Nice'}
        len(dict_data2) # 1이 True 여서 중복으로 하나만 들어간다. 마지막 원소로 덮어쓴다
        dict_data2[3= {'abc'}
        dict_data2['False'= 'zzzzz'
        print(dict_data2)
         
         
        cs


        위의 예제에서, key의 중복을 보면, True와 1은 동일한데 삽입된다. 그렇지만, 1이 True이기고, 앞에서부터 순차적으로 저장한다고 생각한다면 1이 덮어씌워져서 True(1)이 들어가고 그에대한 value로 nice가 입력되게 된다.



        Dictionary의 중복

        딕셔너리는 데이터를 참조할 때 주의해야하는 사항이 있는데, 파이썬은 바로 스텍구조의 자료형에 값을 갖지 않고, 객체를 가지고 주소를 참조한다. 예를 들어서, dictionary2와 dictionary1이 있다고 했을 때, dictionary 1= dictionary2을 하면 같은 각각 객체에 다른 데이터를 가지고 있는게 아니라, 주소가 같아서 같은 데이터를 참조한다. 즉 스텍에 있는 자료구조가 Heap이라는 공간에 값을 할당하여 찾는 구조인데, 주소가 똑같기 때문에 Heap에 자료값이 변경되면, 두 자료모두 변경될 수 있다. 아래의 예제를 통해 확인해보자.




        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
         
        d1 ={1:102:10}
        d2 = d1
        print(id(d1), id(d2)) # 주소값이 같다
         
        d2[1= 30 #한쪽만 데이터를 변경한다.
        print(d1, d2) # 그러나, 데이터가 같다.
         
        # 데이터의 변환이 안일어나가 하려면 Copy해야한다.
        # 그러나, Slicing한 경우는 equal 같은 이퀄이 아니라 값이 안바뀐다.
        l1 = [1,2,3,4,5,6,7,8,9,10]
        l2 = l1[0:5]
         
        print(l1, l2)
        del l1[2:6]
        print(l1, l2)
         
        #L
        l1 = [1,2,3,4,5,6,7,8,9,10]
        l2 = l1.copy()
        l1.pop()
        print(l1,l2) # 다르게 출력된다.
         
         
        cs


        위의 예제를보면 list을 Copy하는 경우는 주소값이 따로따로 있기때문에 한쪽 자료를 변경하여도 모두 영향을 받지 않는다. Copy는 리스트나 딕셔러니 구조에서 사용가능하다.


        Set


        Set.issubset(set)

        Set.issuperset(set):

        Set.union(set):

        Set.intersec(set):










        Array module


        Array(typecode [, initializer]): 새 배열을 생성한다.

        typecode에는 i는 Signed integer(최소 2바이트)

        1
        2
        3
        4
        5
        from array import *
        = array('i'range(10)) # 어레이 생성
        a.append(5)
        a.insert(510# 5위치에 10을 입력
        a.extend(array('i',[12,3,4,5])) 
        cs



        디렉토리의 파일 목록 얻기


        OS, glob 패키지

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        #파일의 추가정보를 알아내기
        import os
        import glob
        fileList = glob.glob('*')
        for name in fileList:
            if os.path.isfile(name):
                print('파일')
            elif os.path.isdir(name):
                print('directory')
            elif os.path.islink(name):
                print('link')
        cs




        if 문에서 continue 와 break활용

        1
        2
        3
        4
        for x in range(10):
            if x < 8:
                continue # x <8인 조건을 맞을 떄, 계속 for의 위로 올라간다.
            print(x)
        cs



        Decimal: 계산결과를 10진법으로 오류없이 출력해야하는 경우

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        =0.0
        for k in range(10000):
            e += 0.00001
        print(e) #0.099999939
         
        = Decimal('0.0')
        delta = Decimal('0.00001')
        for k in range(10000):
            e += delta
        print(e) # 0.100000
         
        import math, cmath
        = Decimal('123.567')
        print(math.sqrt(d)) #11.116~
        print(cmath.sqrt(-d)) #11.16.....j
        print(d.sqrt())
        print(d.quantize(Decimal('0.01'), rounding=ROUND_DOWN)) #0.01
        cs


        지수 연산자

        >>> 5 % -3 #파이썬 나머지는 젯수(나누는 값)의 부호와 같다. 5 = -3 * -2 + 1

        >>> --3 # 

        result: 3 -(-3)

        지수연산자는 오른쪽부터 순서대로 계산한다. 따라서, 

        2**3**5와 (2**3)**5의 계산은 다르다.


        관계연산자: >, <, >=, <=








        string type의 관계연산자의 크기비교

        비교시에 길이가 다른 경우도 비교가 가능하다

        >>> 'abcd' > 'abc'

        False

        >>> 'abc' < 'abcd'

        True

        위의 경우에서는 같은 인덱스끼리의 크기 비교를하고, 같으면 다음 순서도 비교를한다. 


        자료형간의 순서

        숫자 < 사전 < 리스트 < 문자열 < 튜플


        boolean으로 논리연산을 판단할 때, 공집합은 무조건 False이고, 아니면 True이다.



        문자열 포맷팅


        %s: 문자열 입력대체할 부분에 '%s' 라고 적은 후, 문장종료(따옴표 종료) 후, %"삽입할 말"을 적는다.

        %d: 정수

        %f: 부동소수

        숫자가 같이 있으면 차지하는 캉을 의미 

        %10s이면 앞에 10칸을 

        %-10오른쪽 

        %0.2f : 소수점 2째자리면 표현됨.

        파이썬 3에서는 str.format지원

        인덱싱도 가능

        print("session:{2}, val:{1}, loss:{0]".format(

        키워드도 가능



        반응형