Python3

time module#

perf_counter() and process_time() - https://stackoverflow.com/q/25785243/10103236

#

char.isdigit()

char.isupper()

char.islower()

print(float(''.join(filter(str.isdigit, x))))
Extract number from a string

SomeStr.endswith(('multiple', 'suffixes'))

  • List
    a = [1,1,2,2,1,1]
    a.count(1) >>> 4

  • PEP 448 – Additional Unpacking Generalizations

* iterable unpacking operator
** dictionary unpacking operators
The unary ~ (invert) operator yields the bitwise inversion of its integer argument.

>>> print(*[1], *[2], 3)
1 2 3
>>> dict(**{'x': 1}, y=2, **{'z': 3})
{'x': 1, 'y': 2, 'z': 3}

Iteraion#

>>> for i in a:
...     if a[i] == 1:
...         del a[i]
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration

당연하게도 iteration 중에는 iteration 대상인 dictionary 변경이 불가하다. 다른 대상은 가능한 것 같다.

@ staticmethod#

https://stackoverflow.com/a/1669524

가상환경 만들기#

가상 환경의 장점은

  • 가상환경은 다양한 버전의 Python 및 Python package 설치가 가능하다.
  • Package 꼬임을 방지 및 관리 용이성.
  1. 가상환경 설치법
sudo apt update
sudo apt install python3.<version> python3.<version>-venv
  1. 가상환경 생성
    python3.<version> -m venv ~/<venv_dir_name> 을 이용해서 가상환경을 생성할 수 있다.

    예로 python3.7을 사용해 가상환경을 생성 한다고 하면 python3.7 -m venv ~/venv_py37으로 실행

  2. 가상환경 이용
    source ~/<venv_dir_name>/bin/activate을 통해 가상환경을 활성화 할 수 있다.

    아까의 예를 사용한다면 source ~/venv_py37/bin/activate를 통해 가능하다.
    가상환경 상에서 pip --version ; python --version을 확인하면 설정했던 python version으로 실행이 된다.
    가상환경을 좀 더 편히 사용하기 위해 ~/.bashrc에 alias <nickname>='source /home/yongbeom/venv_py37/bin/activate'를 추가한다. 그리고 source ~/.bashrc로 .bashrc 를 현재 환경에 업데이트 한 후, <nickname>을 사용하면 쉽게 가상환경을 사용할 수 있다.

  3. 가상환경 탈출(?)
    가상환경을 벋어나고자 한다면 deactivate를 command 창에 치면 나갈 수 있다.

Color & Bold text#

class Color:
    PURPLE = '\033[95m'
    CYAN = '\033[96m'
    DARKCYAN = '\033[36m'
    BLUE = '\033[94m'
    GREEN = '\033[92m'
    YELLOW = '\033[93m'
    RED = '\033[91m'
    BOLD = '\033[1m'
    UNDERLINE = '\033[4m'
    END = '\033[0m'

print(f'{Color.BOLD}Hello World !{Color.END}')

Split Strings into words with multiple word boundary delimiters#

>>> import re

>>> re.split('\W+', 'Words, words, words.')
['Words', 'words', 'words', '']

>>> re.split('(\W+)', 'Words, words, words.')
['Words', ', ', 'words', ', ', 'words', '.', '']

>>> re.split('\W+', 'Words, words, words.', 1)
['Words', 'words, words.']

# Will be splitting on: , <space> - ! ? :
>>> filter(None, re.split("[, \-!?:]+", "Hey, you - what are you doing here!?"))
['Hey', 'you', 'what', 'are', 'you', 'doing', 'here']

Argparse#

기본적인 사용법:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help')
args = parser.parse_args()
  • ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

    name or flags - 옵션 문자열의 이름이나 리스트, 예를 들어 foo 또는 -f, –foo.
    action - 명령행에서 이 인자가 발견될 때 수행 할 액션의 기본형.
    nargs - 소비되어야 하는 명령행 인자의 수.
    const - 일부 action 및 nargs 를 선택할 때 필요한 상숫값.
    default - 인자가 명령행에 없는 경우 생성되는 값.
    type - 명령행 인자가 변환되어야 할 형.
    choices - 인자로 허용되는 값의 컨테이너.
    required - 명령행 옵션을 생략 할 수 있는지 아닌지 (선택적일 때만).
    help - 인자가 하는 일에 대한 간단한 설명.
    metavar - 사용 메시지에 사용되는 인자의 이름.
    dest - parse_args() 가 반환하는 객체에 추가될 어트리뷰트의 이름.

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()

충돌하는 옵션은 그룹으로 묶어 사용한다.

  • dest

선택 인자 액션의 경우, dest 의 값은 보통 옵션 문자열에서 유추됩니다. ArgumentParser 는 첫 번째 긴 옵션 문자열을 취하고 앞의 -- 문자열을 제거하여 dest 의 값을 만듭니다. 긴 옵션 문자열이 제공되지 않았다면 dest 는 첫 번째 짧은 옵션 문자열에서 앞의 - 문자를 제거하여 만듭니다. 문자열이 항상 유효한 어트리뷰트 이름이 되도록 만들기 위해 중간에 나오는 - 문자는 _ 문자로 변환됩니다. 아래 예제는 이 동작을 보여줍니다.

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-f', '--foo-bar', '--foo')
>>> parser.add_argument('-x', '-y')
>>> parser.parse_args('-f 1 -x 2'.split())
Namespace(foo_bar='1', x='2')
>>> parser.parse_args('--foo 1 -y 2'.split())
Namespace(foo_bar='1', x='2')

Pandas#

DataFrame.sort_values(self, by, axis=0, ascending=True, inplace=False, kind=’quicksort’, na_position=’last’)
Sort by the values along either axis.

>>> df.sort_values(by='col1', ascending=False, na_position='first')
    col1 col2 col3
3   NaN  8    4
4   D    7    2
5   C    4    3
2   B    9    9
0   A    2    0
1   A    1    1

ascending: 오르는, 상승하는 (ant. descending)

Time#

# timer.py
import time
class TimerError(Exception):
    """A custom exception used to report errors in use of Timer class"""

class Timer:
    def __init__(self):
        self._start_time = None

    def start(self):
        """Start a new timer"""
        if self._start_time is not None:
            raise TimerError(f"Timer is running. Use .stop() to stop it")

        self._start_time = time.perf_counter()
    def stop(self):
        """Stop the timer, and report the elapsed time"""
        if self._start_time is None:
            raise TimerError(f"Timer is not running. Use .start() to start it")

        elapsed_time = time.perf_counter() - self._start_time
        self._start_time = None
        print(f"Elapsed time: {elapsed_time:0.4f} seconds")