관련글 :
| 기본 입출력 함수 정리 + strip, split 비교 | https://waydd.tistory.com/30 |
| 이중 밑줄 메서드 | https://waydd.tistory.com/68 |
| 기본 문법 사용 예시 (정렬, 형변환 등) | https://waydd.tistory.com/116 |
1. 컬렉션 공통 메서드 정리
| 의미 | 사용 가능 자료구조 | |
| .copy() | 얕은 복사 | list, dict, set |
| .clear() | 내용 모두 제거 | list, dict, set |
| .pop() | 요소 제거 후 반환 | list, dict, set |
| .len() | 길이 반환 | list, tuple, set, dict, str, 등 |
| in | 포함 여부 (예약어) | 모든 시퀀스 및 set, dict(key 존재 여부), range, str 등 |
| __iter__() | 반복 가능 객체 | list, dict, set, tuple 등 |
| == | 값 비교 (연산자) | list, dict, set, tuple 등 |
※ iterable (반복 가능 객체)에 포함되는 것들
- 내장 자료형 : list, tuple, str, set, dict, range
- iterator 객체(반환형 변환 함수들 포함) : enumerate(), map(), filter(), generator 표현식(for문), iter(list)
- 위의 컬렉션별 지원 여부 요약
| list | dict | set | |
| .copy() | O | O | O |
| .clear() | O | O | O |
| .pop() | O | O | O |
| .len() | O | O | O |
| in | O | O (키 기준) | O |
3. 문자열 전용 메서드
- "구분자".join(iterable)
- str 클래스의 메서드, 리스트 요소를 구분자로 연결하여 문자열로 반환(=결합)
- iterable은 반드시 문자열(str)로 변환해야함 ex) ",".join(map(str, ["a", 1, "b"]))
→ 내부적으로 문자열 리스트만 연결 가능 - iterable의 요소가 0, 1개일때는 구분자가 포함되지 않음
- iterable의 요소가 0개일때는 '' (빈문자열) 반환
words = ["Hello", "world", "Python"]
sentence = " ".join(words)
",".join(["a", "b", "c"]) # 'a,b,c'
"-".join(["2025", "06", "10"]) # '2025-06-10'
"".join(["a", "b", "c"]) # 'abc' (아무 구분자도 없음)
- "문자열".split([sep=None, maxsplit=-1])
- str 클래스의 메서드, 문자열을 구분자로 나누어 리스트로 반환(= 분리)
- sep(구분자) 가 None 이면 모든 공백 문자(스페이스, 탭, 개행 등 모든 공백)를 기준으로 나눔
- 연속된 공백도 하나로 취급 → 빈 문자열은 결과에 안들어감
- maxsplit로 최대 분할 횟수를 설정하면, 지정한 횟수까지만 나누고 나머지는 유지
- maxsplit가 -1 일때는 나눠지는 만큼 모두 분리 (제한 없음)
s3 = "one-two-three-four"
print(s3.split("-", 2)) # ['one', 'two', 'three-four'] (2번만 나눔)
※ 공백류 범위
스페이스 (' '), 탭 ('\t'), 줄바꿈 ('\n'), 캐리지리턴 ('\r'), 폼피드 ('\x0c'), 수직 탭('\x0b')
→ 인자를 주지 않으면 위를 전부 구분자로 취급
※ 큰 따옴표와 작은 따옴표
- 차이는 거의 없지만 일관성 있게 사용 권장
- 서로 중첩되는 경우 사용 가능 ex) s = 'He said "Hi"'
- 같은 종류를 사용한다면 이스케이프 필요 ex) s = 'It\'s okay'
※ None 과 ''(빈 문자열)
- 둘다 조건문 판단시 False로 반환
- None은 자료형이 NoneType(null에 해당), ''은 길이가 0인 str
- "문자열".startswith(prefix[, start[, end]])
- 주어진 접두사(prefix)로 시작하는지 확인 (True 또는 False 반환)
- 범위 지정 가능 (start, end)
"hello world".startswith("hello") # True
"hello world".startswith("world", 6) # True
- 위를 제외한 정리표
| "문자열".endswith(suffix[, start[, end]]) | 주어진 접미사(suffix)로 끝나는지 확인 (True 또는 False 반환) |
| "문자열".strip([chars]) | 양쪽 끝 문자 제거 (공백 또는 지정 문자) |
| "문자열".replace(old, new[, count]) | 문자열 내 특정 부분을 다른 문자열로 교체 count를 지정하면 그 횟수만 교체 |
| "문자열".find(sub[, start[, end]]) | 지정 문자열(sub)의 첫 인덱스를 반환 (없으면 -1) |
| "문자열".count(sub[, start[, end]]) | 지정 문자열 등장 횟수 세기 |
| "문자열".isdigit() / "문자열".isalpha() | 문자열이 숫자/알파벳 으로만 구성되어 있는지 확인 (True 또는 False 반환) |
4. 수학 함수
- 같은 기능을 제공하는 경우, 기본적으로 "내장함수 → 연산자 → 외부 모듈 함수" 순으로 빠름
- 꼼수가 아닌 진짜 수학적 의미로 정확한 값을 구하고 싶다면, 연산자나 math 모듈 사용 권장
- 수학 처리 연산자
| 설명 | 반환 타입 | |
| / | 실수 나눗셈 | float (정수끼리 계산해도 float로 형변환됨) |
| // | 내림 나눗셈 (몫 연산 후 내림) | float |
| % | 나머지 (피제수의 부호를 따르기 때문에 음수일 때 주의) | int |
| ** | 제곱 (음수 지수도 허용, 결과는 소수) | int or float |
※ 단순 내림 연산(floor)를 원한다면 x // 1 (단, 실수를 반환)
※ 올림 직접 구현 : (n - 1) // d + 1 또는 -(-n // d)
※ 제자리 연산 (in-place)
n = n // 2 (일반 대입) 보다 n //= 2 (제자리 연산 = 직접 수정)이 약간 더 빠르다 (코드 간결 + 가독성은 덤)
※ 제자리 연산 주의사항 (예시 포함)
- 삼항 연산의 결과는 오른쪽 전체가 대입되는데 제자리 연산을 사용하는 것은 문맥상 허용되지 않음 (문법 오류)
- //= 뒤에 오는 내용은 단순 숫자만 기대하지만 Python이 코드를 해석하려고 시도할 때, 조건식을 어떻게 적용해야 할지 명확하지 않다고 판단하여 문법 오류(SyntaxError)가 남
n = n // 2 if n % 2 == 0 else n * 1 → 가능
n //= 2 if n % 2 == 0 else n * 1 → 불가능
- 내장(built-in) 함수
| 설명 | 반환 타입 | |
| abs(x) | 절댓값 | int or float |
| sum(iterable[, start=0]) | 총합 (합계) | int or float |
| round(x[, ndigits]) | 짝수 쪽 반올림 (소수 n자리까지) | int or float |
| pow(x, y[, z]) | 거듭제곱 (x^y), z 지정 시 x^y % z | int or float |
| max(iterable, *, key=None, default) | 최댓값 (동일하다면 가장 먼저 참조한 항목 반환) | 입력값에 따라 (int, str 등) |
| min(iterable, *, key=None, default) | 최솟값 (동일하다면 가장 먼저 참조한 항목 반환) | 입력값에 따라 |
| divmod(a, b) | (몫, 나머지) | tuple |
| int(x, base) | 정수로 변환 (base는 진수) 또는 소수점 버림 (0 방향으로) |
int |
| float(x) | 실수로 변환 | float |
※ Python의 정렬 함수 (key=...)
- 매개변수 key는 iterable의 각 요소를 넣었을 때 비교 기준값을 반환하는 함수여야 함 → len("123"), d.get(key) 이런 형식
- 둘다 동일하게 딕셔너리는 key 기준 반환
- math 모듈을 통해 제공되는 함수
- 기초 수학 함수용 모듈 (삼각함수, 로그, 제곱근 등)
- 순수 파이썬, C로 구현되어 빠름
| 설명 | 반환 타입 | |
| math.sqrt(x) | √x, 제곱근 | float |
| math.pow(x, y) | x^y (실수 거듭제곱) | float |
| math.log(x) / math.exp(x) | 자연로그(= 밑이 e(≈2.718)인 로그) ln(x) / 지수함수(= 로그의 역함수 = e를 x번 곱한 값) e^x |
float ex) math.log(e) → 1.0 math.exp(1) → e ≈ 2.718 |
| math.trunc(x) | 소수점 버림 | int |
| math.floor(x) | 내림 (음수 방향으로 소수점 버림) ex) -3.9 → -4 |
int |
| math.ceil(x) | 올림 | int |
| math.factorial(x) | x! (정수 팩토리얼) | int |
| math.gcd(a, b) | 최대공약수 (Python 3.5+) | int |
| math.lcm(a, b) | 최소공배수 (Python 3.9+) | int |
| math.isqrt(x) | 정수 제곱근 (int) | int |
| math.copysign(x, y) | x의 절댓값에 y의 부호 적용 | float |
| math.isfinite(x) | 유한한 값이면 True | bool |
| math.isinf(x) | 무한대 여부 | bool |
| math.isnan(x) | NaN 여부 | bool |
# gcd, lcm 직접 구현
def gcd(a, b):
while b:
a, b = b, a % b
return a
def lcm(a, b):
return abs(a * b) // gcd(a, b)
- 상수
| 출력값 | 의미 | 타입 | |
| math.pi | 3.141592653589793 | 원주율 π | float |
| math.inf or float('inf') | inf | 양의 무한대, 음의 무한대를 원하면 -(마이너스) 부호 추가 |
float |
| math.nan | nan | 수학적으로 정의되지 않은 값 (Not a Number) |
float |
5. 내장 함수
(공통) iterator를 반환하는 함수들은 전체 계산값들을 print로 출력할때 list를 사용함 (그 자체는 객체 자체 메모리 주소를 출력함)
- 함수로 리스트가 바로 만들어지는 것이 아니라(결과를 미리 계산해서 저장 X),
필요할 때마다 하나씩 계산해서 주는 방식인 lazy(지연 평가) 방식의 반복자가 반환되기 때문 → 메모리 효율적 - range 함수는 지연 평가 기반의 iterator를 반환함, iter()를 통해 반복자로 변환 가능
※ 지연 평가
- 리스트의 경우
lst = [x * 2 for x in range(3)] # 계산이 즉시 전부 수행, 결과가 리스트에 저장됨
- 지연평가 기반의 반복자를 사용하는 경우
m = map(lambda x: x * 2, range(3))
print(m) # <map object at ...> ← 결과가 보이지 않음
print(next(m)) # 0 (이때 계산됨)
print(next(m)) # 2 (이때 계산됨)
- 표준 출력 장치(보통 콘솔)에 문자열이나 값을 출력 (반환값은 None = 없음)
- 출력할 값이 여러개일때, 값 사이 구분자로 구분 가능(sep), 출력 후 끝에 붙을 문자열을 지정할 수 있음(end)
- file: 출력 대상, flush: 버퍼를 강제로 비울지 여부 (기본 False)
표현식 : print(*objects[, sep=' ', end='\n', file=sys.stdout, flush=False])
- len
- 길이나 크기를 갖는 객체 (iterable 혹은 container)에 사용 가능 (길이 개념(length)이 없는 int, float, bool 같은 자료형에는 에러 발생)
- range도 범위 내 숫자 개수를 반환하는 형태로 사용 가능
- 딕셔너리의 경우엔 key 개수 반환
표현식 : length = len(iterable)
# 예시
a = 312
print(len(str(a)))
※ iterable(반복 가능 객체)와 container(컨테이너 객체)
- iterable : 말 그대로 반복할 수 있는 객체로, 내부에서 값을 하나씩 꺼내는 기능 중심 (__iter__, __getitem__)
(for문에 사용 가능)
- container : 특정값들을 내부에 포함하고 있는지 검사 ( __contains__) (in 연산자에 사용됨)
- 모든 컨테이너는 보통 iterable이지만, 모든 iterable은 container가 아님
※ 모든 iterator는 iterable이다
iterator는 __next__(=다음 값 꺼내기), __iter__(=자기 자신 반환) 메서드를 포함하고 있는데 __iter__()를 가지고 있으므로 iterable이기도 함
- range
- 일정한 간격의 정수 시퀀스(순서열)를 생성하는 iterable 객체 (이터러블, 반복자 아님)
→ 지연 평가 방식을 사용하여 필요한 순간에만 값을 계산해주는 시퀀스 객체, range(1, 1000000)처럼 커도 메모리를 거의 쓰지 않음 - 주로 for 반복문에서 많이 사용
표현식 : range 객체(iterable) = range([start,] stop[, step])
※ 입력 인자 조합에 따른 동작 방식
- range(stop) : 0부터 stop 직전까지의 정수 생성
- range(start, stop) : start부터 stop 직전까지 생성
- range(start, stop, step) : start부터 stop 직전까지 step 간격으로 생성
- iter
- iterable 객체에서 __iter__를 호출해서 해당 객체의 값들을 순서대로 꺼낼 수 있는 반복자(iterator) 생성, 반환
- 생성된 반복자는 객체의 첫 번째 요소를 가리키는 상태로 요소를 출력하지는 못함
기본형 : iterator = iter(iterable)
확장형 : iterator = iter(callable, sentinel)
# 예시
it = iter(range(3))
print(next(it)) # 0
print(next(it)) # 1
※ 반복자 (iterator)
- 포인터처럼 값을 순차적으로 접근한다는 점은 동일
- But. 포인터처럼 값을 직접 가리키는 주소가 아니라 현재 위치 상태를 기억하는 객체
- 또한 iterator는 iterable의 한 종류
※ 확장형 추가 설명
- 기본형과 달리 iterable이 아닌 호출 가능한 함수 input, f.readline, random() 을 요구
- 호출될 때마다 값을 생성해서 sentinel 값을 만나면 종료하는 방식
- next
- 반복자로부터 __next__를 호출해서 반복자의 다음 값(int, str, 등의 value)을 반환
→→ 반복자가 기억하는 위치에서 값을 반환하고 그 이후 iterator 내부 상태를 자동으로 다음 위치로 이동 - iterator 에서 더 이상 꺼낼 값이 없을때 대신 반환할 기본값을 지정할 수 있음 (생략 가능)
기본형 : next(iterator) (iterator 범위벗어나면 에러발생)
확장형 : next(iterator, default)
※ next(iterator) 가 왜 오류가 발생하는지?
- iterator는 일회용으로, 내부적으로 커서(pointer)를 가지고 있음
- next()가 호출될 때마다 커서를 한 칸씩 앞으로 이동
- 하지만 더 이상 꺼낼 값이 없을 때, StopIteration이라는 예외를 발생
※ next() vs 단순 인덱싱 접근 비교
- next() 호출 비용이 [] 인덱싱보다 비쌈 (= 함수 호출 오버헤드) → 실행시간 더 김
- 순회하면서 인덱스를 사용할 수 있다면 인덱싱 권장
- enumerate
- iterable 객체를 반복하면서 인덱스와 값을 동시에 꺼내주는 함수로 반복자(iterator) 객체를 반환
(= 인덱스를 붙인 (index, value) 쌍을 반복에서 꺼냄) - start 매개변수로 인덱스를 몇부터 시작할지 지정할 수 있음
- 주로 for문이나 내장 생성자 함수 list와 함께 쓰인다
표현식 : enumerate 객체(iterator) = enumerate(iterable[, start=0])
# 예시
for i, fruit in enumerate(fruits):
- map
- 함수와 iterable을 받아 각 요소에 함수 적용한 결과인 반복자(iterator) 객체 반환
- lambda 함수와 자주 함께 사용되며, filter()가 반환한 iterator로 조건을 걸고 map 변환이 가능함
- 소문자↔대문자 변환 / max, min / 생성자 함수를 사용해서 문자열이나 해당 자료형으로도 변환 가능
- 주로 리스트 컴프리헨션으로 코드의 간략화에 사용
표현식 : map 객체(iterator) = map(function, iterable)
# 예시
map(str, [1,2,3])` # `['1','2','3']
※ 리스트 2개 동시에 처리도 가능 (함수는 매개변수 2개 필요)
a = [1, 2, 3]
b = [10, 20, 30]
sum_list = list(map(lambda x, y: x + y, a, b)) # [11, 22, 33]
- filter
- 함수와 iterable을 받아 조건을 만족하는 요소만 필터링한 반복자(iterator) 객체 반환
- lambda 함수와 함께 조건 필터링에 자주 사용
- 불리언 컨텍스트 기반으로 list나 문자열의 공백같은 특정값을 제거할 수 있음
표현식 : filter 객체(iterator) = filter(function, iterable)
- any / all
- iterable 중 하나라도 True이면 True 반환 / iterable 모두가 True여야 True 반환
- iterable = 논리값들의 시퀀스
표현식 : any(iterable) / all(iterable)
※ 불리언으로 평가되는 값
0, '', [], None
- zip
- 여러 iterable을 받아 병렬로 튜플로 묶어서 반환
- 즉, 가장 짧은 iterable 길이를 기준으로 짝지으며 반복자가 반환됨
- 관련글 : https://waydd.tistory.com/31
표현식 : zip 객체(iterator) = zip(iter1, iter2, ...)
# 예시
zip([1,2],[‘a’,’b’]) # (1,'a'), (2,'b')
- sorted
- iterable을 정렬해서 새로운 리스트로 반환됨 (쓰인 원래 iterable은 변경되지 않음)
- 관련글 : https://waydd.tistory.com/38
- reversed
- iterable 중 시퀸스(sequence)를 역순으로 접근하는 반복자(iterator) 반환 (정렬 아님)
- 리스트, 튜플, 문자열 등 정해진 길이가 있는 시퀀스 자료형만 사용 가능
표현식 : reversed 객체(iterator) = reversed(seq)
# 예시
list(reversed([1,2,3])) # [3,2,1]
※ 왜 sequence 객체만 매개변수로 받을 수 있을까?
- 길이가 있고 인덱싱이 가능한 자료형만 가능(시퀀스 프로토콜 지원 객체) ex) list, tuple, str, range
- iterator, 집합, generator는 사용 불가
- reversed는 내부적으로 __len__(), __getitem__() 두 메서드 혹은 또는__reversed__() 메서드가 구현된 객체로 작
- 허용되는 타입이 아 경우, 리스트로 먼저 변환 후 reversed 사용하는 방법으로 우회 가능 → reversed(list(iterable))
※ 유사 함수 비교
- sorted(test, reverse=True) # 정렬 후 뒤집어서 반환
- test[::-1] # 리스트의 슬라이싱 으로 역순 생성, reversed와 기능 동일(= 새로운 리스트 복사본 반환, 원본 안바뀜)
- test.reverse() # 제자리(in-place) 연산, 반환값 None(리스트 자체가 바뀜), 복사 안함 (메모리 효율적, 약간 더 빠름)
- eval
- 문자열 형태의 Python 표현식을 실행해서 그결과를 반환
- globals는 전역 이름 공간, locals는 지역 이름 공간을 지정할 수 있음
※ 이름 해석 시 탐색 순서 : locals → globals → 내장 (기본 : 호출된 위치의 전역 변수 및 지역 변수 스코프를 따름) - 함수 호출도 가능, 컴파일된 코드보다 느릴 수 있음 (내부적으로 파서/인터프리터 호출 발생)
- 성능보다는 동적 실행이 필요한 경우 사용되지만,
악의적인 코드도 실행이 가능하기 때문에 외부 입력을 받아 사용하는 것은 권장 X
표현식 : eval(expression[, globals=None, locals=None])
'Language & Tool > Python' 카테고리의 다른 글
| 🐍sort()와 sorted() 차이점 + 다른 정렬 방식 비교 (0) | 2025.06.11 |
|---|---|
| 🌱dict와 defaultdict + Counter (Python) (0) | 2025.06.10 |
| 🐍리스트를 묶는 zip 함수 (0) | 2025.06.09 |
| 🐍입출력 기본정리(input, print) (0) | 2025.06.09 |
| 🔄그래프 표현을 위한 인접 리스트 입력, 변환 (0) | 2025.06.09 |