키워드

  • Python 로컬 변수 스코프.
  • Python에서 람다식 정리, Swift 인라인 클로저와 다른점.
  • 블로그 마이그레이션 하면서 이전에 썼던 iOS 관련 글 복습
  • 블로그에서 카테고리를 몇개를 해야하는가?

내용

Python 로컬 변수 스코프 문제

Leetcode 1291번 문제를 푸는 도중에 다음과 같이 코드를 작성했다. 로직에 오류가 있어서 통과는 못하는 코드다.

class Solution:
    def sequentialDigits(self, low: int, high: int) -> List[int]:
        answer = []
        seq = []
        def dfs(n: int):
            if n > 9:
                return
            if seq:
                intSeq = int("".join(seq))
                if high < intSeq:
                    seq = [] # 이부분
                    return
            ...

seq 변수가 sequentialDigits 함수의 로컬 변수인데, if 문 안의 seq = [] 부분 때문에 에러가 났다.

찾아보니까 파이썬에선 저런식으로 작성하면. dfs의 로컬 변수가 선언된걸로 인식한다고 한다. 아무래도 변수 선언과 할당 구분이 딱히 없는 언어다 보니까. 이런 일이 발생하는 것 같다.

저 로직 자체는 완전히 틀린 로직이라서 seq = []으로 재할당할 필요가 없지만, 만약 진짜 재할당을 해야하는 상황이었다면. seq.clear()를 써야한다.

Python 람다식

Swift의 인라인 클로저는 되게 직관적이라 생각하고 잘 쓰고 있는데, Python에서 람다식을 쓰는 방법이 조금 달라서 정리해봤다.

정렬

Swift는 비교 함수를 넘기는 방식 { $0 < $1 } 인데, Python은 “기준값"을 반환하는 key 함수를 넘기는 방식이다. 기본은 오름차순이고, reverse=True 로 내림차순으로 바꿀 수 있다.

sorted(arr, key=lambda x: x[0])           # 오름차순
sorted(arr, key=lambda x: x[0], reverse=True)  # 내림차순

다중 기준 정렬은 튜플로 묶으면 된다. 튜플은 앞 원소부터 순서대로 비교하는 규칙이 있어서, 아래처럼 쓰면 x[0] 오름차순, x[1] 내림차순이 된다. 숫자에 - 를 붙이면 오름차순으로 정렬해도 원래 기준으론 내림차순이 되는 원리다.

사람들이 너무 당연하듯 사용하는 것 같은데, 튜플 비교 원리랑 sorted 동작을 알아야 이해를 할 수 있는 코드다.

sorted(arr, key=lambda x: (x[0], -x[1]))

비교 함수를 직접 쓰고 싶으면 cmp_to_key 를 쓰면 된다. Swift랑 개념이 유사하다.

from functools import cmp_to_key
sorted(arr, key=cmp_to_key(lambda a, b: a[0] - b[0]))

map

Swift의 .map { $0 * 2 } 랑 개념은 같다. Python은 이터레이터를 반환해서 list() 로 감싸줘야 한다.

list(map(lambda x: x * 2, arr))

Python에서는 map보다 리스트 컴프리헨션을 더 많이 쓴다.

[x * 2 for x in arr]

Mermaid 다크모드 대응시키기.

Mermaid가 처음 블로그의 테마로 SVG가 그려지고, 이후에 테마가 변해도 그대로 유지되어서 가시성이 나빠지는 문제가 있었는데, 수정했다. 따로 포스팅 할 예정이다.

블로그 카테고리 수는 몇 개가 좋을까.

CS, PS, TIL, iOS, Express, Swift, TS, JS, DevOps 등등 다 카테고리로 쪼개려니 고민이 많았다. 특히 Call by Reference, Call by Pointer 비교와 같은 글은 어느 카테고리로 분리해야하는지도 감이 안잡혔다.

다른 블로그들을 참조해보니, ‘기타’와 같은 카테고리는 피하고, 한 카테고리에 글이 최소 10개정도는 들어갈 수 있을 때 분리하는걸 추천한다고 한다.

일단 CS 카테고리 내부로 넣어놓고. 나중에 글이 좀 차면 분리하자.

다음에 해볼 것

  • Diffable DataSource, Swift Macro 등등.. 다시 보니까 설명을 못할 것 같은 개념들 WWDC 영상 다시 시청하고 정리하기
  • SniffMeet 개발문서 정리하기