본문 바로가기

명사 美 비격식 (무리 중에서) 아주 뛰어난[눈에 띄는] 사람[것]

SK 네트웍스 AI 캠프

SK 네트웍스 AI 캠프 - 1_프로그래밍 데이터 기초 - Day6_파이썬 모듈과 패키지

파이썬의 에러의 종류

raise로 에러를 일부러 발생해 볼 수 있다.

Built-in Exceptions — Python 3.14.5rc1 documentation

 

Built-in Exceptions

In Python, all exceptions must be instances of a class that derives from BaseException. In a try statement with an except clause that mentions a particular class, that clause also handles any excep...

docs.python.org

def exception_hierarchy():
    'https://docs.python.org/3/library/exceptions.html#exception-hierarchy'
    try:
        # 테스트를 위해 아래 에러 중 하나를 발생시켜 보세요.
        raise FloatingPointError("FloatingPointError")
        """
            raise ArithmeticError("ArithmeticError")
            raise FloatingPointError("FloatingPointError")
            raise OverflowError("OverflowError")
            raise ZeroDivisionError("ZeroDivisionError")
            raise AssertionError("AssertionError")
            raise AttributeError("AttributeError")
            raise BufferError("BufferError")
            raise EOFError("EOFError")
            raise ImportError("ImportError")
            raise LookupError("LookupError")
            raise MemoryError("MemoryError")
            raise NameError("NameError")
            raise OSError("OSError")
            raise ReferenceError("ReferenceError")
            raise RuntimeError("RuntimeError")
            raise StopAsyncIteration("StopAsyncIteration")
            raise StopIteration("StopIteration")
            raise SyntaxError("SyntaxError")
            raise SystemError("SystemError")
            raise TypeError("TypeError")
            raise ValueError("ValueError")
            raise Warning("Warning")
            raise Exception("Exception")

        """ 

    except ArithmeticError as a:
        print(f"ArithmeticError : 연산자 오류")
        if isinstance(a, FloatingPointError):
            print(f"{a} : 숫자 오류")
        elif isinstance(a, OverflowError):
            print(f"{a} : 넘버 오류")
        elif isinstance(a, ZeroDivisionError):
            print(f"{a} : 분자 오류")
            
    except AssertionError as a:
        print(f"{a} : 테스트 오류")
    except AttributeError as a:
        print(f"{a} : 속성 오류")
    except BufferError as b:
        print(f"{b} : 버퍼 오류")
    except EOFError as e:
        print(f"{e} : 에러 문자열 오류")
        
    except ImportError as i:
        print(f"ImportError : 임포트 오류")
        if isinstance(i, ModuleNotFoundError):
            print(f"{i} : 모듈 오류")
            
    except LookupError as l:
        print(f"LookupError : 참조 범위 오류")
        if isinstance(l, IndexError):
            print(f"{l} : 인덱스 오류")
        elif isinstance(l, KeyError):
            print(f"{l} : 키 오류")
            
    except MemoryError as m:
        print(f"{m} : 메모리 오류")
    except NameError as n:
        print(f"NameError : 이름 오류")
        if isinstance(n, UnboundLocalError):
            print(f"{n} : 로컬 변수 오류")
            
    except OSError as o:
        print(f"OSError : 시스템 오류")
        if isinstance(o, BlockingIOError):
            print(f"BlockingIOError : 블록 오류")
        elif isinstance(o, ChildProcessError):
            print(f"{o} : 자식 프로세스 오류")
        elif isinstance(o, ConnectionError):
            print(f"ConnectionError : 연결 오류")
            if isinstance(o, BrokenPipeError):
                print(f"{o} : 브로큰 파이프 오류")
            elif isinstance(o, ConnectionAbortedError):
                print(f"{o} : 연결 중단 오류")
            elif isinstance(o, ConnectionRefusedError):
                print(f"{o} : 연결 거부 오류")
            elif isinstance(o, ConnectionResetError):
                print(f"{o} : 연결 재설정 오류")
        elif isinstance(o, FileExistsError):
            print(f"{o} : 파일 이미 존재함")
        elif isinstance(o, FileNotFoundError):
            print(f"{o} : 파일 찾을 수 없음")
        elif isinstance(o, IsADirectoryError):
            print(f"{o} : 디렉토리 오류")
        elif isinstance(o, PermissionError):
            print(f"{o} : 권한 오류")
        elif isinstance(o, TimeoutError):
            print(f"{o} : 타임아웃 오류")
            
    except ReferenceError as r:
        print(f"{r} : 참조 오류")
        
    except RuntimeError as r:
        print(f"RuntimeError : 런타임 오류")
        if isinstance(r, NotImplementedError):
            print(f"{r} : 미구현 오류")
        elif isinstance(r, RecursionError):
            print(f"{r} : 재귀 한도 초과 오류")
            
    except StopAsyncIteration as s:
        print(f"{s} : 비동기 순회 종료")
    except StopIteration as s:
        print(f"{s} : 순회 종료")
        
    except SyntaxError as s:
        print(f"SyntaxError : 문법 오류")
        if isinstance(s, IndentationError):
            print(f"IndentationError : 들여쓰기 오류")
            if isinstance(s, TabError):
                print(f"{s} : 탭/공백 혼용 오류")
                
    except SystemError as s:
        print(f"{s} : 시스템 내부 오류")
    except TypeError as t:
        print(f"{t} : 타입 오류")
        
    except ValueError as v:
        print(f"ValueError : 값 오류")
        if isinstance(v, UnicodeError):
            print(f"{v} : 유니코드 오류")
            
    except Warning as w:
        print(f"{w} : 경고 발생")
        
    except Exception as e:
        print(f"{type(e).__name__}: {e} (기타 예외 캐치)")

if __name__ == '__main__':
    exception_hierarchy()

 

 

 

 

 

*가변매개변수

매개변수를 받을때 *를 붙이면 여러개의 값을 받을 수 있다. 

def max(*args):
    try:
        max_value = args[0]
        for i in range(1, len(args)):
            if args[i] > max_value:
                max_value = args[i]
        return max_value
    except:
        return None
    

if __name__ == "__main__":
    print(max(1, 2, 3, 4, 5))

 

 

 

is None = 값이 없는가?

 

 

 

 

키워드 리스트 및 모듈 소스파일 경로 확인하기

~list, __file__

 

 

 

 

 

 

 

모듈 확인하기

help('modules')

 

 

 

 

 

 

특정 모듈 설명 조회하기

help('모듈명')

 

 

 

 

 

time.sleep(초단위), 잠시 잠들어라, 쉬어라 멈춰라

 

 

 

 

 

random() 아무 랜덤값

random.randint(처음, 끝) 제시된 값들 중 int 랜덤값

random.randrange(처음, 끝, 간격) 제시된 값들 중 간격에 맞는 랜덤값

 

 

 

 

 

math.pi 원주율

math.factorial()계승

 

 

 

 

calendar.prmonth(년도, 월) 달력 표시하기

 

 

 

 

print(__name__) 현재 실행되고 있는 모듈 확인

import로 내가 만든 코드를 불러와 쓸수있다. 이게 모델링.

 

 

 

 

 

pip install requests

python.exe -m pip install --upgrade pip

 

 

 

 

여러개를 동시에 다운받을 수도 있다. 

pip install numpy, pandas

 

 

 

 

 

 

 

패키지 만들어보기!

모듈작성하기

# project package
python_package/
|--- mypackage/
|    |--- __init__.py
|    |--- mymodule.py
|    |--- message.py
|--- README.md
|--- setup.py
|--- pyproject.toml

 

readme.md 작성

##README.md

# mypackage
mypackage is a python package

## Installation
```
pip install mypackage
```

## Usage
```
import mypackage
print(mypackage.hello())
```

# project package
python_package/
|--- mypackage/
|    |--- __init__.py
|    |--- mymodule.py
|    |--- message.py
|--- README.md
|--- setup.py
|--- pyproject.toml


## License
MIT License (MIT)

Copyright (c) 2017 Sanghee Park

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

 

 

 

setup.py 작성

 

from setuptools import setup, find_packages

setup(
    name='mypackage',
    version='0.1.0',
    description='mypackage is a python package',
    author='Sanghee Park',
    author_email='sanghee.park@gmail.com',
    url='https://github.com/sangheepark/mypackage',
    packages=find_packages(),
    install_requires=[],
    classifiers=[
        'Programming Language :: Python :: 3',
        'License :: OSI Approved :: MIT License',
        'Operating System :: OS Independent',
    ],
)

 

 

 

 

pyproject.toml 생성

pyproject.toml은 파이썬 개발환경에서 프로젝트 설정과 빌드 방식을 저으이하는 표준 파일. 예전에는 setup.py reuirements.txt setup.cfg 등으로 흩어져 있던 설정들을 하나로 통합하고 표준화하려는 목적으로 도입됬다. 어떻게 프로젝트를 빌드하고 어떤 도구를 쓸것인지 적어놓은 설계도


이 [build-system]섹션은 이 프로젝트가 어떤 도구를 사용하여 빌드될지를 명시해준다.

[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

 

requires = ["setuptools", "wheel"]
이 프로젝트가 빌드되기 위해 내 컴퓨터에 미리 설치되어야 하는 도구들

setuptools는 파이썬 패키지를 만들고 설치할때 가장 전통적을 사용하는 도구고, wheel은 파이썬 패키지를 설치하기 쉬운 형태인 .whl 파일로 만들어주는 도구인데 예전에는 수동으로 설치해야했지만 여기 적으면 pip가 빌드 시점에 알아서 준비한다.

 

 

 

 

pip install .

= 현재 디렉터리(.)에 있는 프로젝트를 내 파이썬 환경에 설치해라.
보통 외부라이브러리를 다운로드 할때는 pip install requests처럼 이름을 쓰지만 
내가 직접 만들고있는 패키지나 다운로드한 소스는 코드 폴더 안에서 pip install . 로 명한다.
이를 입력하면 pip는 현재 폴더에서 pyproject.toml혹은 setup.py를 찾아 프로젝트의 이름, 어떤 라이브러리가 추가로 필요한지 등을 확인해 설치를 진행한다.

 

 

 

 

 

 

pip list에서 해당 모듈을 확인 할 수 있다.

pip list

 

 

 

 

 

모듈 이름을 명시하면 요약내용을 볼 수 있다 .

이는 setup.py에 작성된 내용임을 알수있다.

pip show mypackage

 

 

 

 

 

test.py를 만들어 mypackage를 import해 함수를 사용해보자.

성공

 

 

 

 

 

배포용으로 만든다.

pip install bulid
python -m build

https://standout.tistory.com/1679

 

pip install build: dist 파일 안생길때

python -m build 명령어를 실행했는데 dist파일이 생기지않는다면 build 패키지 설치가 되지않았다는 말이다.설치 후 다시 실행하자.pip install bulid

standout.tistory.com

 

 

 

 

 

 

 

 

 

 

 

 

dist 폴더안에 ~.tar.gz   ~.whl  파일이 생겼다.

실제로 우리가 pip install pandas를 칠때 실제로 우리 컴퓨터에 다운로드 되는 대부분의 파일이 이 .whl이다. 결국 개발자가 코드를 다 짠 뒤 남들에게 줄때 가장 깔끔한 형태가 Wheel인셈

~.tar.gz: 백업용으로 모든 환경 대응용
~.whl: 배포용

https://standout.tistory.com/1680

 

Python 파이썬 모듈과 Wheel의 차이

모듈과 Wheel 모듈은 파이썬 코드 파일 그자체Wheel은 모듈은 포함해서 프로젝트 전체를 빌드하여 압축한 설치용 파일.whl이다. 과거에는 소스 코드 자체를 배포했다. 또 코드를 받으면 설치할때마

standout.tistory.com

 

 

 

 

 

 

 

 

set

중괄호 사용 {}, set()  해 선언한다. 리스트도 저장가능.

 

 

 

 

set은 중복을 허용하지않는다.

빈 set은 set()라고 표현된다

 

 

 

문자열일 경우 set은 한 문자씩 저장하고, set은 지정순서가 없다 .

set에 리스트를 저장할 수 있는데 이때 리스트 자체는 값 순서대로 저장하며, 이는 set이 저장 순서를 유지하게 하는 방법이다.

 

 

 

 

 

 

set은 순서보다 안에 있느냐 없느냐의 존재여부가 훨씬 중요하다. 마치 주머니 속에 무작위로 집어넣는 방식인데 파이썬은 그저 자기들이 메모리에 넣을때 효율적인 방식으로 재배치할 뿐이다. 

 

 

 

 

 

list(dict.fromkeys()
만일 중복은 제거하는데 순서를 꼭 지키고 싶다면 다른 방법을 써야한다.

딕셔너리 KEY는 중복이 안되고 순서가 유지되는 특징을 이용할 수 있다.

 

 

 

 

 

집합연산

 

 

 

 

 

 

 

set의 추가, 제거, 여러개추가(업데이트), 지우기

 

 

 

함수는 pass도, 매개변수없이 return도, 매개변수있게 리턴 및 연산도, 여러리턴 등 여러 방식이 가능하다.

 

 

 

 

함수바로 밑에 적힌 '' 문자는 함수의 설명으로 인식되며 이는 help()로 조회할 수 있다. 

 

 

 

 

 

 

전역변수는 어디에서나 쓸 수 있지만

지역변수는 상단에서는 쓰지 못한다.

 

 

 

 

 

 

함수에서 매개변수로 받은 변수는 실제로 해당 id의 값을 바꿀 수 없으나 리스트는 바꿀 수 있다.

리스트와 객체의 차이를 이해하면 당연한 이론.

 

 

 

 

 

전달값과 매개변수 갯수를 무조건 맞춘다.

 

 

 

 

 

 

 

 

매개변수에 기본값을지정할 수 있다. 

이때 끝 매개변수부터 기본값을 주거나, 혹은 모두 주어야 에러가 나지 않는다 

위 규칙에 위배되지않는한, 변수는 생략되도 에러를 출력하지않는다.