소개

Python 에서 함수 (function) 는 단일하고 관련된 작업을 수행하는 데 사용되는 구성되고 재사용 가능한 코드 블록입니다. 함수는 애플리케이션에 더 나은 모듈성 (modularity) 과 높은 수준의 코드 재사용성을 제공합니다.

본 랩 (lab) 에서는 Python 에서 함수를 생성하고 사용하는 기본 사항을 학습합니다. 인수를 받는 함수 정의, 명확성을 위한 키워드 인수 (keyword arguments) 사용, 값 반환, 지역 변수 (local variable) 와 전역 변수 (global variable) 범위의 차이 이해, 그리고 lambda를 사용한 간결한 익명 함수 (anonymous function) 생성 연습을 하게 됩니다.

함수 인수 (Function Arguments)

이 단계에서는 인수를 받는 함수를 정의하는 방법을 배웁니다. 함수는 호출될 때 전달하는 값인 인수(arguments)를 받을 수 있습니다.

참고: WebIDE(VS Code 와 유사) 사용이 익숙하지 않다면, 이 랩 (lab)에서 먼저 학습하십시오.

이제 name 인수를 받아 개인화된 인사말을 출력하는 함수를 만들어 보겠습니다.

먼저, 왼쪽 파일 탐색기에서 arguments.py 파일을 엽니다.

다음으로, 다음 코드를 arguments.py 파일에 복사하여 붙여넣습니다. 이 코드는 name이라는 하나의 인수를 받는 say_hello 함수를 정의합니다.

## Define a function that takes one argument
def say_hello(name):
   print(f'Hello {name}')

## Call the function with a string argument
say_hello('Carlos')
say_hello('Wanda')
say_hello('Rose')

이제 스크립트를 실행해 봅시다. WebIDE 에서 터미널을 열고 다음 명령을 실행합니다.

python3 arguments.py

각 이름에 대해 고유한 인사말을 생성하며 함수가 다른 이름으로 호출되는 것을 볼 수 있습니다.

Hello Carlos
Hello Wanda
Hello Rose

이는 인수가 함수를 얼마나 유연하고 재사용 가능하게 만드는지 보여줍니다.

키워드 인수 (Keyword Arguments)

이 단계에서는 코드 가독성을 향상시키기 위해 키워드 인수를 사용하는 방법을 배웁니다. 함수에 여러 매개변수 (parameter) 가 있을 때, 매개변수의 이름을 사용하여 어떤 인수가 어떤 매개변수에 해당하는지 지정할 수 있습니다. 이를 키워드 인수(keyword argument)라고 합니다.

위치 인수 (positional arguments) 를 사용할 때는 전달하는 순서가 중요합니다. 키워드 인수를 사용하면 순서가 중요하지 않으므로 코드가 더 명시적이고 이해하기 쉬워집니다.

파일 탐색기에서 keywords.py 파일을 엽니다. 다음 코드를 복사하여 붙여넣습니다.

## Function with multiple parameters
def say_hi(name, greeting):
   print(f"{greeting} {name}")

## Positional arguments: order matters
print("Calling with positional arguments:")
say_hi('John', 'Hello')

## Keyword arguments: order doesn't matter, more readable
print("\nCalling with keyword arguments:")
say_hi(name='Anna', greeting='Hi')

이제 터미널에서 스크립트를 실행합니다.

python3 keywords.py

두 함수 호출의 출력을 볼 수 있습니다. 키워드 인수를 사용하면 어떤 순서로든 값을 전달할 수 있음을 확인하십시오.

Calling with positional arguments:
Hello John

Calling with keyword arguments:
Hi Anna

반환 값 (Return Values)

이 단계에서는 return 문을 사용하여 함수가 출력을 생성하도록 하는 방법을 탐구합니다. print()는 콘솔에 값을 표시하는 반면, return은 함수에서 값을 되돌려 보냅니다. 이렇게 반환된 값은 변수에 저장하거나 다른 표현식에서 사용할 수 있습니다.

두 숫자를 받아 더한 후 그 결과를 반환하는 함수를 만들어 보겠습니다.

returns.py 파일을 열고 다음 코드를 추가합니다. sum_two_numbers 함수는 합계를 계산하고 return 키워드를 사용하여 결과를 출력합니다.

## Function that returns a value using return statement
def sum_two_numbers(number_1, number_2):
   return number_1 + number_2

## Call function and store the returned value
result = sum_two_numbers(7, 8)
print(result)

터미널에서 스크립트를 실행합니다.

python3 returns.py

출력은 함수가 반환한 값이며, 이 값은 result 변수에 저장된 후 출력되었습니다.

15

지역 및 전역 범위 (Local and Global Scope)

이 단계에서는 지역 변수 범위 (local variable scope) 와 전역 변수 범위 (global variable scope) 의 차이점을 발견하게 됩니다. 변수의 범위는 코드 내에서 해당 변수에 접근할 수 있는 위치를 결정합니다.

  • 전역 범위 (Global Scope): 함수 외부에서 정의된 변수는 전역 범위에 속하며 코드 내 어디에서든, 함수 내부를 포함하여 접근할 수 있습니다.
  • 지역 범위 (Local Scope): 함수 내에서 생성된 변수는 해당 함수의 지역 범위에 속합니다. 이 변수들은 해당 함수 내에서만 존재하며 외부에서는 접근할 수 없습니다.

먼저 전역 범위에서 지역 변수에 접근하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다. 다음 코드를 실행하면 local_variable이 전역 범위에 정의되어 있지 않기 때문에 NameError가 발생합니다.

## This code will cause an error
global_variable = 'I am available everywhere'

def some_function():
    print(global_variable)
    local_variable = "only available within this function"
    print(local_variable)

## This will raise NameError because local_variable doesn't exist here
## print(local_variable)

global 문 (The global Statement)

함수 내부에서 전역 변수를 수정해야 하는 경우, global 문을 사용하여 Python 에게 명시적으로 그렇게 하고 있음을 알려야 합니다.

scope.py 파일을 열고 다음 코드를 추가합니다. 여기서 spam 함수는 global 키워드를 사용하여 전역 변수 eggs를 수정합니다.

## Use 'global' keyword to modify global variable from inside function
def spam():
    global eggs  ## Declare that we're modifying the global variable
    eggs = 'spam'  ## This changes the global variable

eggs = 'global'
print(f"Before calling spam(), eggs is: {eggs}")
spam()  ## Function modifies global variable
print(f"After calling spam(), eggs is: {eggs}")

이제 스크립트를 실행합니다.

python3 scope.py

출력을 관찰하십시오. 전역 변수 eggs의 값이 함수 호출에 의해 영구적으로 변경되었습니다.

Before calling spam(), eggs is: global
After calling spam(), eggs is: spam

람다 함수 (Lambda Functions)

이 단계에서는 lambda 키워드를 사용하여 익명 (anonymous) 의 한 줄 함수를 만드는 방법을 배웁니다. 람다 함수는 임의의 수의 인수를 가질 수 있지만, 단 하나의 표현식 (expression) 만 가질 수 있습니다. 이들은 표준 def 함수 정의의 오버헤드 없이 작고 임시적인 함수를 만드는 데 유용합니다.

예를 들어, 두 숫자를 더하는 일반적인 함수는 다음과 같습니다.

## Regular function definition
def add(x, y):
    return x + y

이는 다음 lambda 함수와 동일합니다.

## Lambda function: anonymous function defined in one line
add = lambda x, y: x + y

람다는 또한 렉시컬 클로저 (lexical closures) 로 작동할 수 있습니다. 즉, 생성된 외부 범위 (enclosing scope) 의 값을 "기억"할 수 있습니다. 람다를 반환하는 함수를 만들어 보겠습니다.

lambdas.py 파일을 열고 다음 코드를 추가합니다. make_adder 함수는 숫자 n을 받아 n을 임의의 숫자 x에 더하는 새로운 람다 함수를 반환합니다.

## Lambda closure: lambda function that captures a variable from the outer scope
def make_adder(n):
    return lambda x: x + n  ## Lambda captures 'n' from the outer function

## Create a function that adds 3
plus_3 = make_adder(3)

## Use the new function
result = plus_3(4)  ## This will be 4 + 3
print(result)

터미널에서 스크립트를 실행합니다.

python3 lambdas.py

출력은 make_adder에 의해 생성되고 반환된 람다 함수를 호출한 결과를 보여줍니다.

7

다른 덧셈 함수들도 만들 수 있습니다. 예를 들어, plus_5 = make_adder(5)는 인수에 5 를 더하는 함수를 생성할 것입니다.

요약

본 실습 (lab) 에서는 Python 함수 (functions) 의 핵심 개념들을 탐구했습니다. 함수를 정의하는 방법과 인자 (arguments) 를 사용하여 함수에 정보를 전달하는 방법을 배웠습니다. 함수 호출을 더 명확하게 만들기 위해 위치 인자 (positional arguments) 와 키워드 인자 (keyword arguments) 를 모두 사용하는 연습을 했습니다. 또한, return 문을 사용하여 함수가 결과를 생성하도록 하는 방법, 지역 범위 (local scope) 와 전역 범위 (global scope) 를 사용하여 변수 접근성을 관리하는 방법, 그리고 함수 외부의 변수를 수정하기 위해 global 키워드를 사용하는 방법을 배웠습니다. 마지막으로, 간단한 한 줄 함수와 클로저 (closures) 를 생성하기 위한 익명 lambda 함수의 강력함과 간결함을 소개받았습니다.