TIL/[TIL]

[TIL]Python 형변환, 제어문, 함수, 람다와 내장 함수

namerong 2026. 7. 14. 15:00

이번 학습에서는 Python의 형변환, 연산자, 조건문, 반복문, 컴프리헨션, 함수, 람다, 내장 함수를 정리했다.
이전에는 자료형 자체를 학습했다면, 이번에는 그 자료형을 실제 코드 흐름 안에서 어떻게 다루는지에 가까운 내용이었다.

1. 형변환

형변환은 값의 자료형을 다른 자료형으로 바꾸는 것이다.

Python에서는 일부 연산에서 자동 형변환이 일어난다.

print(3 + 1.23)   # int + float -> float
print(3 + True)   # True는 1처럼 처리

하지만 문자열 숫자는 자동으로 숫자가 되지 않는다.

# print(3 + "5")  # TypeError
print(3 + int("5"))

input()은 기본적으로 문자열을 반환하므로 숫자 계산에 사용하려면 형변환이 필요하다.

score = int(input("점수 입력: "))

자료형끼리도 변환할 수 있다.

list((1, 2, 3))              # tuple -> list
tuple([1, 2, 3])             # list -> tuple
set([1, 2, 2, 3])            # list -> set, 중복 제거
dict([("a", 100), ("b", 200)])

dict를 list로 바꾸면 기본적으로 key만 리스트로 변환된다.

list({"a": 100, "b": 200})  # ['a', 'b']

2. 연산자와 삼항 연산자

Python의 삼항 연산자는 Java나 JavaScript와 문법이 다르다.

참일_때_값 if 조건식 else 거짓일_때_값

예시는 다음과 같다.

num = int(input("정수 입력: "))

result = "홀수" if num % 2 == 1 else "짝수"
print(result)

두 수 중 큰 값과 작은 값을 구할 때도 사용할 수 있다.

big = a if a > b else b
small = a if a < b else b

단순 조건에는 삼항 연산자가 편하지만, 조건이 길어지면 일반 if문이 더 읽기 좋다.


3. 조건문

조건문은 조건에 따라 실행할 코드를 나누는 문법이다.

형태 사용 상황
if 조건이 맞을 때만 실행
if else 참/거짓 둘 중 하나 실행
if elif else 여러 조건 중 하나 선택

Python은 비교식을 자연스럽게 이어서 쓸 수 있다.

score = int(input("시험 점수: "))

if 0 <= score <= 100:
    if score >= 60:
        print("합격")
    else:
        print("불합격")
else:
    print("유효하지 않은 점수")

여러 조건을 비교할 때는 elif를 사용한다.

if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
else:
    grade = "F"

4. 반복문

Python의 반복문은 대표적으로 for와 while이 있다.

for문은 반복 가능한 객체를 순회할 때 사용한다.

for fruit in ["apple", "banana", "orange"]:
    print(fruit)

문자열도 반복 가능하다.

for ch in "Python":
    print(ch)

반복 횟수가 정해져 있을 때는 range()를 자주 사용한다.

for i in range(0, 10, 3):
    print(i)

range(start, end, step) 구조이고, end 값은 포함되지 않는다.

while문은 조건이 참인 동안 계속 반복한다.

i = 0

while i < 3:
    print(i)
    i += 1

반복을 중간에 끝내고 싶을 때는 break를 사용한다.

while True:
    text = input("입력: ")

    if text == "exit":
        break

5. Comprehension

Comprehension은 반복문을 짧게 작성해서 리스트나 딕셔너리를 만드는 문법이다.

일반 반복문으로 리스트를 만들면 다음과 같다.

result = []

for n in range(1, 6):
    result.append(n * 2)

list comprehension으로 쓰면 더 간단하다.

result = [n * 2 for n in range(1, 6)]

조건도 함께 넣을 수 있다.

evens = [n for n in range(1, 11) if n % 2 == 0]

dict comprehension도 가능하다.

students = ["kim", "lee", "park"]
scores = [90, 80, 70]

score_map = {name: score for name, score in zip(students, scores)}

간단한 변환이나 필터링에는 유용하지만, 로직이 복잡하면 일반 반복문이 더 적합하다.


6. 함수

함수는 특정 작업을 재사용할 수 있도록 묶은 코드 블록이다.

def add(a, b):
    return a + b

함수 선언부에서 받는 이름은 parameter, 호출할 때 전달하는 값은 argument라고 한다.

def bar(k, m):  # k, m은 parameter
    return k + m

bar(10, 20)     # 10, 20은 argument

return은 함수의 결과값을 호출한 쪽으로 돌려준다.
return이 없으면 기본적으로 None을 반환한다.

def foo():
    return 100

result = foo()

기본값 매개변수도 사용할 수 있다.

def print_info(name, age, has_married=True):
    print(name, age, has_married)

*args는 여러 위치 인자를 tuple로 받는다.

def accept(*args):
    print(args)

accept(1, 2, 3)

**kwargs는 여러 키워드 인자를 dict로 받는다.

def spec(**kwargs):
    print(kwargs)

spec(width=300, height=700)

7. 함수가 일급 객체라는 의미

Python에서 함수는 값처럼 다룰 수 있다.
이것을 함수가 일급 객체라고 한다.

함수를 변수에 담을 수 있다.

def foo():
    print("foo")

doo = foo
doo()

함수를 다른 함수의 인자로 전달할 수도 있다.

def runner(f):
    f()

runner(foo)

함수 안에서 함수를 만들어 반환할 수도 있다.

def get_func():
    def bar():
        print("bar")
    return bar

f = get_func()
f()

이 개념은 map, filter, lambda, decorator 같은 문법을 이해할 때 중요하다.


8. Lambda

lambda는 이름 없는 짧은 함수를 만들 때 사용한다.

lambda 매개변수: 반환값

일반 함수는 다음처럼 작성한다.

def square(x):
    return x ** 2

lambda로 쓰면 다음과 같다.

square = lambda x: x ** 2

기본값이나 여러 인자도 사용할 수 있다.

add = lambda a, b=3: a + b
adder = lambda *args: sum(args)

lambda는 짧은 계산식에 적합하다.
로직이 길거나 조건이 복잡하면 def로 함수명을 붙이는 편이 더 낫다.


9. Built-in 함수

Python에는 별도 import 없이 바로 사용할 수 있는 내장 함수가 많다.
이번에는 map, filter, reduce 흐름을 중심으로 정리했다.

map

map()은 iterable의 각 요소에 함수를 적용한다.

texts = ["hello", "python", "ai"]

lengths = list(map(len, texts))

lambda와 함께 사용할 수도 있다.

lengths = list(map(lambda x: len(x), texts))

여러 iterable을 함께 넘길 수도 있다.

mid_terms = [80, 90]
final_terms = [100, 70]

averages = list(map(lambda mid, final: (mid + final) / 2, mid_terms, final_terms))

즉, map은 각 요소를 다른 값으로 변환할 때 사용한다.

filter

filter()는 조건을 만족하는 값만 남긴다.

nums = [1, 2, 3, 4, 5, 6]

evens = list(filter(lambda x: x % 2 == 0, nums))

즉, filter는 걸러내기 용도다.

reduce

reduce()는 여러 값을 하나의 결과로 누적한다.
Python에서는 functools에서 가져와 사용한다.

from functools import reduce

nums = [1, 2, 3, 4]

total = reduce(lambda acc, current: acc + current, nums, 0)

여기서 acc는 누적값이고, current는 현재 처리 중인 값이다.

이번에 추가로 reduce()를 이용해 최대값을 구하는 흐름도 확인했다.

from functools import reduce

numbers = [23, 5, 6, 100, 399, 342, -102, 435, 12]

max_num = reduce(lambda a, b: a if a > b else b, numbers)
print(max_num)

동작 흐름은 다음과 같다.

23과 5 비교 -> 23 유지
23과 6 비교 -> 23 유지
23과 100 비교 -> 100 변경
100과 399 비교 -> 399 변경
399와 342 비교 -> 399 유지
399와 -102 비교 -> 399 유지
399와 435 비교 -> 435 변경
435와 12 비교 -> 435 유지

결과적으로 가장 큰 값인 435가 남는다.

직접 함수로 풀어 쓰면 reduce의 흐름을 더 쉽게 볼 수 있다.

def op(a, b):
    print(f"{a=}, {b=} : max = {a if a > b else b}")
    return a if a > b else b

max_num = reduce(op, numbers)

다만 단순 최대값은 실무에서는 reduce()보다 max()가 더 간단하다.

max(numbers)

즉, reduce()는 누적 처리 원리를 이해하는 데 중요하지만, 이미 내장 함수가 있는 경우에는 sum(), max(), min()을 먼저 쓰는 편이 좋다.


10. 핵심 정리

  1. input()은 문자열을 반환하므로 숫자 계산 전 형변환이 필요하다.
  2. int(), float(), str(), list(), tuple(), set(), dict()로 자료형을 바꿀 수 있다.
  3. Python의 삼항 연산자는 값1 if 조건 else 값2 형태다.
  4. 조건문은 if, if else, if elif else로 상황을 나눠 처리한다.
  5. for문은 iterable 순회에 사용하고, range()와 자주 함께 쓴다.
  6. while문은 조건이 참인 동안 반복하며, break로 중단할 수 있다.
  7. comprehension은 반복으로 리스트나 딕셔너리를 간결하게 만들 때 사용한다.
  8. 함수는 def로 선언하고, return으로 결과를 반환한다.
  9. *args는 여러 위치 인자를 tuple로 받고, **kwargs는 여러 키워드 인자를 dict로 받는다.
  10. Python에서 함수는 일급 객체라 변수에 담거나 인자로 전달할 수 있다.
  11. lambda는 짧은 익명 함수가 필요할 때 사용한다.
  12. map은 변환, filter는 필터링, reduce는 누적 처리에 사용한다.
  13. 단순 합계나 최대/최소는 reduce()보다 sum(), max(), min()을 먼저 고려하는 것이 좋다.