Web/Backend

[백엔드 기초] 2. Python

 

기초 문법

변수, 자료형(리스트, 튜플, 딕셔너리), while, for, if-else, 함수

위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
https://wikidocs.net/book/1

 

모듈(import), 패키지, 가상환경(venv)

 

모듈: 함수/변수/클래스를 모아 놓은 파일

(다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일)

 

패키지: 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해주는 것

 

profileapp/     __init__.py 		admin.py 		apps.py 		decorators.py 		forms.py 		models.py 		tests.py 		urls.py 		view.py     migrations/         __init__.py         0001_initial.py

 

모듈 이름이 A.B인 경우에 A는 패키지 이름이 되고 B는 A 패키지의 B모듈이 됨.

간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리함.

패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용 가능.

  • __init__.py해당 디렉터리(폴더)가 패키지임을 알려주는 역할
  • 패키지를 초기화하는 역할
가상환경: 특정 버전 파이썬 설치와 여러 추가 패키지를 포함하는 완비된 디렉터리 트리

 

 

가상환경을 사용하는 이유:

  • 같은 모듈을 사용한다고 하더라도 다른 버전을 필요로 할 때
  • Python 프로그램을 실행하기 위한 최소한의 환경을 마련하고자 할 때
  • GitHub 등의 저장소/네트워크와 연계하고자 할 때 등등..

 

파이썬에서 외부 패키지를 설치할 때는 일반적으로 pip이라는 패키지 매니저를 사용하는데, 기본적으로 운영체제에 파이썬이 설치된 위치의 site-packages 디렉터리에 안에 설치됨.

노드의 npm이나 자바의 maven과 같은 패키지 매니저가 프로젝트 별 패키지 설치를 지원하는 반면에, 아직 파이썬의 pip는 시스템 전역으로만 패키지를 설치할 수 있음.

파이썬의 가상 환경을 이용하면 프로젝트 별로 따로 패키지를 설치하고, 다른 프로젝트로 부터 격리시킬 수 있기 때문에 시스템 전역 패키지 설치로 인한 불필요한 이슈를 방지 가능.

 

venv: 가상 환경을 만들고 관리하는 데 사용되는 python모듈

가상환경 생성

$ cd <프로젝트 디렉터리> $ python -m venv .venv $ ls .venv

가상환경 활성화

$ source .venv/bin/activate (.venv) $

가상환경에 패키지 설치

(.venv) $ pip install requests

 

객체지향: class, object, 생성자(__init__), 상속(Inheritance), 다형성(Polymorphism)

 

class: 객체를 표현하기 위한 문법(자료형을 위한 일종의 템플릿)
classProfile(models.Model) :     user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')     image = models.ImageField(upload_to='profile/', null=True)     nickname = models.CharField(max_length=25, unique=True, null=True)     message = models.CharField(max_length=120, null=True)
object: 객체(클래스 인스턴스)

클래스를 이용해 인스턴스(instance)를 만들어주면 됨.

이렇게 클래스를 정의하고 객체를 만드는 패턴을 객체 지향 프로그래밍(OOP)이라고 함.

 

생성자(__init__): 클래스를 호출할 때 자동으로 어떤 함수를 실행하거나 값을 호출하기 위해 클래스 내에 정의하는 것

 

class AccountUpdateForm(UserCreationForm): 	def __init__(self, *args, **kwargs): 		super().__init__(*args,**kwargs) 		self.fields['username'].disabled =True

 

상속:(Inheritance): 물려주는 클래스(Parent Class)의 내용(속성과 메소드)을 물려받는 클래스(Child class)가 가지게 되는 것
from django.contrib.auth.forms import UserCreationForm class AccountUpdateForm(UserCreationForm): 	def __init__(self, *args, **kwargs): 		super().__init__(*args,**kwargs) 		self.fields['username'].disabled =True

 

클래스를 상속 받기 위해서는 파생클래스(자식클래스)에서 클래스명 뒤에 베이스클래스(부모클래스) 이름을 괄호와 함께 넣어 주면 됨.

 

다형성(Polymorphism): 동일한 코드가 상황에 따라 다른 동작을 하는 것.

상속 등을 통해 기능을 확장하거나 변경하는 것을 가능하게 해주고, 같은 클래스 내에 코드의 길이를 줄여줌.

Override: 상속받은 부모 class의 method 덮어쓰기

 

예외 처리(try-except)

파이썬은 try, except를 사용해서 (프로그램이 멈추지 않고) 예외적으로 오류가 나는 부분을 처리할 수 있게 해줌.

try:     ... except [발생 오류[as 오류 메시지 변수]]:     ...
try:     4 / 0 except ZeroDivisionError as e:     print(e)  ## division by zero

 

예외도 클래스 상속으로 구현되며 위와 같은 계층으로 이루어져 있음.

보통 Exception을 상속받아서 구현.

 

비동기: coroutine, async-await

asyncio(Asynchronous I/O): 비동기 프로그래밍을 위한 모듈이며, CPU 작업과 I/O를 병렬로 처리하게 해줌.
  • 동기(synchronous) 처리: 특정 작업이 끝나면 다음 작업을 처리하는 순차 처리 방식
  • 비동기(asynchronous) 처리: 여러 작업을 처리하도록 예약한 뒤 작업이 끝나면 결과를 받는 방식

 

동기 함수

def do_sync():     pass

비동기 함수(코루틴)

async def do_async():     pass

비동기 함수는 일반적으로 async로 선언된 다른 비동기 함수 내에서 await 키워드를 붙여서 호출해야 함.

async def main_async():     await do_async()

async로 선언되지 않은 일반 동기 함수 내에서 비동기 함수를 호출하려면 asyncio 라이브러리의 이벤트 루프를 이용해야 함.

loop = asyncio.get_event_loop() loop.run_until_complete(main_async()) loop.close()

파이썬 3.7이상 부터는

asyncio.run(main_async())

 

코루틴(coroutine): cooperative routine, 서로 협력하는 루틴

메인 루틴(호출하는 것)과 서브 루틴(호출 당하는 것)처럼 종속된 관계가 아니라 서로 대등한 관계이며 특정 시점에 상대방의 코드를 실행함.

 

비동기로 두 개 이상의 작업(코루틴)을 돌릴 때 - asyncio.gather함수를 이용.

import asyncio import time  async def coroutine_1():  # 코루틴 정의      print('코루틴 1 시작')     print('코루틴 1 중단... 5초간 대기')     # await으로 중단점 설정      await asyncio.sleep(5)     print('코루틴 1 재개')   async def coroutine_2():     print('코루틴 2 시작')     print('코루틴 2 중단... 4초간 대기')     await asyncio.sleep(4)     print('코루틴 2 재개')  if __name__ == "__main__":     # 이벤트 루프 정의     loop = asyncio.get_event_loop()     start = time.time()     # 두 개의 코루틴을 이벤트 루프에서 돌린다.     # 코루틴이 여러개일 경우, asyncio.gather을 먼저 이용 (순서대로 스케쥴링 됨.)     loop.run_until_complete(asyncio.gather(coroutine_1(), coroutine_2()))     end = time.time()      print(f'time taken: ')

 

>> 코루틴 1 시작 코루틴 1 중단... 5초간 대기 코루틴 2 시작 코루틴 2 중단... 4초간 대기 코루틴 2 재개 코루틴 1 재개 time taken: 5.004844665527344

 

 

728x90