Python(2) 함수 & 클래스 객체

hyeeun·2025년 2월 9일

bootcamp

목록 보기
5/22
post-thumbnail

2024.12.27

1. 함수

(1) 함수의 기본 정의

  • 특정 작업을 함수의 내용으로 작성하는 사용자 정의 함수로 지정
def <함수명>(매개변수):
    명령문
    [return <반환값>]
  • 해당 작업이 필요할 때마다 함수를 호출하여 사용
<함수명>(<인자>)
  • 별도의 스크립트 파일에 저장하여 호출 가능
from <모듈명> import <함수명>

(2) 함수의 형태

  • 일반 함수
def <함수명>(<인자>):
  명령문
  [return <반환값>]
  • 인자가 없는 함수
def <함수명>():
  명령문
  [return <반환값>]
  • 반환값이 없는 함수
def <함수명>(<인자>):
  명령문
# 인자도 있고 반환 값도 있는 함수
def my_calc(x, y):
    # z = x * y
    # return z
    return x*y

my_calc(1,5)

(3) 함수에 값을 전달하는 입력 매개변수(parameter)

  • positional arguments
    • 매개변수 위치에 맞게 값을 전달하는 방식
    • 가장 기본적인 인수/인자 전달 방식
  • default arguments
    • 함수 정의 시 할당 연산자(=)를 사용하여 매개변수에 기본값을 제공
    • 기본값이 없는 매개변수는 반드시 기본값을 값는 매개변수 앞에 와야 함
    • 값이 제공되면 기본값을 덮어씀
def my_sum(start, end=10):
    pass
  • keyword arguments

    • 함수호출 시 매개변수의 이름을 명시하여 값을 전달
    • 매개변수 이름을 알고 있어야 함
    • 키워드 인자끼리는 순서에 구애받지 않음
  • Non-keyword 가변인자

    • func(*args)
    • 매개변수의 개수가 정해지지 않은 경우
    • 위치인자를 튜플로 묶어 값이 전달됨
  • keyword 가변인자

    • func(**kargs)
    • 매개변수 앞에 **를 붙이면 딕셔너리 형태로 값 전달

(4) 변수의 유효 범위

  • 함수 안에서 정의한(생성한) 변수는 함수 안에서만 사용가능 : 지역 변수(Local Variable)
  • 함수 밖에서 생성한 변수, 모든 함수에 사용 가능 : 전역 변수 (Global Variable)
  • 함수 안에서 동일한 변수를 사용했을 경우 지역변수가 우선되며, LEGB 순서에 따름
  • 함수 내부에서 전역변수를 접근하거나 수정하려면 global 키워드 사용
<전역변수>
def <함수명>():
    global <전역변수>

(5) 람다(lambda) 함수

  • 한줄로 함수를 표현하는 함수
  • 구성이 간단해 간단한 연산을 하는데 사용됨
lambda <인자> : <인자 활용 명령문>
  • 인자를 함수명처럼 호출하기 위해 람다 함수를 소괄호로 감싸고 별도의 소괄호에 인자를 작성
(lambda <인자명> : <인자 활용 명령문>)(<인자>)

(6) 연습문제

  • 사용자 정의함수를 활용하여 아파트의 면적을 평수를 변환하여라.
    • 평수를 소수점 한자리로 변환
    • square(면적) = 아파트의 면적
    • footage(평수) = 면적(square)를 3.3057로 나눈 값

      footage=square3.3057footage = \frac{square}{3.3057}
def cal_footage(square):
    footage = square/3.3057
    footage = round(footage,1)
    return footage
    # return round(footage,1)

cal_footage(84) = (lambda x : round(x/3.3057,1))(84)


  • factorial 함수 만들기
    • n인자를 입력받아 1부터 n까지의 곱을 리턴
    • n이 0일 경우에는 1을 리턴
    • 재귀함수로 만들기
def factorial(n):
    if n ==0:
        result = 1
    else:
        result = 1
        for i in range(1, n+1):
            result *= i
    return result

= factorial(5)



2. 내장함수

  • 파이썬에서 제공하는 기본함수

(1) 형변환 함수

  • 데이터의 형태(타입) 변환
# 정수형 변환, 숫자로 변환 가능한 값이여야 함
int(<인자>)

# 실수형 변환
float(<인자>)

# 문자형 변환
str(<인자>)

# 리스트, 튜플, 세트형 변환
list(<인자>)
tuple(<인자>)
set(<인자>)

(2) bool 함수

  • 입력인자에 따라 True, False 반환
  • 숫자 0, 항목의 길이가 0인 경우 False
# 숫자형 인자
bool(<숫자 인자>)

# 문자열, 리스트, 튜플, 세트형 인자
bool(<인자>)

(3) 최대값, 최소값 함수

  • 리스트, 튜플 세트형 변수에 대하여 최대값과 최소값 변환
# 최대값
max()

# 최소값
min()

(4) 절댓값과 전체합 함수

# 숫자형의 절대값 변환 (복소수일 경우, 유클리드거리변환)
abs()

# 리스트, 튜플, 세트형 데이터의 모든 원소의 합
sum()

(5) 객체 정보를 보여주는 함수

# 모듈/객체가 가지고 있는 변수나 함수를 확인
dir()

# 객체의 주소값
id()

(6) 자료를 변환하는 함수

# 순서가 있는 자료형을 순서와 함께 활용
enumerate(순서가 있는 자료, start=0)

# 동일한 개수로 이루어진 자료형을 묶어줌
zip(*iterable)

# 모든 항목에 function을 적용하여 리턴
map(function, iterable)


3. 외부함수

  • 다른 모듈/패키지/라이브러리에 있는 함수
  • 모듈을 불러온 후 해당 모듈의 함수 활용 가능
import <모듈명>

모듈명.함수명()

(1) time 모듈

import time
# 연도, 월, 일, 시, 분, 초 정보 제공 (UTC-0기준)
now = time.localtime()
now

(2) random 모듈

  • random.random() : 0.0에서 1.0사이 난수값 리턴
  • random.randint(start, end) : start와 end사이 정수 중 난수값 리턴
  • random.shuffle(data) : data의 항목을 무작위로 섞음
import random

random.seed(4)
print(random.random())
print(random.randint(1,100))
a = [1,2,3,4,5]
random.shuffle(a)
a


4. 객체지향 프로그래밍

  • 데이터와 객체 중심으로 설계가 가능한 언어
  • 객체가 늘어나도 변수나 함수를 추가로 구현하지 않고 생성 가능

(1) 객체와 클래스

  • 객체(Object) : 속성(상태, 특징)과 행위(행동, 동작, 기능)로 구성된 개상
  • 객체는 변수와 함수의 묶음
  • 속성은 변수로, 객체가 할 수 있는 행위는 함수로 구현

(2) 클래스 선언

  • 객체를 만들기 위해 클래스 선언
  • 클래스(Class) : 객체의 공통된 속성과 행위를 변수와 함수로 정의한 것
  • 클래스는 객체를 만들기 위한 기본 틀, 객체는 기본 틀을 바탕으로 만들어진 결과

(3) 클래스 기본 구조

  • class 클래스명, 소괄호, 콜론(:) 순서로 정의
  • 클래스 내 변수를 선언
  • 'def 함수():' 함수 작성
  • 함수의 첫번째 인자는 self, self는 객체 생성 후 자신을 참조
  • 클래스에 정의된 함수를 메서드(method)라고 함
class 클래스명():
    [변수1]
    [변수2]

    def 함수1(self, 인자1, 인자2,...):
        [코드 블록]

    def 함수2(self, 인자1, 인자2,...):
        [코드 블록]

(4) 객체 생성 및 활용

  • 객체명은 변수명을 만들때와 같은 규칙 적용
  • 사전에 정의된 클래스를 통해 객체 생성

(5) 클래스 기본 구조

  • class 클래스명, 소괄호, 콜론(:) 순서로 정의
  • 클래스 내 변수를 선언
  • 'def 함수():' 함수 작성
  • 함수의 첫번째 인자는 self, self는 객체 생성 후 자신을 참조
  • 클래스에 정의된 함수를 메서드(method)라고 함
class 클래스명():
    [변수1]
    [변수2]

    def 함수1(self, 인자1, 인자2,...):
        [코드 블록]

    def 함수2(self, 인자1, 인자2,...):
        [코드 블록]

(6) 객체 생성 및 활용

  • 객체명은 변수명을 만들때와 같은 규칙 적용
  • 사전에 정의된 클래스를 통해 객체 생성
  • 객체의 속성 설정 : 객체명.변수명 = 속성값
  • 객체의 속성 활용 : 객체명.변수명
# 클래스 선언
class Bicycle():
    pass

# 객체 생성
my_bicycle = Bicycle()

# 객체 속성 설정
my_bicycle.wheel_size = 26
my_bicycle.color = 'black'

# 객체의 속성 출력
print("바퀴 크기:", my_bicycle.wheel_size)
print("색상:", my_bicycle.color)

(7) 객체의 초기화 (생성자)

  • 클래스 초기화 함수 __init__()를 이용하여 객체를 생성하는 동시에 속성값 초기화
  • 객체 생성시 호출되며 전달된 인자 값을 통해 초기화 작업 수행
    객체명 = 클래스명(속성1, 속성2, ...)
class Bicycle():
    ## 속성값 초기화
    def __init__(self, wheel_size, color):
        self.wheel_size = wheel_size
        self.color = color

    def move(self, speed):
        print("자전거: 시속 {0}킬로미터로 전진".format(speed))

    def turn(self, direction):
        print("자전거: {0}회전".format(direction))

    def stop(self):
        print("자전거({0}, {1}): 정지 ".format(self.wheel_size, self.color))

# 객체 생성과 동시에 속성값을 지정.
my_bicycle = Bicycle(26, 'black')

my_bicycle.move(30)  # 객체 메서드 호출
my_bicycle.turn('좌')
my_bicycle.stop()

(8) 소멸자 함수

  • 클래스 소멸자 함수 __del__()를 이용하여 객체를 소멸시켜 메모리에서 제거
  • 객체에 대한 참조수가 0이 되면 호출
class Bicycle():
    ## 속성값 초기화
    def __init__(self, wheel_size, color):
        self.wheel_size = wheel_size
        self.color = color

    def move(self, speed):
        print("자전거: 시속 {0}킬로미터로 전진".format(speed))

    def turn(self, direction):
        print("자전거: {0}회전".format(direction))

    def stop(self):
        print("자전거({0}, {1}): 정지 ".format(self.wheel_size, self.color))

    def __del__(self):
        print("자전거 객체가 소멸합니다.")

(9) 클래스의 변수

  • 클래스 변수(class variable) : 클래스에서 생성한 모든 객체 활용 가능한 변수로, 클래스명.변수명형식으로 접근
  • 인스턴스 변수(instance variable) : 각 인스턴스(객체)에서 개별적으로 활용하는 변수로, self.변수명형식으로 정의, 객체에서는 `객체명.변수명'형식으로 접근
  • 변수 검색 순서 : 인스턴스 영역 > 클랙스 영역 > 전역 영역
    • 인스턴스 변수가 정의되어 있지 않으면, self.변수명으로 클래스 변수에 접근
class Car():
    instance_count = 0  # 클래스 변수 생성 및 초기화

    def __init__(self, size, color):
        self.size = size    # 인스턴스 변수 생성 및 초기화
        self.color = color  # 인스턴스 변수 생성 및 초기화
        Car.instance_count = Car.instance_count + 1 # 클래스 변수 이용
        print("자동차 객체의 수: {0}".format(Car.instance_count))

    def move(self):
        print("자동차({0} & {1})가 움직입니다.".format(self.size, self.color))

(10) 클래스의 함수

  • 객체의 동작, 행동 등에 대하여 함수 정의
  • 클래스의 변수를 활용할 때에는 self.변수명으로 클래스의 변수(속성값) 활용 가능 객체명.메서드명(인자1,인자2,..)
class Bicycle():

    def move(self, speed):
        print("자전거: 시속 {0}킬로미터로 전진".format(speed))

    def turn(self, direction):
        print("자전거: {0}회전".format(direction))

    def stop(self):
        print("자전거({0}, {1}): 정지 ".format(self.wheel_size, self.color))

 # Bicycle 클래스의 인스턴스인 my_bicycle 객체 생성
my_bicycle = Bicycle()

# 객체의 속성 설정
my_bicycle.wheel_size = 26
my_bicycle.color = 'black'

# 객체의 메서드 호출
my_bicycle.move(30)
my_bicycle.turn('좌')
my_bicycle.stop()

(11) 여러개의 객체 생성 및 활용

  • 클래스를 이용하여 객체 생성
# Bicycle 클래스의 인스턴스인 bicycle1 객체 생성
bicycle1 = Bicycle()

bicycle1.wheel_size = 27 # 객체의 속성 설정
bicycle1.color = 'red'

bicycle1.move(20)
bicycle1.turn('좌')
bicycle1.stop()

# Bicycle 클래스의 인스턴스인 bicycle2 객체 생성
bicycle2 = Bicycle()

bicycle2.wheel_size = 24 # 객체의 속성 설정
bicycle2.color = 'blue'

bicycle2.move(15)
bicycle2.turn('우')
bicycle2.stop()


5. 연습문제

(1) Library 클래스를 만들고, 책을 추가하고 빌릴 수 있는 기능을 제공하는 프로그램

  • 클래스명 : Library
  • 속성 : book_list 도서관이 보유하고 있는 도서 목록
  • 메서드
    • add_book(book) : 책이름을 인자로 받아 도서 목록에 추가
    • borrow_book(book)
      • 책이름을 인자로 받아 목록에 있다면,
        "{book} 책을 대여합니다." 라고 출력하고 도서 목록에서 제외
      • 도서 목록에 없다면,
        "{book} 책은 대여가 불가능합니다." 라고 출력
# book_list를 딕셔너리 타입으로 지정한 경우 {책이름 : 대여여부}
class Library:
    def __init__(self):
        self.book_list = {}

    def add_book(self, book):
        self.book_list[book] = True

    def borrow_book(self, book):
        if book in self.book_list:
            if self.book_list[book]:
                self.book_list[book] = False
                print(f"\"{book}\"책을 대여합니다.")
            else:
                print(f"\"{book}\"책은 현재 대여중입니다.")
        else:
            print(f"\"{book}\"책은 저희 도서관에서 보유하고 있지 않습니다.")

lib = Library()

lib.add_book("파이썬")
lib.add_book("인공지능")
lib.borrow_book("파이썬")
lib.borrow_book("머신러닝")
lib.borrow_book("파이썬")

(2) 계좌의 잔액 속성으로 가지는 BankAccount클래스

  • 클래스명 : BankAccount
  • 속성 : balance (계좌의 잔액)
  • 메서드
    • check_balance() : 계좌의 잔액 balance를 출력
      "계좌의 잔액은 {balance}원입니다."
    • deposit(amount) : balance에 amount(금액)을 입금
      • balance에 amount 더하기
      • "{amount}원을 입금하였습니다. 잔액은 {balance}입니다."라고 출력
    • withdraw(amount) : balance에서 amount(금액)을 출금
      • balance에서 amount 빼기
      • 출금하고자 하는 금액(amount)가 잔액보다 클 경우,

        "계좌에 잔액이 충분하지 않습니다"라고 출력
      • 출금이 가능할 경우,
        "{amount}원을 출금하였습니다. 잔액은 {balance}입니다."라고 출력
 class BankAccount:
    def __init__(self, balance=0):
        self.balance = balance

    def check_balance(self):
        print(f"계좌의 잔액은 {self.balance}원입니다.")

    def deposit(self, amount):
        self.balance += amount
        print(f"{amount}원을 입금하였습니다. 잔액은 {self.balance}입니다.")

    def withdraw(self, amount):
        if self.balance < amount:
            print("계좌에 잔액이 충분하지 않습니다.")
        else:
            self.balance -= amount
            print(f"{amount}원을 출금하였습니다. 잔액은 {self.balance}입니다.")

acc2 = BankAccount(1000)

acc2.check_balance()
acc2.deposit(1000)
acc2.deposit(500)
acc2.withdraw(1000)
acc2.withdraw(1000)
acc2.withdraw(1000)

(3) 학생의 성적을 관리하는 StudentGrades 클래스

  • 클래스명 : StudentGrades
  • 속성명 : grades (딕셔너리 타입, 이름과 성적으로 이루어짐)
  • 메서드
    • add_grade(name, grade)
      • 학생이름name과 성적grade를 입력받아 성적목록에 추가
      • 추가한 후 성적목록에 있는 학생이름에 대한 리스트를 출력
    • get_grade(name)
      • 학생이름 name을 입력받아 해당 학생의 성적을 조회
      • 해당 학생이 목록에 있다면, "{name}의 성적은 {grade}점입니다."라고 출력
      • 해당 학생이 목록에 없다면, "학생 \'{name}\'의 성적을 찾을 수 없습니다"라고 출력
    • get_average_grade()
      • 모든 학생의 평균 성적을 계산
      • 목록이 비어있을 경우 0을 출력
      • "모든 학생의 평균 성적은 {average_grade}점 입니다."라고 출력
class StudentGrades:
    def __init__(self):
        self.grades = {}

    def add_grade(self, name, grade):
        self.grades[name] = grade
        print(f"성적 목록에 있는 학생: {self.grades.keys()}")

    # 이름과 성적을 여러개의 쌍으로 입력
    def add_grade_multi(self, **kwargs):
        for name, grade in kwargs.items():
            self.grades[name] = grade
        print(f"성적 목록에 있는 학생: {self.grades.keys()}")

    def get_grade(self, name):
        if name in self.grades:
            print(f"{name}의 성적은 {self.grades[name]}점입니다")
        else:
            print(f"학생 \'{name}\'의 성적을 찾을 수 없습니다")
    def get_average_grade(self):
        if len(self.grades) == 0:
            avg = 0
        else:
            avg = sum(self.grades.values()) / len(self.grades)
        print(f"모든 학생의 평균 성적은 {avg}점 입니다.")
        
math_grades = StudentGrades()

math_grades.add_grade("A", 100)
math_grades.add_grade("B", 70)
math_grades.add_grade("C", 80)

math_grades.add_grade_multi(D=65, E=90)

math_grades.get_grade("A")
math_grades.get_grade("D")

math_grades.get_average_grade()       
profile
hyeeun-techlog

0개의 댓글