키워드
- 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 개발문서 정리하기