파이썬 PEP8 스타일 가이드

|

파이썬 코딩의 기술 Effective Python을 읽고 중요한 내용을 정리합니다.

PEP 8

  • PEP8 : 파이썬 개선 제안서, 파이썬 코드를 어떻게 구상할 지 알려주는 스타일 가이드
  • PEP8 전체 가이드
  • 다른 사람과 원활하게 협업하려면 공통된 스타일 공유가 필요
  • 일관성 있는 스타일은 나중에 수정하기도 쉽다.

whitespace

  • 한 줄의 문자 길이가 79자 이하여야 한다.
  • 함수와 클래스는 빈 줄 두개로 구분한다.
  • 클래스에서 메서드는 빈 줄 하나로 구분한다.
  • 변수 할당 앞 뒤에 스페이스를 하나만 사용한다.
  • 리스트 인덱스, 함수 홏ㄹ, 키워드 인수 할당에는 스페이스를 사용하지 않는다.

naming

  • 함수, 변수, 속성 : lowercase_underscore
  • 보호(protected) 인스턴스 속성 : _leading_underscore
  • 비공개(private) 인스턴스 속성 : __double_leading_undersocre
  • 클래스와 예외 : CapitalizeWord
  • 모듈 수준 상수 : ALL_CAPS
  • 클래스의 인스턴스 메서드에서는 첫번째 파라미터 (해당 객체 참조)의 이름을 self로 지정
  • 클래스 메서드에서는 첫번재 파라미터 (해당 클래스 참조)의 이름을 cls로 지정

표현식과 문장

  • if no a is b 보다는 if a is not b 를 사용
  • if not somelist 처럼 빈 값은 암시적으로 False가 된다고 가정
  • if somelist 처럼 값이 있는 리스트는 암시적으로 True가 된다고 가정
  • 한 줄로 된 if문, for, while loop, except 복합문을 쓰지 않는다.
  • 항상 파일의 맨 위에 import 문을 놓는다.
  • 모듈 임포트시에는 항상 모듈의 절대 이름을 사용 import foo 대신 from bar import foo
  • 상대적인 임포트를 해야 한다면 명시적인 구문을 서서 from . import foo 라고 한다.
  • 임포트 순서 : 표준 라이브러리 모듈 > 서드파티 모듈 > 자신이 만든 모듈 / 각각의 하위 섹션에서는 알파벳 순서

reference

programmers - 직사각형 만들기

|

문제출처

문제

직사각형을 만드는 데 필요한 4개의 점 중 3개의 좌표가 주어질 때, 나머지 한 점의 좌표를 반환하는 solution 함수를 완성해 주세요. 단, 직사각형의 각 변은 x축, 혹은 y축에 평행하며, 반드시 직사각형을 만들 수 있는 경우만 입력으로 주어집니다.

제한사항 좌표값 : 10억이하의 자연수 입출력 예

v [[1, 4], [3, 4], [3, 10]] result [1, 10] v [[1, 1], [2, 2], [1, 2]] result [2, 1]

입출력 예 설명 입출력 예 1 주어진 점의 좌표가 [[1, 4], [3, 4], [3, 10]] 일때, [1, 10]에 점이 위치하면 직사각형이 됩니다.

입출력 예 2 주어진 점의 좌표가 [[1, 1], [2, 2], [1, 2]] 일때, [2, 1]에 점이 위치하면 직사각형이 됩니다.

풀이코드

def solution(v):
    answer = []
    v1 = []
    v2 = []
    for i in v:
        if i[0] not in v1:
            v1.append(i[0])
        else:
            v1.remove(i[0])
        if i[1] not in v2:
            v2.append(i[1])
        else:
            v2.remove(i[1])
    answer = v1 + v2
    return answer

Queryset을 활용한 아주 간단한 필터검색 구현

|

AskDjango 수업을 듣고 중요한 내용을 정리하였습니다.

검색을 위한 form 추가 (template)

<!-- post_list.html -->


<form action="" method="get">
  <input type="text" name="q" value="{{ q }}">
  <input type="submit" value="검색">
</form>

input text에 따른 필터링 조회처리 (view)

# blog/views.py
from django.shortcuts import render
from .models import Post

def post_list(request):
    qs = Post.objects.all()

    q = request.GET.get('q', '') # GET request의 인자중에 q 값이 있으면 가져오고, 없으면 빈 문자열 넣기
    if q: # q가 있으면
        qs = qs.filter(title__icontains=q) # 제목에 q가 포함되어 있는 레코드만 필터링

    return render(request, 'blog/post_list.html', {
        'post_list' : qs,
        'q' : q,
    })

결과화면

스크린샷 2017-05-04 오후 12.30.11

codility 3-1. PermMissingElem

|

문제출처

문제

A zero-indexed array A consisting of N different integers is given. The array contains integers in the range [1..(N + 1)], which means that exactly one element is missing.

Your goal is to find that missing element.

Write a function:

def solution(A)
that, given a zero-indexed array A, returns the value of the missing element.

For example, given array A such that:

  A[0] = 2
  A[1] = 3
  A[2] = 1
  A[3] = 5
the function should return 4, as it is the missing element.

Assume that:

N is an integer within the range [0..100,000];
the elements of A are all distinct;
each element of array A is an integer within the range [1..(N + 1)].
Complexity:

expected worst-case time complexity is O(N);
expected worst-case space complexity is O(1), beyond input storage (not counting the storage required for input arguments).
Elements of input arrays can be modified.

풀이코드

  • Detected time complexity: O(N) or O(N * log(N))
def solution(A):
    li = [0] * (len(A) + 1)
    for i in A:
        li[i-1] = 1  
    return li.index(0) + 1

다른사람 코드

  • 와! 이렇게 쉬운 방법이 있었다니..
def solution(A):
  return sum (range(len(A)+2)) - sum(A)

codility 3-2. FrogJmp

|

문제출처

문제

A small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to a position greater than or equal to Y. The small frog always jumps a fixed distance, D.

Count the minimal number of jumps that the small frog must perform to reach its target.

Write a function:

def solution(X, Y, D)

that, given three integers X, Y and D, returns the minimal number of jumps from position X to a position equal to or greater than Y.

For example, given:

  X = 10
  Y = 85
  D = 30
the function should return 3, because the frog will be positioned as follows:

after the first jump, at position 10 + 30 = 40
after the second jump, at position 10 + 30 + 30 = 70
after the third jump, at position 10 + 30 + 30 + 30 = 100
Assume that:

X, Y and D are integers within the range [1..1,000,000,000];
X ≤ Y.
Complexity:

expected worst-case time complexity is O(1);
expected worst-case space complexity is O(1).

풀이코드

  • Detected time complexity: O(1)
def solution(X, Y, D):
    return (Y - X) // D if (Y - X) % D == 0 else (Y - X) // D + 1