Python/Chapter03. 함수, 함수의 변수작동방식(call by value, call by reference), 반복문

lullaby ·2025년 10월 1일

Python

목록 보기
3/13
post-thumbnail

1. 함수(Functions) 핵심 개념

1.1 함수의 기본 개념

  • 함수(Function): 특정 작업을 수행하는 코드 블록
  • 장점: 코드 재사용성, 모듈화, 가독성 향상

1.2 함수 정의와 호출

# 함수 정의
def 함수이름(매개변수):
    # 함수 내용
    return 결과값

# 함수 호출
결과 = 함수이름(인자)

1.3 사칙 연산 함수 예제

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

def sub(a, b):
    return a - b

def mul(a, b):
    return a * b

def div(a, b):
    return a / b

# 함수 호출 예제
r1 = mul(a=20, b=30)  # 키워드 인자 사용
r2 = add(a=10, b=r1)
print(r2)  # 출력: 610

1.4 온도 변환기 함수 예제

def printOptions():
    print("'c'섭씨온도에서 화씨온도로 변환")
    print("'f'화씨온도에서 섭씨온도로 변환")
    print("'q'종료")
    print("="*30)

def C2F(c_temp):  # 섭씨 온도를 화씨 온도로 변환
    return 9.0 / 5.0 * c_temp + 32

def F2C(f_temp):  # 화씨 온도를 섭씨 온도로 변환
    return (f_temp - 32.0) * 5.0 / 9.0

# 사용 예시
printOptions()
choice = input("메뉴에서 선택하세요.")
if choice == "c":
    temp = float(input("섭씨온도: "))
    print("화씨온도:", C2F(temp))
elif choice == "f":
    temp = float(input("화씨온도: "))
    print("섭씨온도:", F2C(temp))
elif choice == "q":
    print("종료합니다.")
else:
    print("c, f, q중 하나를 입력하시오.")

2. 함수의 변수 작동 방식

2.1 Call-by-value vs Call-by-reference

Call-by-value (값에 의한 전달)

  • 변수의 값을 복사하여 함수에 전달
  • 함수 내에서 값을 변경해도 원본 변수에 영향 없음
  • 숫자, 문자열과 같은 불변(immutable) 타입에 적용
def modify(n):
    print("함수 내부 n id =", id(n))
    print("함수 내부 n value =", n)
    n = n + 1
    print("함수 n = n +1실행 후 내부 n id =", id(n))
    print("함수 n = n +1실행 후 내부 n value =", n)

k = 10
print("함수 외부 (1) k id =", id(k))
print("함수 외부 (1) k value =", k)
modify(k)
print("함수 외부 (2) k id =", id(k))
print("함수 외부 (2) k value =", k)

Call-by-reference (참조에 의한 전달)

  • 변수의 참조(메모리 주소)를 함수에 전달
  • 함수 내에서 변경 시 원본 변수도 변경됨
  • 리스트와 같은 가변(mutable) 타입에 적용
def modify2(li):
    print("함수 내부 li id =", id(li))
    print("함수 내부 li =", li)
    li += [100, 200]  # 원본 리스트 변경
    print("함수 li += [100, 200]실행 후 내부 li id =", id(li))
    print("함수 li += [100, 200]실행 후 내부 li =", li)

list = [1, 2, 3, 4, 5]
print("함수 호출 전 외부 list id =", id(list))
print("함수 호출 전 외부 list =", list)
modify2(list)
print("함수 호출 후 외부 list id =", id(list))
print("함수 호출 후 외부 list =", list)  # [1, 2, 3, 4, 5, 100, 200]

참고: 객체 재할당은 새로운 객체를 생성하므로 참조가 끊어짐

def modify2(li):
    print("함수 내부 li id =", id(li))
    print("함수 내부 li =", li)
    li = [100, 200]  # 새로운 객체 할당 (원본 변경 안 됨)
    print("함수 li = [100, 200]실행 후 내부 li id =", id(li))
    print("함수 li = [100, 200]실행 후 내부 li =", li)

list = [1, 2, 3, 4, 5]
modify2(list)
print("함수 호출 후 외부 list =", list)  # [1, 2, 3, 4, 5]

2.2 지역 변수와 전역 변수

지역 변수 (Local Variable)

  • 함수 내부에서 선언된 변수
  • 함수 내부에서만 사용 가능
  • 함수 실행이 끝나면 소멸
def sub():
    s = "바나나가 좋음!"  # 지역 변수
    print(s)

sub()
# print(s)  # 오류: 지역 변수는 함수 외부에서 접근 불가

전역 변수 (Global Variable)

  • 함수 외부에서 선언된 변수
  • 프로그램 전체에서 접근 가능
  • 함수 내부에서도 사용 가능 (단, 수정은 global 키워드 필요)

global 키워드: 함수 내에서 전역 변수를 수정할 때 사용

s = "사과가 좋음!"  # 전역 변수

def sub():
    print("함수 내부 :", s)  # 전역 변수 사용 가능

sub()
print("함수 외부 :", s)
def sub():
    global s  # 전역 변수 s를 사용하겠다고 선언//글로벌썻으니까 이거이제 걍 연결됏다고간주 ㄱㄱ
    print("함수 내부 (외부로 부터 전달받음) : s ->", s)
    s = "바나나가 좋음!"  # 전역 변수 값 변경
    print("함수 내부 (내부에서 수정됨) : s ->", s)

s = "사과가 좋음!"
print("함수 외부 (함수 실행 전) : s ->", s)
sub()
print("함수 외부 (함수 실행 후) : s ->", s)  # "바나나가 좋음!" 출력

2.3 람다 함수 (Lambda Function)

  • 익명 함수: 이름이 없는 한 줄짜리 함수 ◦ 여러 개의 argument를 가지고 있으나 return value는 하나만 있어야 함
    ◦ 익명함수 내에서는 print()를 호출할 수 없고 간단한 계산만 가능함
    ◦ global variables를 참조할 수 없음
    ◦ 1개의 라인으로 구성되는 함수임
  • lambda 키워드로 생성
  • 간단한 계산에 유용
sum = lambda x, y: x + y
print("정수의 합 :", sum(10, 20))  # 정수의 합 : 30
print("정수의 합 :", sum(20, 20))  # 정수의 합 : 40

3. 반복문(Loops) 핵심 개념

3.1 반복문 기본 개념

  • 동일한 작업을 여러 번 수행하는 구조
  • 컴퓨터는 반복 작업을 실수 없이 빠르게 수행

3.2 for 반복문

기본 구조:

for 변수 in 시퀀스:
    # 반복할 코드

예제:

# 문자열 "환영합니다"를 5번 출력
for x in range(5):
    print("환영합니다.")

# 리스트의 각 요소에 접근
for name in ["철수", "영희", "길동", "유신"]:
    print("안녕! " + name)

3.3 range() 함수

  • 특정 범위의 정수 시퀀스를 생성하는 함수
  • range(stop): 0부터 stop-1까지의 정수 생성
  • range(start, stop): start부터 stop-1까지의 정수 생성
  • range(start, stop, step): start부터 stop-1까지 step 간격으로 정수 생성
# 0부터 9까지 출력
for x in range(10):
    print(x, end=" ")  # 0 1 2 3 4 5 6 7 8 9

# 0부터 9까지의 합계 계산
sum = 0
for x in range(10):
    sum = sum + x
print(sum)  # 45

4. 예상 문제 및 풀이

문제 1: 함수 개념 이해하기

다음 코드의 출력 결과는?

def calculate_area(radius):
    result = 3.14 * radius**2
    return result

r = float(input("원의 반지름: "))  # 사용자가 10.0 입력
area = calculate_area(r)
print(area)
  • : 314.0

문제 2: 지역 변수와 전역 변수

다음 코드의 출력 결과는?

def sub(x, y):
    global a
    a = 7
    x, y = y, x
    b = 3
    print("함수 내부 a : %d, b : %d, x : %d, y : %d" % (a, b, x, y))

a, b, x, y = 1, 2, 3, 4
sub(x, y)
print("함수 외부 a : %d, b : %d, x : %d, y : %d" % (a, b, x, y))
  • :
    함수 내부 a : 7, b : 3, x : 4, y : 3
    함수 외부 a : 7, b : 2, x : 3, y : 4

문제 3: Call-by-value와 Call-by-reference

다음 코드의 출력 결과는?

def modify(mylist):
    print("함수 내부에서의 mylist:", mylist)
    mylist = [1, 2, 3, 4]
    print("함수 내부에서의 mylist:", mylist)
    return

mylist = [10, 20, 30, 40]
modify(mylist)
print("함수 외부에서의 mylist:", mylist)
  • :
    함수 내부에서의 mylist: [10, 20, 30, 40]
    함수 내부에서의 mylist: [1, 2, 3, 4]
    함수 외부에서의 mylist: [10, 20, 30, 40]
    

문제 4: for 반복문과 range 함수

다음 코드를 실행하면 총 몇 번의 반복이 수행되는가?

sum = 0
for i in range(1, 10, 2):
    for j in range(2, 5):
        sum += i * j
print(sum)
  • : 5 × 3 = 15번 (i는 1,3,5,7,9의 5개 값, j는 2,3,4의 3개 값)

문제 5: 함수 작성 문제

다음과 같은 기능을 하는 함수를 작성하시오:

  1. 사용자로부터 두 개의 정수를 입력받는 함수
  2. 입력받은 두 정수 사이의 모든 정수의 합을 계산하는 함수
  3. 결과를 출력하는 함수
  • :
    def get_two_integers():
        num1 = int(input("첫 번째 정수를 입력하세요: "))
        num2 = int(input("두 번째 정수를 입력하세요: "))
        return num1, num2
    
    def calculate_sum_between(a, b):
        # 항상 작은 수부터 큰 수까지 더하기
        if a > b:
            a, b = b, a
        total = 0
        for i in range(a, b + 1):
            total += i
        return total
    
    def print_result(result):
        print("두 정수 사이의 모든 정수의 합:", result)
    
    def main():
        num1, num2 = get_two_integers()
        sum_result = calculate_sum_between(num1, num2)
        print_result(sum_result)
    
    main()
    

0개의 댓글