python 27

Q. 파이썬Python 기본 반올림 함수인 round(0.5)의 결과는?

A. 0이다. 중고등학교 수학시간에 배운 반올림 방식으로 생각하면 1이어야 할 거 같은데 0이 나온다. 그 이유는 파이썬 round는 우리가 수학시간 때 배운 사사오입 방식 4이면 내리고 5이면 올리는 게 아니라 오사오입 방식이기 때문이다. (참고: 반올림 위키백과)오일 때 버리고 그 다음 오는 올린다. 그래서 round(0.5) -> 0, round(1.5) -> 2가 된다. 결과가 짝수로 나온다. round(0.5) -> 0 round(1.5) -> 2 round(2.5) -> 2 round(3.5) -> 4로 가까운 짝수값이 나온다. 소숫점 첫째 자리에서 반올림해봐도 특이하다. round(0.01, 1) -> 0.0 round(0.05, 1) -> 0.1 round(0.15, 1) -> 0.1 ro..

Q. 장고Django에서 테스트 코드 작성 시 개발팀 내 관습convention으로 정해야 할 사항들은?

A. 테스트 팩키지, 테스트 파일의 위치, 테스트 파일명, 테스트 클래스명, 테스트 메소드명, 테스트 함수명, 테스트 코드 작성 방식 등을 미리 정해두는 게 좋다. 미리 정하지 않으면 각자 방식대로 하게 되고, 추후 유지보수가 어렵다. 처음 시작할 때 각자 테스트를 해보고 의견을 취합해서 정하는 것이 좋다. 한번 정하면 바꾸기 쉽지 않고, 기존 테스트 코드가 있기 때문에 관성에 따라 정한 방식대로 작성하게 되기 때문이다. 테스트 팩키지pytest: 파이썬 계열 대표 테스트 팩키지. pytest 없이도 django에서 기본 제공하는 django.test로 테스트 가능하다. pytest를 사용할지 말지 논의가 필요하다. pytest-django: pytest를 활용하면서 장고django 테스트할 때 쓰는 팩..

Q. Python에서 함수나 구문의 속도를 측정하는 방법은?

A. cProfile을 이용해서 측정할 수 있다.출처: 파이썬 프로파일러 인라인 리스트 예아래 같은 코드를 추가하고 실행해보자.import cProfile def get_number_list(): number_list = [] for i in range(1000000): number_list.append(i) return number_list cProfile.run(statement="get_number_list()") cProfile.run(statement="[i for i in range(1000000)]") 실행결과 같은 숫자 배열을 얻는 경우인데, 인라인으로 처리한 경우가 약 4배 빠른 것을 확인할 수 있다. not A and not B와 not (A or B) 비교 예not A and not ..

Q. Pycharm에서 파이썬 Black 코드 포맷 자동 적용하는 방법은?

A. File Wathcer에 등록하면 된다. 출처: Black documentation: PyCharm/IntelliJ IDEA As file watcher Black 공식 문서에서는 black 적용 방법으로 As local server, As external tool, As file watcher 3가지 방법을 제시하고 있다. 이 중에서 File watcher가 자동 적용되어서 편하다. black 설치 MacOS 기준이다. 윈도우도 큰 차이는 없으니 위 공식 문서를 참고하자. $ pip install black $ which black black을 설치하고 which로 black 설치 위치를 확인할 수 있다. 내 경우는 파이썬 가상환경을 따로 만들어서 설치했기 때문에 아래와 같다. /Users/tap..

Q. 파이썬으로 래빗엠큐RabbitMQ 메시지를 보내고 받고 싶다면?

A. pika 팩키지를 활용하면 된다. RabbitMQ 공식 홈페이지에 pika 튜토리얼이 있다. 튜토리얼 그대로 따라하면 쉽게 테스트를 해볼 수 있다. 도커로 RabbitMQ 실행하기 /Users/taptorestart 부분은 여러분의 경로로 수정하면 된다. 참고: rabbitmq dockerhub docker run --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ -v /Users/taptorestart/rabbitmq:/var/lib/rabbitmq \ -d rabbitmq:3.11.10-management 이 때 중요한 것은 -p 5672:5672도 적어줘야 한다는 점이다. 실행했으면 접속하자. http://localhost:15672/ 로 접속하고 id,..

Q. 파이썬Python에서 타입 힌트Type hints를 적으면 타입이 변경될까?

A. 아니다. 변경되지 않는다. 아래처럼 text란 변수의 type을 int로 선언했다. 값은 "hello!"를 저장하고, type을 찍어보면 어떻게 될까? text: int = "hello!" print(type(text)) 입력값인 "hello!"의 타입인 str이 된다. int가 아니다. 에러도 발생하지 않는다. 너무 단순한 예라 그런 거고 다른 경우는 다를 거 같다고 생각할 수 있다. DRF(Django Rest Framework)에서 아래처럼 테스트를 해보자. request를 엉뚱하게 str이라고 선언한다. 그리고 type을 확인한다. 역시나 원래 타입인 rest_framework.request.Request로 나오는 것을 확인할 수 있다. 타입 힌트는 말 그대로 힌트다. 정적 타입 언어인 다른..

Q. 파이썬에서는 어떤 값들이 False일까?

A. 0, '', (), [], {}, set(), range(0), None 등이 False다. 공식 문서 설명은 다음과 같다. constants defined to be false: None and False. zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1) empty sequences and collections: '', (), [], {}, set(), range(0) 출처: Truth Value Testing, Python Documentation 아래 값들은 모두 False다. bool(0) bool('') bool(()) bool([]) bool({}) bool(set()) bool(range(0)) bool(None) bo..

HTML을 Markdown으로 바꿔주는 파이썬 팩키지 만들기

HTML을 Markdown으로 바꿀 필요가 생겨서 관련 파이썬 팩키지를 찾아봤다. 찾아보니 몇개 있긴 했지만 수준이 그리 높지 않기도 했고, 간단한 거니 연습삼아 따로 하나 만들어보자는 생각으로 만들었다. 팩키지명은 htmltomd다. pypi 주소는 여기! https://pypi.org/project/htmltomd/ 아래처럼 실행하면 import htmltomd html = """ htmltomd htmltomd is a simple package for converting HTML to Markdown. Getting Started pip install htmltomd Source code github.com/taptorestart/htmltomd Image """ result = htmltomd...

Python requests와 pytest로 REST API 서버 테스트하기

자바스크립트 기반인 frisby.js로 REST API 서버 테스트를 할 수도 있지만, 파이썬이 익숙하다면 requests로도 쉽게 구현할 수 있다. 준비: API 서버 실행 우선 FastAPI 예제를 실행한다. 예제코드는 FastAPI - Email Login with Password.. 여기 있다. localhost:8000/docs로 접속했을 때 아래처럼 뜬다면 정상 작동하고 있는 것이다. API 테스트 코드 작성 위에 브라우저로 확인한 것을 그냥 코드로 아래처럼 작성해서 확인할 수도 있다. import requests def test_get_docs(): endpoint = "http://localhost:8000/docs/" response = requests.get(endpoint) asser..

Q. Python으로 AWS S3에서 파일 업로드 다운로드 하는 방법은?

A. S3 버킷 추가 → S3 업로드 다운로드 권한을 가진 그룹 추가 → S3 사용자 추가해서 Access key ID, Secret access key 얻기 → 업로드 구현 → 다운로드 구현 순으로 진행해보면 된다. S3 버킷 생성하기 먼저 버킷을 생성하자. 버킷 생성하기로 가자. 버킷 이름은 전세계에서 유일해야 한다. 회사이름이나 본인 이름을 접두사로 하거나 본인 도메인을 접두사로 하면 중복을 피할 수 있다. 테스트를 위한 것이니 내 경우 'taptorestart-test-s3'라고 만들었다. S3 업로드 다운로드 권한을 가진 그룹과 사용자 추가하기 우선 그룹을 추가한다. 그룹 명은 S3FullAccess Create group을 눌러서 그룹을 추가한다. 이번에는 사용자를 추가한다. Set permi..

Q. 유명 개발자들은 파이썬 테스트 코드를 어떻게 작성할까?

A. 사례를 찾아보면 진짜 생각보다 간단하게 짠다. 테스트 코드 작성 어렵다. 작성하면서도 이게 과연 올바른가 의심될 때가 있다. 이럴 때는 유명 개발자들은 어떻게 하는지 찾아보는 것만으로도 큰 도움이 된다. 게다가 개발 바닥은 쉽게 찾을 수 있으니! 구글 구글부터 살펴보자. github에서 구글로 들어가서, 언어는 파이썬, 정렬은 별개수로 하자. 목록 상단에 있는 google / jax를 골랐다. 여기 들어가니 tests 디렉터리가 있다! 여러 테스트 파일 중 core_test.py를 보자. tree_flatten이란 함수를 테스트하는 코드는 아래가 다다. 값은 직접 입력했고, 입력한 값은 아주 간단한 것을 볼 수 있다. 10개가 아니라 1개다. def test_tree_flatten(self): fl..

Q. Python에서 for문을 돌면서 실행하는 코드를 한 줄로 작성할 수 있을까?

A. 가능하다. 변수에 저장하지 않는 코드라면. 이렇게 두 줄인 코드를 for num in range(10): print(num) 아래처럼 한 줄로 적을 수 있다. [print(n) for n in range(10)] 딱히 리스트를 만들 것은 아니지만 [ ]로 감싸주면 실행가능하다! [ ]를 없애면? 당연히 구문syntax 에러가 난다. 함수를 선언해서 할 수도 있다. 아래처럼 하는 것도 가능하다. def print_num(num): print(num) [print_num(n) for n in range(10)] 변수에 할당하는 건 안 된다. 구문 에러가 발생한다. 아래처럼 하고 싶을 수도 있지만 안 된다. sum = 0 [sum += n for n in range(10)] 뭔가 할당하고 저장하기만 하고..

Q. 파이썬으로 개발할 때 타입 힌트type hints를 쓰면 좋은 점은?

A. 개발자 실수로 인한 오류가 확 줄어든다! 파이썬은 동적 타입 언어Dynamically Typed Language 그때 그때 알아서 타입이 바뀌는 걸 동적 타입 언어라고 한다. 정적 타입 언어Statically Typed Language인 C나 자바는 변수를 선언할 때 타입부터 선언해야 한다. 하지만 파이썬은 동적 타입 언어니까 변수를 선언할 때 타입을 선언하지 않는다. message = "Hello World!" print(message) message = 7 print(message) 위처럼 그냥 변수 = 문자열 하면 해당 변수에는 문자열이 담긴다. 그 다음에 숫자를 변수에 저장해도 전혀 문제 없이 잘 작동한다. 웹 개발 때 많이 쓰는 자바스크립트도 동적 타입 언어다. 동적 타입 언어 문제 알아서..

PDF를 텍스트로 바꿔주는 pdfminer.six, pypdf2, pdfplumber 비교해보기

여기 2030년 자율주행 서비스 일상화, 미래 모빌리티 선도국가 도약란 국토교통부의 보도자료가 있다. 보도자료는 보통 PDF와 HWP 파일로 공개된다. 이 중 PDF를 텍스트로 변경해보고 싶다. 많이 쓰는 것 중심으로 테스트를 해봤다. pypdf2, pdfminer.six, pdfplumber 3개다. 위 pdf 중 두 번째 쪽은 아래와 같다. 아래 PDF를 텍스트로 변경해봤다. pypdf2 2쪽을 하고 싶었으니 아래처럼 index는 1이 된다. from PyPDF2 import PdfReader FILE_PATH = "220609(석간)_강남에서_자율주행_택시_달린다(첨단자동차과).pdf" INDEX_OF_PAGE = 1 def text_to_txt_file(text, file_name): with o..

Q. 아나콘다 설치 없이 주피터 노트북 실행시키는 방법은?

A. pip install notebook으로 설치, jupyter notebook 실행하면 된다. 주피터 노트북만 필요하다면 굳이 아나콘다까지 설치할 필요가 없다. 맥의 경우에는 아래처럼 하면 된다. $ mkdir notebook $ cd notebook $ python3 -m venv venv $ source ./venv/bin/activate $ pip install notebook $ jupyter notebook 위 예시는 가상환경 만드는 것부터 적어본 것이고, 그냥 pip install notebook부터 해도 된다. 주피터 노트북이 잘 실행되는 걸 볼 수 있다. 노트북 화면이 보인다. 실행해보자. 정상적으로 뜨는 것을 볼 수 있다. 이렇게 했을 때 장점은 각 프로젝트마다 팩키지 관리를 할 수..

Q. 파이썬에서 데이터를 객체로 맵핑하는 방법은?

A. 여러가지 방법으로 가능하다. 기본 __init__을 활용할 수도 있고, dataclasses, pydantic 등을 활용해서 할 수도 있다. 데이터를 받아서 데이터 모델 클래스의 객체object로 맵핑mapping하는 경우는 정말 많이 필요하다. 그렇지 않으면 일일이 변수로 만들거나 딕셔너리로 접근해야 하는데 너무 번거롭기 때문이다. 데이터를 객체로 만들어주는 팩키지나 라이브러리를 보통 객체 맵퍼 Object Mapper라고 부른다. 예를 들면 자바의 Jackson 같은 경우다. 파이썬에서는 어떻게 객체 맵핑을 할 수 있을까. 1. 가장 기본적인 방법 __init__ 을 활용하는 방법이다. class User: def __init__(self, name, phone, birthday): self.n..

프로그래머스 코딩테스트 연습 > 힙(Heap) > 더 맵게

출처: 프로그래머스 코딩테스트 연습 > 힙(Heap) > 더 맵게 문제 매운 것을 좋아하는 Leo는 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶습니다. 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 Leo는 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 새로운 음식을 만듭니다. 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 음식의 스코빌 지수 * 2) Leo는 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞습니다. Leo가 가진 음식의 스코빌 지수를 담은 배열 scoville과 원하는 스코빌 지수 K가 주어질 때, 모든 음식의 스코빌 지수를 K 이상으로 만들기 위해 섞어야 하는 최소 횟수를 return 하도록..

자료 구조 - 단일 연결 리스트 Singly Linked List, 파이썬으로 구현한 단일 연결 리스트 예제

연결 리스트Linked List란? 각 노드(node)가 데이터와 포인터를 가지고 한 줄로 연결된 자료 구조. 참고: 위키백과 연결 리스트 그렇다면 노드란? 위 그림에서 네모 두 칸이 노드다. 12가 데이터, 다른 노드를 가리키고 있는 화살표가 바로 포인터다. 파이썬 노드 코드 예 노드를 한 줄로 연결하게 되면 연결 리스트가 된다. 연결 리스트 중 포인터가 하나인 경우가 단일 연결 리스트이다. 단일 연결 리스트 파이썬 구현 예 아래는 파이썬으로 구현한 단일 연결 리스트 예이다. 앞에서 살펴본 스택이나 큐보다 훨씬 복잡하다. 노드란 객체를 만들어서 연결하기 때문에 더 복잡해 보인다. 코드를 이해하기 위해서는 천천히 살펴볼 필요가 있다. 그렇다면 왜 연결 리스트를 사용할까? 많은 프로그래밍 언어에서 배열이란..