Python/Python 기초문법

Python - 함수와 클래스

GinaKim 2024. 1. 1. 21:07
728x90

1. 함수의 구조

def 함수명([매개변수1, 매개변수2, ..., 매개변수n]):
  # 코드 블록 (들여쓰기 두번하는 공간 = indentation)
  return 반환값
def mySum(a, b):
  c = a + b
  return c

a = 1
b = 1

result = mySum(a, b)
print(result)
------------------------
# result
2

 

매개변수 초기값 설정 가능

def mySubtract(a, b=1): # b의 초기값을 1으로 설정
  c = a - b
  return c

M = 1
result = mySubtract(M)
print(result)
--------------------------------------------------------------------------------
# result
0

 

초기 설정값 변경 가능 

def mySubtract(a, b=5): # b의 초기값을 5으로 설정
  c = a - b
  return c

M = 1
n = 100
result = mySubtract(M, n) # b가 0에서 100으로 변경됨
print(result)
-------------------------------------------------------
# result
-99

 

2. 변수의 유효범위 (지역변수 Local Variable  & 전역변수 Global Variable)

a = 5 # 전역변수

def func1():
  a = 1 #지역변수
  print(f'func1 지역 변수 a = {a}')

def func2():
  a = 4 #지역변수
  print(f'func2 지역 변수 a = {a}')

def func3():
  print(f'func3 전역 변수 a = {a}')

def func4():
  global a # 함수 내에서 전역 변수를 변경하기 위함
  a = 500
  print(f'func4 전역 변수 a = {a}')

func1()
func2()
func3()
func4()
print(f'전역 변수 a = {a}') # 여기도 500이 나오더라 이것이 포인트
----------------------------------------------------------------
# result
func1 지역 변수 a = 1
func2 지역 변수 a = 4
func3 전역 변수 a = 5
func4 전역 변수 a = 500
전역 변수 a = 500

 

3. lambda 함수 

lambda 함수는 한 줄로 함수를 표현하는 것

구성이 단순해 간단한 연산을 하는 데 종종 사용 됨 ('def' 함수는 복잡한 함수 로직을 만들때 주로 사용)

 

람다 함수의 기본 구조

(lambda 인자(=매개변수) : 인자를 활용한 코드) (인자)

 

람다 함수 예시

(lambda x : x ** 2)(3)
------------------------
# result
9

 

제곱을 반복 수행해야 할 경우, 람다 함수를 변수에 할당하여 사용하면 편리

mySquare = lambda x : x ** 2
print(mySquare(1))
print(mySquare(2))
print(mySquare(3))
------------------------------
# result
1
4
9

 

4. 클래스 

클래스는 객체의 공통된 속성과 행위를 변수와 함수로 정의한 것

클래스에서 정의한 함수의 첫번째 인자는 self, 여기서 self는 객체 생성 후에 자신을 참조하는데 이용 됨

클래스 호출을 위해 객체명 = 클래스명을 입력해 인스턴스 생성해주고, 이후 생성된 인스턴스.메서드를 입력하여 클래스 안에 들어가있는 메서드를 실행시킴

class 클래스명: # 클래스 선언
	def 메서드명(self,...): # 메서드 선언
    	메서드 코드

객체명 = 클래스명() # 인스턴스 생성
객체명.메서드명() # 메서드 호출

 

 

a와 b 객체를 각각 생성 후 메서드를 호출하기 위해 a 객체에는 4와 2, b 객체에는 5와 3을 전달하여 호출

setdata 메서드에서 self에는 setdata 메서드를 호출한 객체 a가 자동으로 전달되기 때문에 (4, 2), (5, 3)처럼 두개의 값만 전달  (객체명.메서드명() 형태로 호출할때 self는 반드시 생략해서 호출해야 함)

 

결국 a.setdata(4, 2)처럼 호출하면 setdata 메서드의 매개변수 first, second에는 각각 값 4와 2가 전달된다.

 

add 메서드를 하나 더 추가하여 a.add()를 호출하면 add 메서드가 호출되어 6이라는 값이 나옴 

a.setdata(4, 2)로 메서드가 호출 되었고, add 메서드에서 self를 받아 4와 2가 들어가게 되어 4 +2 = 6이 나오게 됨 

class FourCal:
     def setdata(self, first, second):
        self.first = first
        self.second = second
     def add(self)
        result = self.first + self.second
        return result
        
a = FourCal()
b = FourCal()
a.setdata(4,2)
b.setdata(5,3)

print(a.first)
print(b.first)
print(a.add)
--------------------------------
# result
4
5
6

 

5. __init__() : 객체 생성과 동시에 속성값 지정

__init__ 메서드는 setdata 메서드와 이름만 다르고 모든게 동일 

__init__ 메서드 사용시 setdata로 매개변수를 지정해주지 않아도 됨

 

아래와 같이 실행하면 setdata로 매개변수를 지정해주지 않았기 때문에 오류가 뜸

class FourCal:
     def setdata(self, first, second):
        self.first = first
        self.second = second
     def add(self):
        result = self.first + self.second
        return result
        
a = FourCal(4, 2)
a.add()
-------------------------------------------------------
# result
TypeError: FourCal() takes no arguments

 

setdata 대신 __init__을 활용하면 객체가 생성될 때 자동으로 매개변수가 생성되어 값이 나오게 됨

class FourCal:
     def __init__(self, first, second):
        self.first = first
        self.second = second
     def add(self):
        result = self.first + self.second
        return result
        
a = FourCal(4, 2)
a.add()
-------------------------------------------------
# result
6

 

6. 클래스 상속

이미 만들어진 클래스의 변수와 함수를 그대로 이어받고 새로운 내용만 추가해서 클래스를 선언하는 것

class 상속받는 클래스 이름(기존 클래스 이름):
	<코드블록>
class Animal:
  # Attribute 정의(=클래스 변수)
  name = ""

  # 공통함수
  def eat(self):
    print("나는 먹을 수 있음")

class Dog(Animal): # 클래스 상속을 했다.
                   # 동물 ==> 강아지로 기본 기능을 제공함
  # name = "" # 이 코드는 불 필요함

  # 새로운 메서드
  def dance(self):
    print(f"{self.name} 강아지가 춤을 춘다")
# 객체 생성
a = Dog()
a.name = "코코"
a.eat()
--------------------------
# result
나는 먹을 수 있음
a.dance()
-------------
# result
코코 강아지가 춤을 춘다

 

728x90