ABOUT ME

-

Total
-
  • #2 파이썬 여러가지 팁
    컴퓨터/파이썬 2020. 5. 30. 17:05
    728x90
    반응형

    algoexpert 공부 일지 #2

    https://www.algoexpert.io/questions

     

    1. 변수 T/F 이용

    isPeak = arr[i-1] < arr[i] and arr[i] > arr[i+1]

     

    2. range -> array

    a = range(0, 4)
    a[1] = 1
    
    # 파이썬2에선 list object
    # 파이썬3에선 range object를 return해서
    # lazy evaluation

     

    3. 부등호

    if 3 < a < 4:
        a = 3.5

     

    4. enumerate

    a = "ABCD"
    for i,j in enumerate(a):
        print(i,j)
    
    # (0,A), (1,B), (2,C), (3,D)

     

    5. 두 변수 바꾸기

    a = 3, b = 4
    a, b = b, a

     

    6. 두 array 여집합(?) A-B 

    a = [1, 2, 3, 4]
    b = [1, 2, 6, 7, 9]
    
    c = [x for x in b if not in a]

     

    7. range 거꾸로 (step 말고)

    for i in reversed(range(0, 3)):
    	print(i)
        
    # 2, 1, 0

     

    8. For-Else

    for i in range(3):
        if i == 4:
            break
    else:
        print('dump')
    
    # output : dump

     

    9. 삼항 연산자 (ternary operator)

    return True if x != 1 else False

     

    10. reversed list 출력하기

    # reversed(array) returns nothing
    print(list(reversed(range(4))) # [3, 2, 1, 0]

     

    11. 두 배열 중 같은 요소들 뽑기

    def common_element(list1, list2):
        return [common for common in list1 if common in list2]

     

    12. randint 알고리즘은 메르센 트위스터 기반,

    random.shuffle 함수는 Fisher-Yates  | O(n)

    랜덤 모듈 구현하기 : choiseokwon.tistory.com/244

    import random
    
    def shuffle(arr):
        for i in reversed(range(1, len(arr))):  # len(arr) - 1 ~ 1까지
            j = random.randit(0, i)  # 메르센 트위스터
            arr[i], arr[j] = arr[j], arr[i]
    

     

    13. timeit() 함수 걸린 시간 알아보기

    def timeit(func):
        @wraps(func)
        def _time_it(*args, **kwargs):
            start = int(round(time() * 1000))
            try:
                return func(*args, **kwargs)
            finally:
                end_ = int(round(time() * 1000)) - start
                print(f"총 걸린 시간: {end_ if end_ > 0 else 0} ms")
        return _time_it
    
    # decorator 이므로, 함수 위에 @timeit
    
    
    @timeit
    def factorial(n, memo={0: 1, 1: 1, 2: 2}):
        if n in memo:
            return memo[n]
       else:
            x = factorial(n - 1) * n
            memo[n] = x
            return x

     

    14. string으로 이루어진 list에서 가장 긴 string 뽑아내기

    lists = ['xyzzyx', 'zz', 'yzzy']
    print(max(lists, key=len))

     

    15. 팩토리얼 memoization

    # 첫 팩토리얼 계산은 일반적으로 똑같다.
    # 첫 팩토리얼 계산부터 빠르게 하려면, 구현을 다르게
    # 2번째 팩토리얼 함수를 부를 때 효과를 본다.
    # math.factorial(n) 은 C로 작성돼서 더 빠르다.
    
    """
    기본 매개변수에 mutable object (list, dict..)를 사용하면
    함수를 부를 때 이 메모리는 계속 유지된다.
    
    예)
    factorial(3)  # memo = {0: 1, 1: 1, 2: 2, 3: 3}
    factorial(4)  # 위 memo값 그대로에서, memo = {0: 1, 1: 1, 2: 2, 3:3, 4:5}
    
    """
    
    def factorial(n, memo={0: 1, 1: 1, 2: 2}):
        if n in memo:
            return memo[n]
       else:
            x = factorial(n - 1) * n
            memo[n] = x
            return x

     

    16. dataclass

    from dataclasses import dataclass
    from typing import Type, Optional
    
    @dataclass
    class Node:
        value: int
        next: Optional[Type] = None
    
    node = Node(3)
    

     

    17. __slots__

    __dict__를 사용 못하지만, 메모리 접근 속도가 더 빠르며, 값을 변경 못함

    class A:
        __slots__ = ("a", "b", "c")
        def __init__(self):
            self.a = 0
            self.b = 1
            self.c = 2
    728x90

    댓글