티스토리 뷰

학습목표

파이썬 함수에 관한 학습 목표를 설정하는 것은 프로그래밍 능력을 향상시키는 데 중요한 단계입니다.

  1. 기본 개념 이해: 함수의 정의, 사용 이유 및 기본 문법을 이해합니다. 이는 함수 선언, 매개변수 전달, 반환 값 등의 개념을 포함합니다.
  2. 함수 작성 능력: 간단한 함수부터 시작하여 점차 복잡한 함수를 작성할 수 있는 능력을 개발합니다. 이는 코드 재사용성과 모듈화를 증진시킵니다.
  3. 매개변수 및 인자 처리: 다양한 유형의 매개변수(위치, 키워드, 기본값 등)와 인자 전달 방식을 이해하고 적용합니다.
  4. 함수의 고급 기능: 재귀, 람다(익명) 함수, 제너레이터, 데코레이터와 같은 고급 기능을 학습하고 적용합니다.
  5. 오류 처리와 디버깅: 함수 내에서 발생할 수 있는 오류를 처리하고 디버깅하는 방법을 학습한다.
  6. 코드 최적화와 효율성: 함수를 사용하여 코드의 효율성을 높이고, 성능을 최적화하는 방법을 학습한다.
  7. 실제 프로젝트 적용: 실제 프로젝트나 과제에서 함수를 효과적으로 활용하여 문제를 해결하는 실습을 합니다.

목차

  1. 함수의 개념
  2. 함수를 작성하고 호술하기(함수의 기본구조)
  3. 함수의 종류
  4. 함수의 사용_매개변수와 함수값의 반환(return)
  5. 변수의 범위
  6. 파이썬 함수 설명하기

1.함수의 개념

  • 함수는 특정 작업을 수행하기 위해 미리 정의된 코드 블록이다.
  • 함수를 사용하면 내부 기능을 설계하여 코드의 중복을 줄이고, 코드의 가독성과 관리성을 향상시킬 수 있다

프로그램에서의 함수의 개념

 

  • 프로그램에서 특정 작업을 수행하도록 따로 정의해 놓은 독립된 단위이다.
  • 데이터를 전달받아 처리한 후 결과를 반환하는 코드 블록이다.
  • 중복된 코드를 줄이고, 복잡한 문제를 모듈 단위로 분해하여 단순화할 수 있다.
여기서 PLUS
- 클래스(class) : 관련된 변수와 함수를 하나로 묶은 것, 즉 클래스는 객체를 정의하는 블루프린트 또는 템플릿입니다. 객체 지향 프로그래밍에서 클래스는 데이터와 이 데이터를 조작하는 메소드를 함께 묶어두는 역할을 함.
- 모듈(module) : 파이썬 코드가 저장되는 파일, 여러개의 함수를 모아서 독립적인 파일로 관리하는 것, 모듈을 사용하면 코드를 재사용하고, 네임스페이스를 구성하며, 프로그램을 더 관리하기 쉽게 만들 수 있습니다.
- 라이브러리(labrary) : 라이브러리는 모듈의 모음입니다. 라이브러리는 특정 기능을 위한 코드의 집합체로, 여러 모듈을 포함할 수 있으며, 프로그램에 필요한 도구나 함수를 제공한다.

클래스 (Class)

  • 클래스는 객체를 정의하는 블루프린트 또는 템플릿입니다. 객체 지향 프로그래밍에서 클래스는 데이터와 이 데이터를 조작하는 메소드를 함께 묶어두는 역할을 합니다.
  • 예시: Dog 클래스를 생각해봅시다. 이 클래스는 속성(예: name, age)과 메소드(예: bark, fetch)를 가질 수 있습니다.
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def bark(self):
        return "Woof!"

    def fetch(self, item):
        return f"{self.name} fetches the {item}."

# 객체 생성 및 사용
my_dog = Dog("Buddy", 3)
print(my_dog.bark())  # Woof!
print(my_dog.fetch("ball"))  # Buddy fetches the ball.
Woof!
Buddy fetches the ball.

모듈(module)

  • 모듈은 파이썬 코드가 저장되는 파일입니다.
  • 이 파일은 함수, 클래스, 변수 및 실행 가능한 코드를 포함할 수 있습니다.
  • 모듈을 사용하면 코드를 재사용하고, 네임스페이스를 구성하며, 프로그램을 더 관리하기 쉽게 만들 수 있습니다.

예시: math 모듈을 사용해봅시다. 이 모듈은 수학적 연산을 위한 다양한 함수와 상수를 제공합니다.

import math

print(math.sqrt(16))  # 4.0
print(math.pi)  # 3.141592653589793
4.0
3.141592653589793

라이브러리(labrary)

  • 라이브러리는 모듈의 모음입니다.
  • 라이브러리는 특정 기능을 위한 코드의 집합체로, 여러 모듈을 포함할 수 있으며, 프로그램에 필요한 도구나 함수를 제공합니다.

예시: Pandas 라이브러리를 살펴봅시다. 이 라이브러리는 데이터 조작 및 분석을 위한 고수준의 데이터 구조와 함수를 제공합니다.

import pandas as pd

data = {'name': ['Alice', 'Bob', 'Charlie'], 'age': [25, 30, 35]}
df = pd.DataFrame(data)
print(df)

함수를 사용하는 이유

 

  • 특정 작업을 함수로 처리하여 반복되는 소스 코드를 줄일 수 있다.
  • 구조적 프로그래밍으로 모듈화하여 프로그램 작성과 수정이 편리하고, 손쉽게 재사용할 수 있다.
  • 다른 사용자(프로그래머)에게 라이브러리 형태로 제공할 수 있다.

2.함수를 작성하고 호출하기

  • 함수 정의하기: def 키워드를 사용하여 함수를 정의합니다.
  • greet는 함수 이름이며, name은 이 함수의 매개변수
def 함수명():
        함수에 들어갈 작업들

 

함수의 기본 요소

  • 함수의 이름: 함수를 구분하는 식별자이다.
  • 매개변수(parameter): 괄호 안에 쉼표(,) 로 구분되며 함수에 전달되는 입력값이다.
  • 반환(return)문: 함수의 실행 결과를 반환한다.
def 함수이름(arg1, arg2, ..., argn):
    수행할 명령
    return 반환값
def great(name):
    return f"hello, {name}!"
def greet(name):
    return f'안녕 {name}'

greet('배정수')
def Get20Mp(x):
    return x * 20

Get20Mp(2)

함수 이름 규칙

  • 함수명은 함수의 동작을 설명하는 이름으로 작성한다.
  • 이해하기 쉽고 직관적인 이름을 사용한다.
  • 예시: GetSum, DrawSquare 등 함수의 역할이 드러나는 이름을 사용한다.
  • 💡 함수명을 잘 짓는 방법
    → 이름만 보고 함수가 무슨 일을 하는지 예측 가능하도록 작성하는 것이 중요하다.
import keyword
print(keyword.kwlist) #예약어 확인

함수의 순서

함수를 정의하고 호출할 때는 순서를 잘 확인하자

  • 파이썬은 한라인씩 컴파일 하는 interpriter 방식이다
  • 따라서, 함수 정의 전에 호출할 수 없습니다. 함수를 호출하기 전에 함수가 먼저 정의되어 있어야 합니다.
  • 변수도 사용하기 전에 정의되어야 합니다.
# 오류 발생
def greet():
    print("Hello!")

greet()

3.함수의 종류

1.내장 함수 (Built-in Functions):

  • 파이썬에 기본적으로 포함된 함수입니다.
  • 별도의 모듈 임포트 없이 바로 사용할 수 있습니다.
  • 예: print(), len(), sum(), max(), min() 등.
a = 'baejungsoo'

print(a)
print(type(a))
print(len(a))

2.사용자 정의 함수 (User-defined Functions):

  • 프로그래머가 특정 작업을 수행하기 위해 스스로 정의한 함수입니다.
  • def 키워드를 사용하여 정의합니다.
def hello():
    print('hello, world!')

hello()

3.익명 함수 (Lambda Functions):간단한 함수식 ‘람다함수’

  • lambda 키워드를 사용하여 정의하는 간단한 한 줄 함수입니다.
  • 이름 없이 정의되며, 주로 일회성 작업이나 간단한 작업에 사용됩니다.
multiply = lambda x, y: x * y
print(multiply(2, 3))  # 6
def square(x):
    return x ** 2

square(3)
square = lambda x: x**2
print(square(5))  # 출력: 25
#리스트 정렬:
people = [{"name": "John", "age": 35}, {"name": "Doe", "age": 25}, {"name": "Jane", "age": 30}]
sorted_people = sorted(people, key=lambda x: x["age"])
print(sorted_people)
#리스트 필터링:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # 출력: [2, 4, 6, 8, 10]
#리스트 변환 (map):
numbers = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x*2, numbers))
print(doubled)  # 출력: [2, 4, 6, 8, 10]

연습문제

두개의 값 x, y를 입력하면 x의 y승을 출력하는 람다식을 작성하라.

power = lambda x, y: x ** y

result = power(2, 3)
print(result)  # 출력: 8

4.재귀 함수 (Recursive Functions):

  • 함수 내부에서 자기 자신을 다시 호출하는 함수입니다.
  • 주의점: 무한 호출을 방지하기 위해 탈출 조건이 필요합니다.
 

재귀적으로 팩토리얼을 계산하는 함수

  1. 함수는 정수 n을 매개변수로 받습니다.
  2. n이 0이면, 1을 반환합니다. (0!의 정의는 1입니다.)
  3. 그렇지 않으면, n을 factorial(n-1)의 결과와 곱하여 반환합니다.
#수업:팩토리얼 계산 함수
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

factorial(3)

4.함수의사용_매개변수와 함수값의 반환(return)

함수 안에서 return을 사용하면 값을 바깥으로 반환

def 함수이름(매개변수):
return 반환값
  • 매개변수 (Parameters): 함수를 호출할 때 전달하는 값을 받기 위한 변수입니다. 위의 greet 함수에서 name이 매개변수입니다.
  • 반환 값 (Return Value): 함수가 처리를 마친 후에 호출한 곳으로 돌려주는 값입니다. return 키워드를 사용하여 값을 반환합니다.
def subtr(a,b):
    return a - b

x = subtr(30, 10)
print(x)

print와 return을 사용한 것을 비교 해 보자

def multiply(a, b):
    print( a * b )
d = multiply(3,4)
print(d)   #print로 출력은 하였으나 정작 d에는 아무것도 입력되지 않음
def multiply(a, b):
    return a * b

y = multiply(10, 50)
print(y)
y #return으로 값을 반환하여서 변수값이 출력됨

1.매개변수가 없는

def hello():
    return print('hello world!')

hello()

2.디폴트 인수 : 기본값이 있는 매개변수

def greet(name, msg="별일없죠?"):
    print('안녕', name, ',', msg)

greet('철수', '좋은아침!')
greet('길동')
  • 만약에 2개의 인수를 넣지 않으면 오류가 발생.
    • 만약 인주가 부족한 경우에 기본값을 넣어주는 메카니즘이 있다면 편리하지 않을까?
    • 바로 이것이** default argument(디폴드 인수)이다.**
  • 함수 작성 시 기본값이 있는 것과 없는 것이 함께 있을 때는 없는 것이 앞으로 오도록 함
def sayhello(name, place="파이썬월드"):
	print("%s님 안녕하세요. %s에 오신 것을 환영합니다." %(name, place))
	return name
user = sayhello("john")
user = sayhello("john", "프로그래밍 월드")

임의의 개수의 매개변수를 가진 함수 (가변 매개변수)

  • 매개변수 하나에 여러 인자를 받는 방법
  • 애스터리스크('*')를 이용하여 하나의 매개변수에 여러 인자를 받을 수 있다
def sum_all(*numbers): #numbers 앞의 별표(*)는 함수가 가변적인 개수의 인자를 받을 수 있음을 나타냅니다
    return sum(numbers)

sum_all(10,20,30,40,50)
def apark(*calloff):
    print("오늘", calloff, "은(는) 운행하지 않습니다.")

apark("청룡열차")
apark('청룡열차', "프롬라이드")
  • 가변 인수(calloff)는 함수에 전달되는 모든 추가 인수를 튜플로 수집합니다. 결과를 출력할 때 이 *튜플을 그대로 출력하면 괄호가 함께 출력**됩니다.

연습문제

이름, 키, 몸무게를 인자로 입력받아 BMI를 출력하는 함수를 작성하라, 단 이름을 매개변수로 넣지 않으면 고객 이름은 “익명”으로 출력한다.

def calculate_bmi(name="익명", height=None, weight=None):
    if height is None or weight is None:
        print("키와 몸무게를 올바르게 입력해주세요.")
        return

    height_m = height / 100  # cm를 m로 변환
    bmi = weight / (height_m ** 2)

    print(f"{name}님의 BMI는 {bmi:.2f}입니다.")

# 함수 테스트
calculate_bmi(height=170, weight=65)
calculate_bmi("홍길동", 180, 70)
인자에 사람이름을 넣으면 “오늘 회의에 참석한 사람은 (‘○○○’, ‘○○○’)입니다.”와 같이 출력하도록 하여라. 단, 몇 명 참석할지는 예상할 수 없다.

def attendees_list(*names):
    print(f"오늘 회의에 참석한 사람은 {names}입니다.")

# 함수 테스트
attendees_list("홍길동")
attendees_list("홍길동", "이순신", "김유신")
*교대근무표 작성 * 숫자에 맞게 인원수와 사람이름 모두 출력하기
# 수업:함수 정의
def shift(*name):
    worker = len(name)
    print(f"교대 근무자의 수는 {worker}입니다. 순서대로")
    for a in name:
        print(a)

# 함수 호출
shift("홍길동")
shift("홍길동", "이순신", "김유신")

return으로 함수 중간에서 빠져나오기

  • 만약 a가 'A'라면, return 문은 함수에서 즉시 빠져나오게 합니다. 이 경우, 함수는 아무런 값도 반환하지 않으며 (None을 반환), 이후의 코드는 실행되지 않습니다.
def not_A(a):
    if a == 'A':
        return
    print(a, '입니다.')

not_A('A')
def not_A(a):
    if a == 'A':
        return
    print(a, '입니다.')

not_A('C')

변수의 범위 (지역변수와 전역변수)

변수의 유효 범위(scope)는 변수가 정의된 위치에 따라 결정

  • 지역변수 (Local Variable):
    함수 내부에서 정의된 변수. 해당 함수가 호출될 때 생성되고, 함수가 종료되면 사라집니다.
    함수 외부에서는 해당 변수에 접근할 수 없습니다.
  • 전역변수 (Global Variable): **
    함수 밖에서 정의된 변수. 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때까지 유지됩니다.
    프로그램의 어디에서든지 접근할 수 있습니다.
# 전역변수
global_var = "전역변수"

def example():
    local_var = '지역변수' #지역변수
    print(global_var) #전역변수 접근 가능
    print(local_var)  #지역변수 접근 가능

example()
print(global_var)  # 전역변수에 접근할 수 있습니다.

#print(local_var) #지역변수 접근이 안됨.

# 다음 코드는 오류를 발생시킵니다. 함수 외부에서 지역변수에 접근할 수 없기 때문입니다.

#print(local_var)
  • 위의 코드에서 global_var는 전역변수로, 프로그램의 어디에서든 접근할 수 있습니다. 반면, local_var는 example_function 함수 내부에서만 접근할 수 있는 지역변수입니다.
  • 만약 함수 내에서 전역변수의 값을 변경하려면, global 키워드를 사용해야 합니다.

1.함수안에 전역변수 사용하기

def calculate_area(radius):
    area = 3.14 * radius**2 #전역변수 area에 계산값을 저장하려고 했다.!!
    return

area = 0
r = float(input('원의반지름:'))
calculate_area(r)
print(area)

함수안에서 전역변수값을 변경하고 싶을때

  • 이때는 global 키워드를 사용하여 변수를 지정하자
def calculate_area(radius):
    global area
    area = 3.14 * radius**2 #전역변수 area를 사용하겠다고 알림
    return

area = 0
r = float(input('원의반지름:'))
calculate_area(r)
print(area)
  • 여기서 modify_global 함수 내에서 global 키워드를 사용하여 global_var 전역변수의 값을 변경할 수 있게 되었습니다.
global_var = "전역변수"

def modify_global():
    global global_var
    global_var = "전역변수 수정됨"

modify_global()
print(global_var)  # "전역변수 수정됨" 출력

파이썬 함수 설명하기_Docstring

“Explicit is better than implicit. 명확함이 함축된 것보다 낫다.”

  • Docstring은 파이썬에서 함수, 클래스, 모듈 또는 메서드에 대한 설명을 제공하는 문자열입니다.
  • 이 문자열은 함수의 첫 번째 문장으로 배치되며, 큰따옴표나 작은따옴표 세 개로 둘러싸입니다(""" 또는 ''').
  • Docstring을 사용하면, 코드의 다른 부분에서 help() 함수를 통해 해당 함수, 클래스 또는 모듈의 설명을 조회할 수 있습니다. 또한, 다양한 도구들 (예: Sphinx)을 사용하여 이 Docstring으로부터 문서를 자동 생성할 수도 있습니다.
>>> help(함수명)
>>> 함수명.__doc__
함수에 대한 설명은 함수 시작후 따옴표 세 개(''')로 이루어진 주석문을 달면 만들 수 있다. 이는 함수에 대한 문서화된(doc) 설명을 출력한다.

Docstring 작성 시 일반적으로 다음과 같은 내용을 포함합니다:

  • 함수가 하는 일
  • 파라미터의 설명 (타입, 의미)
  • 반환 값의 설명 (타입, 의미)
  • (선택적으로) 예외 및 오류에 대한 설명
  • (선택적으로) 예제 및 사용 방법 이러한 내용을 규격화하여 작성하기 위한 여러 스타일 가이드가 있으며, Google Python Style Guide와 NumPy docstring guide 등이 자주 사용됩니다.
#Docstring의 예:
def add(a, b):
    """
    두 숫자를 더한 값을 반환합니다.

    파라미터:
        a (int or float): 첫 번째 숫자
        b (int or float): 두 번째 숫자

    반환:
        int or float: a와 b의 합
    """
    return a + b

# 함수에 대한 도움말 조회
help(add)

실전문제

자기소개 함수 만들기

함수를 실행하면 자기 소개를 출력하라.


def selfpr():
    print("Hello, Let me introduce myself to you. My name is Gil-dong HONG. I came from South Korea. I’m usually space out")

selfpr()

이름을 입력 받아서 생일 축하 노래를 출력해 보자.

def birthday_sing(name):
    print('Happy birthday to you! \nHappy birthday to you!')
    print('Happy birthday, dear', name + '!')
    print('Happy birthday to you!')
birthday_sing('홍길동')

좌표상 거리 구하기

인자 (x, y)를 입력하면 (0, 0)으로부터의 거리 구하기 단, 매개변수를 입력하지 않으면 input을 통해 x, y 값 입력받기

def distance(x=0, y=0):
    if x == 0 and y == 0:
        x = int(input("x좌표를 입력하세요 : "))
        y = int(input("y좌표를 입력하세요 : "))
    c = (x**2 + y**2) ** 0.5
    return c

# 인자 없이 함수 호출: 사용자로부터 x, y 좌표를 입력받아 거리 계산
print(distance())

# 인자를 제공하여 함수 호출: 제공된 좌표에 대한 거리 계산
print(distance(3, 4))  # 출력: 5.0

3개의 수에서 가장 큰 수 찾기

def getMax(a, b, c=-10000):
    if (a >= b) and (a >= c):
        largest = a
    elif (b >= a) and (b >= c):
        largest = b
    else:
        largest = c
    return largest

print(f"(10, 20, 50)중에서 최대값: {getMax(10, 20, 50)}")
print(f"(10, 20)중에서 최대값: {getMax(10, 20)}")

[과제1] 4칙연산 함수 만들기

def add(a, b):
    print( "(%d + %d)" % (a, b), end=" ")
    return a + b

def sub(a, b):
    print ("(%d - %d)" % (a, b), end=" ")
    return a - b

def mul(a, b):
    print ("(%d * %d)" % (a, b), end=" ")
    return a * b

def div(a, b):
    if b == 0:
        return '0은 계산 못함'
    print ("(%d / %d)" % (a, b), end=" ")
    return a / b


what = add(20, 10)
print("= ", what)
what = sub(20, 10)
print("= ", what)
what = mul(20, 10)
print("= ", what)
what = div(20, 10)
print("= ", what)
def arithmetic(a, b):
    print(f'{a} + {b} = {a + b}')
    print(f'{a} - {b} = {a - b}')
    print(f'{a} * {b} = {a * b}')
    print(f'{a} / {b} = {a / b}')

arithmetic(3,4)

[과제2]성적을 받아서 학점을 매겨서 반환하는 함수 getGrade(score)을 작성하여 테스트 해 보자

def getGrade(score):
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    elif score >= 60:
        return 'D'
    else:
        return 'F'

n = int( input("성적을 입력하시오: "))
ret = getGrade(n)
print(f"학점은 {ret} 입니다.")
728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
반응형