hello, robot

로보틱스를 시작하며 파이썬을 다시 잡았어요. 읽을 줄은 알아서 만만하게 봤는데, C#처럼 값과 참조를 구분하는 언어의 직관과 부딪히는 지점이 여럿이었어요.

우선순위는 현업 빈도순으로

문법책 순서로 정리하면 한 달 뒤에 남는 게 없어서, 배운 걸 쓰는 빈도순으로 다시 줄 세웠어요.

티어빈도항목기준
1매일f-string · 컴프리헨션 · dict.get · enumerate/zip · with · join · 언패킹 · truthiness · sorted(key=…)안 보고 나와야 해요
2주 단위deque · Counter · pathlib형태만 기억하고 찾아 써요
3함정 회피아래 세 가지쓰는 지식이 아니라 피하는 지식

변수는 객체에 붙는 이름이에요

참조 시맨틱
b = a는 복사가 아니라 같은 객체에 이름을 하나 더 붙이는 거예요.
파이썬에는 값 타입과 참조 타입의 구분이 없어요. 모든 변수는 객체에 붙는 이름이에요.b = a[1, 2, 3]객체 하나abb.append(1) 하면 a도 바뀌어 있어요b = a.copy()[1, 2, 3][1, 2, 3]원본새 객체ab복사가 필요하면 명시해야 해요같은 성질이 기본값 인자에서도 나와요. def f(logs=[])[]함수를 정의하는 시점에 딱 한 번 평가돼서,모든 호출이 같은 리스트 하나를 공유해요. 두 번째 호출에 첫 호출의 데이터가 남아 있어요.
def append_log(item, logs=None):   # 기본값을 None으로 두고
    if logs is None:
        logs = []                  # 함수 안에서 새로 만들어요
    logs.append(item)
    return logs

컴프리헨션의 if는 위치가 역할이에요

같은 if인데 뒤냐 앞이냐
뒤에 오면 걸러내기라 else가 없고, 앞에 오면 값 바꾸기라 else가 반드시 있어야 해요.
[x for x in nums if x > 0]if가 뒤 — 걸러내기[3, -1, 2] → [3, 2]else를 쓸 수 없어요[x if x > 0 else 0 for x in nums]if-else가 앞 — 값 바꾸기[3, -1, 2] → [3, 0, 2]else가 반드시 있어야 해요같은 if인데 위치에 따라 역할이 달라요. 개수가 줄면 필터, 그대로면 값 변환이에요.

예외를 대하는 방향

예외는 비싸니 미리 검사하라(LBYL)고 배운 쪽이라면 파이썬은 반대예요. “허락을 구하지 말고 용서를 구하라”(EAFP), 일단 실행하고 예외로 처리해요.

if key in d:                 # LBYL: 먼저 검사하고 사용
    v = d[key]
 
v = d.get(key, default)      # EAFP: 일단 꺼내고 예외 처리 (또는 get 한 줄)

검사와 사용 사이에 상태가 바뀌는 경쟁 조건을 원천 차단하는 이점도 있어요.

with open(path) as f:는 C#의 using과 같은 역할이에요. 블록을 벗어나면 예외가 나도 자원이 해제돼요. 로봇 쪽에서는 파일보다 시리얼 포트에서 중요하다고 해요. 포트를 안 닫고 죽은 프로세스 때문에 재접속이 막히는 게 흔한 사고 패턴이거든요.

상속은 프레임워크가 요구해요

class MyNode(Node):     # ROS 2 노드
class Net(nn.Module):   # PyTorch 모델

앞으로 쓸 ROS 2 노드도 PyTorch 모델도 “부모를 상속받고 __init__을 오버라이드하고 메서드를 얹는” 같은 패턴이라, 기초 문법이 커리큘럼 전체의 뼈대와 이어져 있어요.

정리는 assert 드릴로

정리 노트만으로는 손에 남지 않아서, assert 셀프체크가 달린 드릴 파일을 따로 만들었어요. 문제는 교과서 예제 대신 로봇 시나리오로요.

def next_command(queue):
    """queue가 None이면 'ERROR', 빈 리스트면 'IDLE',
    아니면 첫 명령을 pop(0)으로 꺼내 반환. None과 빈 값을 구분할 것."""

통신이 끊긴 상태(None)와 할 일이 없는 상태(빈 리스트)를 구분하는 truthiness 문제인데, 로봇 콜백에서 헷갈리면 그대로 버그가 돼요. TODO를 채워 실행하면 assert가 문제마다 통과·실패를 찍고, 기준은 자료 없이 전부 통과예요.

다음은 처음으로 로봇의 몸, 모터와 실시간 신호를 배운 1kHz 제어 주기와 지터 — 로봇 제어가 1ms를 다투는 이유으로 이어져요.