[PYTHON]파이썬

신동혁·2022년 8월 12일
0

PYTHON

목록 보기
1/8

1.프로그래밍이란?

코딩이라고도 불린다. 프로그래밍은 로직을 작성하는 작업을 뜻하고 이런 작업을 하기 위한 언어가 프로그래밍 언어다. 범용적인 프로그래밍 언어로는 자바, 파이썬, C언어 등이 있고 특수 목적의 언어로는 SQL, R 등이 있다.

코드 실행 방식

  • compile 방식( 대표적 언어 : 자바 )
    • OS에 종속적이므로 OS별로 따로따로 만들어줘야 실행된다.
    • 코드 전체를 기계어로 변경 후 실행
    • 컴파일러 사용
  • interpreted 방식( 대표적 언어 : 파이썬 )
    • OS에 독립적이므로 OS별로 따로따로 만들지 않아도 된다.(대신 Interpreter와 추가한 라이브러리라는 실행환경이 설치되어 있어야 한다)
    • 소스코드 바로 실행
    • 인터프리터 사용

2.파이썬(python)이란?

1991년 네덜란드 프로그래머 귀도 판 로섬(Guido van Rossum)이 만든 프로그래밍 언어로 가독성에 가장 큰 목적을 두고 만들었다.

3.파이썬 3rd party library 저장소 : PyPI(Python Package Index)

자바에서 maven과 같은 역할로 3rd party library들이 저장되는 저장소다. 자바에서는 각 어플리케이션마다 메이븐을 따로 만들어야 하지만 파이썬의 경우 한 번 pypi에 라이브러리를 다운받으면 여러 어플리케이션에서 모두 사용 가능하다. maven은 개별 저장소, pypi는 통일 저장소라고 생각하면 쉽다. 또한 자바는 dependency설정을 통해 라이브러리를 받지만, 파이썬은 pip라는 프로그램을 이용해 라이브러리를 다운받는다.

주요 명령어

  • pip install 라이브러리명
  • pip install 라이브러리명 --upgrade
  • pip list
  • pip show 패키지명
  • pip install -upgrade pip

4.변수

  • 선언 및 초기화 : 선언과 초기화가 같이 되어야 한다. 선언만 할 수 없고, 넣을 값이 없다면 None으로 초기화해야 한다( null 아님!!! )
  • 동적타입 : 변수란 데이터를 담는 메모리 공간이다. 파이썬은 변수를 선언할 때 타입을 선언하지 않는다. 그래서 a라는 변수를 선언했을 때 a는 초기화 값에 따라 정수가 될 수도 있고, 문자열이 될 수도 있다.
  • 변수명 : 특수문자는 언더바(_)만 사용할 수 있고, 영어 외에 한글, 한자 등 모든 일반 문자를 사용할 수 있다. 또한 대소문자 구별이 가능하다.( 예약어는 사용불가 )
  • 스네이크 표기법 : 소문자로 늘여쓰고 의미가 다를 때마다 언더바(_)로 구분 ( ex. list_name)
  • 튜플 대입 : a, b, c = "안녕", "하세", "요" ( '변수개수 = 값개수' 를 만족해야한다 )

4.1 지역변수 / 전역변수

지역변수는 로컬변수라고도 하고, 전역변수는 글로벌변수라고도 한다.

  • 지역변수 : 함수나 메서드 안에 선언된 변수
    • 호출가능 범위 : 선언된 함수나 메서드 안에서만 호출 가능
  • 전역변수 : 함수나 메서드 밖에 선언된 변수
    • 호출가능 범위 : 모든 범위

ex)

def test(x):
    y=10
    return x+y
test(10)
print(x) # 오류
print(y) # 오류

다음 예제에서 x,y는 test함수 안에서 선언된 지역변수로 함수 밖에서 따로 x나 y로 호출이 불가하다.

ex)

a = 1
def test2():
    return a
test2()
print(a)

다음 예제에서 a는 함수나 메서드 안에서 선언되지 않아서, test2함수 안에서도 호출이 가능하고 함수 밖에서 따로 a로 호출이 가능하다. 이때 조심해야 할 것이 전역변수의 함수 안에서 호출과 초기화의 차이다. 위 예제처럼 전역변수를 함수 안에서 조회만 하는 것은 가능하지만, 함수 안에서 전역변수값을 변경하고 싶다면 따로 처리를 해주어야 한다. 그렇지 않는다면 어떻게 될까?

a = 1
def test2():
    a = 2
    return a
test2() # 2 출력
print(a) # 1 출력

위와 같이 함수 안에서 전역변수와 같은 변수명의 값을 대입했을 때, 전역변수 a를 가져오는 것이 아닌 test2 함수만의 지역변수 a를 만들고 이 변수에 2값을 넣는다. 그러므로 전역변수 a값은 그대로 1로 유지되게 된다. 전역변수를 함수 안에서 바꾸고 싶다면 "global"이라는 키워드를 이용한다.

a = 1
def test2():
    global a
    a = 2
    return a
test2() # 2 출력
print(a) # 2 출력

global을 통해 함수 안에서 전역변수를 불러와 값을 변경하는 모습을 볼 수 있다.

5.데이터 타입

  • 숫자
    • 정수 : int
    • 실수 : float
  • 문자열 : str
  • 논리형 : bool(True/False)

6.자료구조

  • 리스트 : []사용, 순서(인덱스) O, 원소값 추가/삭제/변경 O
  • 튜플 : ()사용, 순서(인덱스) O, 원소값 추가/삭제/변경 X
  • 딕셔너리 : {}사용, 순서(인덱스) X
  • 셋 : {}사용, 순서(인덱스) X, 중복 X

7.함수

  • 선언
    • def 함수명(파라미터):
  • 기본적으로 함수는 return None을 디폴트값으로 가짐
  • 가변인자
    • * args : 여러 파리미터를 튜플 형식으로 받음
    • ** kwargs : 여러 파라미터를 딕셔너리 형식으로 받음

7.1 (지역)로컬함수

  • 클로저(Closure) : 로컬함수가 사용하는 외부함수의 지역변수는 외부함수가 종료되어도 로컬함수가 종료될 때까지 메모리에 유지되도록 하는 구조

8.클래스

  • 선언
    • class 클래스명:
  • 파이썬에서 클래스는 딕셔너리 구현체라고 생각하면 쉽다. 이것이 자바에서 클래스와 다른점인데, 파이썬은 클래스를 객체로 만들면 객체마다 다르게 속성값을 설정할 수 있어서 같은 클래스의 객체들이라도 속성값이 모두 다를 수 있다.
  • 클래스 메서드(class method) / 클래스 변수 : 클래스 공통 메서드, 공통 변수
    • 클래스 메서드 선언
      • @classmethod 데코레이터 사용
      • 이름은 관례적으로 clz / clazz 사용
      •  @classmethod
         def 클래스메서드명(clz, 매개변수들):
             return 
    • 클래스 변수 선언 : 클래스 구현부에 변수 선언
  • 정적 메서드(static method) : 객체와도 상관없고 클래스 변수와도 상관없는 메서드를 의미한다. 즉, 내용과 상관없는 단순 기능을 구현하기 위한 메서드다.
    • 선언
      • @staticmethod 데코레이터 사용
  • 인스턴스 메서드(instance method) : 특수 메서드 이외의 원하는 기능을 가진 함수를 만들고 싶을 때 생성한다.
    • def 메서드명( self , 추가 매개변수 선언 ):
          self.속성명 =
  • 생성자(initializer) : 클래스로부터 객체를 생성할 때 속성값을 초기화하는 특수 메서드. 즉 객체들이 가질 공통속성을 초기화해준다.
    • def __init__( self , 추가 매개변수 선언 ):
          self.속성명 =
    • self 매개변수 : 자바에서의 this와 비슷하다. self 매개변수는 메서드의 첫번째 매개변수로 필수적이다. 이는 현재 객체를 받는 매개변수다.
  • 특수 메서드(special method) : 클래스에 정의하는 약속된 메서드로 객체가 특정한 상황이 되면 알아서 실행되는 메서드를 뜻한다. 위에서 설명한 생성자(initializer)와 같이 기본적으로 제공되는 클래스 메서드들이 있다.( 매직 메서드(magic method), 던더 메서드(dunder method : double underbar method)라고도 불린다 )
    • __init__(self, instance변수로받을매개변수들) : 위에서 설명함
    • __dict__ : 클래스나 객체가 가진 속성값을 딕셔너리 구조로 반환
    • __doc__ : 클래스나 객체가 가진 도움말(doc, 큰따움표 세개씩으로 둘려쌓인 도움말) 문자열 반환
    • __del__(self) : 소멸자(finalizer)라고 부르고 객체가 소멸되기 직전에 호출된다.
    • __call__(self, 매개변수들) : 객체를 함수처럼 호출. ( ex. "객체명(매개변수들)"처럼 호출하면 해당 메서드가 실행된다. )
    • __repr__(self) : 자바에서 toString()과 비슷하다. 객체명만 입력하고 실행했을 때 실행되는 특수 메서드다. 보통 객체를 만들 수 있는 명령어를 문자열 형태로 반환해서 eval()에 매개변수로 넣으면 객체가 생성될 수 있는 형태를 띈다.
    • __str__(self) : 자바에서 toString()과 비슷하다. print()를 사용했을 때나(print()는 내부적으로 str으로 매개변수를 바꿔줌) str()으로 변환했을 때 실행되는 특수 메서드다. 문자열로 출력할 때 어떻게 출력할지 구현하는 부분이다.
    • __eq__(self, other) : 동등연산자(==)이 실행될 때 호출되는 메서드다.
      • 보통 두 객체가 같은 속성값을 가지고 있으면 같다라고 표현하고 싶은 경우가 많다. 이 경우의 코드를 예로 들어본다.

        def __eq__(self, other):
            result = False
            if isinstance(other, type(self)):
                if self.속성값==other.속성값 and ... :
                    result = True
            return result
    • __gt__(self, other) : 비교연산자(>)이 실행될 때 호출되는 메서드다.
    • __lt__(self, other) : 비교연산자(<)이 실행될 때 호출되는 메서드다.
    • __ge__(self, other) : 비교연산자(>=)이 실행될 때 호출되는 메서드다.
    • __le__(self, other) : 비교연산자(<=)이 실행될 때 호출되는 메서드다.
    • __ne__(self, other) : 비교연산자(!=)이 실행될 때 호출되는 메서드다.
    • __add__(self, other) : 산술연산자(+)이 실행될 때 호출되는 메서드다.
    • __sub__(self, other) : 산술연산자(-)이 실행될 때 호출되는 메서드다.
    • __mul__(self, other) : 산술연산자(*)이 실행될 때 호출되는 메서드다.
    • __truediv__(self, other) : 산술연산자(/)이 실행될 때 호출되는 메서드다.
    • __floordiv__(self, other) : 산술연산자(//)이 실행될 때 호출되는 메서드다.
    • __mod__(self, other) : 산술연산자(%)이 실행될 때 호출되는 메서드다.

8.1 정보은닉(자바에서의 접근제어자 역할)

자바에서는 접근제어자 private, public 등을 이용해서 변수나 메서드를 외부에서 호출할 수 있는 정도에 대해 관리했었다. 하지만 파이썬에서는 접근제어자가 따로 존재하지 않는다. 그래서 파이썬에서는 접근 제한이 불가하다. 그나마 접근 제한 비슷하게 할 수 있는 방법이 언더바 2개를 변수명이나 메서드명 앞에만 붙여서 이용하는 방법이다.

  • ex)
    class Person:
        def __init__(self, name, age, address=None):
            self.__name = name
            self.__age = age
            self.__address = address
    p = Person()
print(p.__name) # 오류!!
print(p._Person__name) # 성공!!
```

위의 예제와 같이 언더바 2개를 변수명이나 메서드명 앞에 붙일 경우 변수명이나 메서드명이 "_클래스명__변수명/메스드명"으로 바뀌므로 바뀐 이름으로 호출해야 한다. 즉, 아예 접근을 제한하는 것이 아니라 이름만 살짝 바꾸어 원래 이름으로 접근했을 때 막는 정도이다. 바뀐이름으로 호출한다면 접근을 막을 방법은 없다.

8.2 getter/setter와 property

def __init__(self, name):
    self.__name = name

def set_name(self, name):
    self.__name = name

def get_name(self):
    return self.__name

위에서 설명한 언더바2개를 이용한 정보은닉 방법을 통해 클래스의 속성"name"이 "객체명.name"으로 호출되지 못하도록 설정했다. 그리고 set_name과 get_name 메서드를 생성해 "객체명.set_name("바꿀이름")", "객체명.get_name()"을 통해 name에 대한 값을 변경하거나 조회할 수 있도록 했다. 이때 property를 쓰면 set_name과 get_name을 더 쉽게 사용할 수 있게 된다.

프로퍼티명 = property(get메서드, set메서드)

클래스 안에 다음과 같이 설정하면 "객체명.프로퍼티명", "객체명.프로퍼티명 = 새로운값" 이 두 형태를 알아서 인식해서 전자는 get, 후자는 set을 자동으로 해준다.

9.객체

  • 선언
    • 객체명 = 클래스명()
  • 속성 선언
    • 객체명.속성명 = 값

10.상속

기존 클래스를 확장하여 instance 변수나 메서드를 추가하는 방식을 의미한다.

  • 구분

    • 물려주는 클래스를 의미하는 용어 : 기본(base) 클래스 / 상위(super) 클래스 / 부모(parent) 클래스
    • 물려받는 클래스를 의미하는 용어 : 파생(derived) 클래스 / 하위(sub) 클래스 / 자식(child) 클래스
  • 선언

    • class 클래스명( 상속받을 클래스명 ):
  • 메서드 재정의 : 부모 클래스의 메서드의 구현부를 자식 클래스에서 재구현하는 것.

    • 부모 클래스의 메서드명을 그대로 다시 선언해서 새로 구현하면 됨.( ex.부모클래스의 abc라는 메서드가 있을 시, 자식클래스에서 def abc(self): 이런식으로 새로 정의하면 재정의된다.)
  • super() : 부모클래스의 instance를 자식클래스에 반환해준다. 즉, 부모클래스의 메서드를 호출할 수 있게 해준다.

    • ex. A클래스를 상속받은 B클래스가 있다고 가정할 때, B클래스에 대한 객체를 생성하면 상속받고 있는 A클래스의 A객체도 같이 생성되게 된다. 그러므로 이때 B클래스에서 A클래스의 메서드를 사용하고 싶다면 B클래스 안에서 "super().A객체메서드" 이런식으로 A클래스 메서드의 호출이 가능하다.
  • MRO(Method Resolution Order) : 파이썬은 다중상속을 지원하기 때문에 A라는 클래스가 있을 때 동시에 여러 클래스를 상속받을 수 있다. 이때 문제가 생길 수 있다. 만약 상속받을 클래스들 중에서 같은 이름의 메서드들이 존재한다면 A클래스는 어떤 클래스의 메서드를 상속받아야 할까? 이를 해결하기 위한 방법이 MRO이다. MRO는 메서드 호출 순서로 다음과 같다.

      1. 자기자신
      1. 상위클래스 : 다중상속일 경우 가장 먼저 상속받은 클래스부터 찾는다.( ex. class A(B,C,D): 이런식으로 상속을 받았으면 B,C,D 순으로 탐색 )

11.모듈과 패키지

11.1 모듈

독립적인 기능을 가지고 재사용가능한 프로그램 단위를 모듈이라고 한다. 즉, py 확장자를 가진 하나의 파일이 모듈이 된다. 이런 모듈 중 외부 모듈을 사용하기 위해서는 import를 사용해서 외부 모듈을 불러와야 사용이 가능하다.

  • 기본적인 모듈 import 방법 : import 패키지명.불러올모듈명 as 모듈명대신사용할별칭 / from 패키지명 import 불러올모듈명 as 모듈명대신사용할별칭
  • 특정 모듈에서 함수나 클래스 import 방법 : from 패키지명.불러올모듈명 import 특정함수명/클래스명 as 별칭
    이때, 아스타리스크(*)를 이용해서 해당 모듈의 모든 요소를 가져온다는 명령도 가능한데 이런 작업은 좋지 않다. 왜냐하면 불러오려는 모듈 속 함수명이 내가 작성하고 있는 모듈 속 함수명과 같다면 나중에 호출된 것이 먼저 호출된 것을 덮어버리는 상황이 발생할 수 있기 때문이다. 그래서 내가 어떤 이름의 함수나 클래스를 불러오는 지를 알고 있을 때만 아스타리스크(*)사용이 권장된다.

또한 기본적인 import 가능 범위는 해당 모듈과 같은 영역과 그 하위 영역이다. 즉, A라는 디렉토리가 있고 이 안에 내가 작성 중인 모듈이 있다면, import를 이용한 외부 모듈 호출을 A디렉토리에 속하거나 A디렉토리 하위에서만 할 수 있다. 이때 기본적인 범위 밖의 경로에 있는 모듈을 호출하고 싶다면 해당 모듈이 존재하는 root디렉토리를 운영체제 환경설정에 등록해야 한다.
ex) 내PC -> 속성 -> 고급 시스템 설정 -> 환경변수 -> 새로 만들기(시스템 변수) -> 변수 이름 작성 후 변수 값은 디렉터리 찾아보기로 해당 모듈 경로 등록 -> 확인 -> 확인

11.2 패키지

모듈의 집합체다. 디렉토리가 패키지가 되기 위해서는 "__init__.py"파일이 존재했어야 했다. 하지만 이 부분은 파이썬 3.3부터 개선되어 더 이상은 필요없어졌다.

12.예외처리

자바는 컴파일하면서 예외를 잡지만 파이썬은 인터프리트 형식이므로 코드를 실행시킬 당시에 예외가 잡힌다.

  • 예외(Exception) : 함수나 메서드가 처리 도중 다음 명령문을 실행하지 못하는 상황
    • 사용자 정의 Exception 클래스 만들기
      class 사용자정의Exception명(Exception):
          # 구현
  • 예외처리
    • try:
          # 원하는 명령
      except(잡고싶은예외클래스명):
          # 예외처리 후 명령
      finally:
          # 예외처리와 상관없이 마지막에 무조건 실행되는 문장
  • 예외발생시키기
    • raise 예외클래스명

13.IO(input,output 입출력)

  1. 연결 : open("연결파일주소", "모드". "인코딩방식")
    • 모드
      • r : read
      • w : write
      • a : keep writing
  2. 입력 : read(), readline(), readlines()
  3. 출력 : write()
  4. 연결종료 : close()

예시코드

txtfile = open("open할 파일주소와 파일명,"w")
txtfile.write("안녕하세요")
txtfile.close()
# 파일을 하나 열고(open할 파일 주소에 해당하는 파일이 있으면 있던 파일 열어서 새로작성, 없었으면 새로 만들기)
# "안녕하세요"라는 문구를 작성 후 저장하고 연결종료했다

이때 파이썬은 연결을 시작했다 종료를 무조건 해줘야 하는데, 이것이 번거로워서 생긴 것이 "with"이다. 따로 연결을 종료하지 않아도 모든 작업이 끝나고 알아서 연결이 종료된다.

with open("open할 파일주소와 파일명", "w") as f:
    f.write("안녕하세요")

14.Iterable과 Iterator

  • Iterable : 제공할 원소들을 가지고 있는 객체 + iterator 제공
    • __iter__(self) 구현 : iterator를 생성해서 반환
    • 즉, iter(iterable)로 iterator 호출
  • Iterator : 자신을 생성한 iterable 원소들을 caller에게 제공하는 역할
    • __next__(self) 구현 : iterable원소를 하나씩 제공. 모두 제공하면 StopIteration Exception발생시킴
    • 즉, next(iterator)로 원소 하나씩 호출

ex)

class MyIterator:
    def __init__(self, iterable):
        """
        제공해줄 원소를 가지고 있는 iterable을 인자로 받아서 attribute로 저장
        몇번째 원소를 제공했는지를 저장할 attribute(index)도 저장
        """
        self.iterable = iterable
        self.index = 0
    
    def __next__(self):
        """
        Iterable원소를 next()호출할 때마다 하나씩 제공해주는 메서드
        """
        values = self.iterable.values
        if self.index < len(values):
            ret_value = values[self.index]
            self.index+=1
            return ret_value
        else:
            raise StopIteration()
class MyIterable:
    def __init__(self,*args):
        """
        initializer에서 가변인자를 통해 제공해줄 값들을 tuple로 받아 저장
        """
        self.values = args
        
    def __str__(self):
        """
        제공할 원소들을 가진 tuple을 문자열로 반환
        """
        return str(self.values)
        
    def __iter__(self):
        """
        원소들을 하나씩 제공할 iterator객체 반환
        """
        print("MyIterator호출")
        return MyIterator(self)



test = MyIterable(100,3213,541,453,1231) # Iterable한 MyIterable클래스 객체 test를 생성
test_iterator = iter(test) # test의 Iterator인 test_iterator 생성
next(test_iterator) # 100 출력
next(test_iterator) # 3213 출력
next(test_iterator) # 541 출력
next(test_iterator) # 453 출력
next(test_iterator) # 1231 출력
next(test_iterator) # StopIteration 발생

15.Generator

Iterable과 Iterator를 합친 기능을 함수 형태로 구현한 것이다.

  • 장점
    • 구현이 Iterable, Iterator에 비해 간단한다
    • 제공할 원소들을 미리 메모리에 올리지 않는다(lazy loading 느낌)
  • 값 반환 형태
    • yield : generator의 반환타입으로 반환값을 가지고 호출한 곳으로 돌아간다

ex)

def my_gen(): # yield를 사용해 generator생성
    v=10
    yield v
    
    v+=10
    yield v
    
    v+=12
    yield v

a= my_gen()
next(a) # generator가 호출되어서 yield를 만나면 일시정지한다 -> 10
next(a) # 일시정지된 위치에서 시작해 다시 yiedl를 만나면 일시정지한다 -> 20
next(a) # 일시정지된 위치에서 시작해 다시 yiedl를 만나면 일시정지한다 -> 32
next(a) # 일시정지된 위치에서 시작해 다시 yiedl를 만나면 일시정지한다. 이때는 다음 yield가 없어서 return None이 되고 StopIteration 예외가 발생한다

16.Decorator

@(어노테이션)을 이용해서 핵심함수에 전처리, 후처리 등을 해주는 방식을 의미한다.

ex)

def MyDecorator(func):
    def wrapper():
        print("전처리작업")
        func()
        print("후처리작업")
    return wrapper

@MyDecorator
def CoreFunc():
    print("핵심작업")

    
CoreFunc()
# 출력화면은 다음과 같다
# 전처리작업
# 핵심작업
# 후처리작업 

위 예제와 같이 어노테이션을 이용해 @MyDecorator를 CoreFunc함수 위에 설정해주면 해당 CoreFunc함수가 MyDecorator함수에 매개변수로 넣어져 실행되는 모습을 확인할 수 있다.

17.DB연결

pymysql 모듈을 사용한 방법을 설명한다.

  • 모듈 호출 : (pip install pymysql로 다운 후)import pymysql
  • DB 연결 : conn = pymysql.connect(host="DBMS 서버 ip",
    port="port번호",
    user="계정명",
    password="비밀번호",
    db="연결할데이터베이스이름",
    charset='utf8')
  • 커서 생성 : cursor = conn.cursor()
  • SQL문 DB로 전송 : cursor.execute("sql문")
    • sql문 형태 / 실행 메서드
      • Parameterized Query : sql문 작성시 %s를 이용해서 포매팅으로 원하는 값을 넣어주는 방식이다. %s에 해당하는 값들은 커서를 execute할 때 매개변수로 sql문 뒤에 넣어준다.
      • executemany() : 위 parameterized query를 여러 변수를 넣어가며 여러번 실행하고 싶을 때 커서에 사용하는 메서드다.
      • select문
        • fetchall() : 조회한 모든 행 반환
        • fetchmany(size=개수) : 지정한 개수만큼 반환
        • fetchone() : 첫번째 행만 반환
  • 연결끊기 : cursor.close(), conn.close() (이때 따로 연결 종료가 귀찮다면 conn과 cursor객체 생성 시 with문을 이용하면 된다)
profile
개발취준생

0개의 댓글