- 입력값을 받아 출력값을 반환하는 코드의 묶음
- 반복적으로 사용되는 기능을 함수로 사용(특정 기능을 재사용하기 위해)
- 입력(들어가는 값)만 바뀌고 같은 코드가 반복되는 경우 특정코드들을 모아두는 용도로 사용(코드 모듈화)
- 기능을 반복해서 구현할 필요가 없으므로 코드를 간결하게 유지
- 함수를 파일에 저장하고 다른 코드에서 불러와 사용 가능
- 함수는 내장 함수와 사용자 함수로 나뉨(내장 함수: 파이썬에서 제공되는 이미 구현된 다양한 함수 <-> 사용자 정의 함수: def와 함수 이름, 그리고 함수의 본문을 이용하여 정의함)
>>> def 함수명(인자1, 인자2, ...): #함수 선언
... # 함수의 본문
... # return 반환값 (함수 반환)
>>> 변수 = 함수이름(인자1, 인자2, ...) #함수 호출
함수는 def 키워드, 함수명, :, 들여쓰기 사용하여 선언
함수 호출은 함수를 실행하는 행위를 의미
함수명과 '()'를 이용해 함수 호출
함수 내에서 또 다른 함수 호출 가능
pass를 이용해 실행문 생력 가능
fun1() 호출시 def fun1()의 실행문 실행중 fun2()로 넘아가고 순차적으로 fun3()까지 실행함
인수: 함수를 호출할 때 전달하는 입력 값
매개변수: 함수에 입력으로 전달된 값을 받는 변수
인수와 매개변수 개수는 일치해야 함
매개변수 갯수가 정해지지 않은 경우 '*'를 사용함
return 키워드를 이용해 실행 결과를 호출부로 반환 가능
return은 함수를 대체할 수 있다. 하지만 print는 함수를 대체할 수 없다. 단순히 화면에 출력하는 기능만을 한다.
print_name() 함수는 return 값이 정해져있지 않다. 그러므로 print('홍길동')에 의해 '홍길동'를 화면에 출력하지만 print_name()은 return 값이 없기 때문에 return None에 의해서 None이 함수를 대체한다.
return_name()함수는 return 값이 홍길동이기 때문에 return_name() = 홍길동 가 성립된다.
return값인 홍길동은 다른 연산 등을 위해 다시 쓰일 수 있는것이다.
>>> def add(a, b):
... result = a + b
... return result
>>> print(add(3, 4)) # 출력 : 7
>>> def print_hello():
... print("Hello, World!")
>>> print_hello() # 출력 : Hello, World!
>>> def get_name_and_age():
... name = input("이름을 입력하세요: ")
... age = int(input("나이를 입력하세요: "))
... return name, age
>>> result = get_name_and_age()
>>> print(result) #출력 : ('Alice', 20)
>>> def factorial(n):
... if n == 1:
... return 1
... else:
... return n * factorial(n-1)
>>> result = factorial(5)
>>> print(result) # 120
함수 밖에 선언된 변수로 어디에서나 사용은 가능하지만 함수 안에서 수정할 수는 없다.
함수 밖 num_out과 함수 안 num_out은 형태만 같고 다른 변수임
그래서 함수 안에서 print 한것과 밖에서 print 한 num_out은 다름
함수 안에 선언된 변수로 함수 안에서만 사용 가능하다.
함수 안에서 num_in 을 선언했기 때문에 밖에서 print하면 not defined라고 뜸
- global을 사용하면 함수 안에서도 전역변수의 값을 수정할 수 있다.
- 함수수 내부에서 지역 변수(Local Variable)와 전역 변수의 이름이 같은 경우, 함수 내부에서 지역 변수가 우선적으로 참조되는 것을 방지하기 위해 사용된다.
>>> count = 0
>>> def increment():
... global count
... count += 1
>>> increment()
>>> increment()
>>> increment()
>>> print(count) # 출력 : 3
increment 함수는 전역 변수 count를 참조하여 값을 1씩 증가시킨다. 함수를 호출할 때마다 전역변수 count가 1씩 증가하고, 마지막으로 count값을 출력하면 3이 출력된다.
함수안에 또 다른 함수가 있는 형태이다. (함수 내부에서 함수 정의)
내부 함수를 함수 밖에서 호출할 수 없다.
>>> def outer_func(a, b):
... def inner_func(x, y):
... return x + y
...
... return inner_func(a, b)
>>> result = outer_func(3, 4)
>>> print(result) # 7
outer_func 함수는 인자 a와 b를 입력받아, 내부에서 inner_func 함수를 정의하고, inner_func 함수를 호출하여 두 인자를 더한 값을 반환한다.
in_function()은 밖에서 호출하면 not defined 뜸
- lambda 키워드를 이용하면 함수 선언을 보다 간단하게 할 수 있다.
- 익명 함수(이름이 없는 함수)를 만들 때 사용
- lambda와 인자, 그리고 함수 본문을 이용하여 정의
- 한 줄로 간결하게 표현할 수 있어, 특히 함수를 매개변수로 전달하는 경우에 매우 유용
# 간단한 덧셈 함수
>>> def add(a, b):
... return a + b
# 함수 호출 시 위치 인자 사용
>>> result = add(3, 5)
>>> print(result) # 출력: 8
# 인사말 출력 함수
>>> def greeting(name, greeting_message="안녕하세요"):
... print(f"{greeting_message}, {name}님!")
# 함수 호출 시 기본값 인자를 사용하지 않음
>>> greeting("김철수", "반갑습니다") # 출력: 반갑습니다, 김철수님!
# 함수 호출 시 기본값 인자 사용
>>> greeting("이영희") # 출력: 안녕하세요, 이영희님!
>>> def greet(name, greeting="Hello"):
... print(greeting, name)
>>> greet(greeting="Hi", name="Alice") # 출력 : Hi Alice
# 가변 인자를 사용한 합계 함수
>>> def sum_numbers(*args):
... total = 0
... for number in args:
... total += number
... return total
# 함수 호출 시 가변 인자 사용
>>> result = sum_numbers(1, 2, 3, 4, 5)
>>> print(result) # 출력: 15
# 키워드 가변 인자를 사용한 정보 출력 함수
>>> def print_info(**kwargs):
... for key, value in kwargs.items():
... print(f"{key}: {value}")
# 함수 호출 시 키워드 가변 인자 사용
>>> print_info(name="김철수", age=30, city="서울")
# 출력
#name: 김철수
#age: 30
#city: 서울
내부 모듈: 파이썬 설치 시 기본적으로 사용할 수 있는 모듈
외부 모듈: 별도 설치 후 사용할 수 있는 모듈
사용자 모듈: 사용자가 직접 만든 모듈
위에서 직접 모듈을 제작 한 뒤 밑에서 import + 모듈파일명으로 모듈 간편하게 사용 할 수 있다.
import 키워드를 이용해 모듈 임포트
모듈 이름을 단축화 시킬 수 있음
모듈의 별칭을 붙일 때 사용
모듈을 가져올 때 이름 충돌하는 경우 발생할 때 사용
모듈의 이름이 너무 길어서 줄이고 싶을 때 사용
모듈 이름 + as + 붙일 이름
from은 모듈 내에서 필요한 것만 골라서 가져올 때 사용
모듈에는 많은 변수와 함수가 있기 때문에 활용하고 싶은 것만 선택하여 사용
여러 개의 가져오고 싶은 변수 또는 함수 입력 가능
import 뒤에 add, mul 써도 두 기능 다 쓸 수 있음
import 뒤에 * 붙이면 모듈의 모든기능을 사용 할 수 있음
직접 실행된 파일 name == 'main'
임포트 돼서 모듈로 사용된 .py 파일 name == "모듈이름"
if 문을 통해서 name == 'main' 인지 구분해서 "메인으로 실행되면 ~~~ 을 해라" 이런 식으로 프로그램을 작성함
예를들어 if __name__ == '__main__':
실행파일에서 실행했을때 다른 모듈파일까지 실행을 방지하기도 함
패키지(폴더)를 이용해 관련 모듈들을 그룹으로 묶어서 관리할 수 있음
모듈은 해당 패키지(폴더) 내에서만 실행할 수 있는데 어디서나 범용적으로 사용할 수 있도록 하려면 패키지를 site package 폴더로 이동하면 된다.
이동 방법: 패키지를 우클릭 후 나타난 메뉴바에서 'Refactor'-> site-packages 패키지로 'Move Directory' 하면 된다.
random.randint(a,b)
(a <= x <= b) 범위의 랜덤한 정수(int)를 반환합니다.
random.sample(seq or set, N)
랜덤하게 여러 개의 원소를 선택합니다.
첫번째 변수로 시퀀스 데이터 타입(튜플, 문자열, range, 리스트) 또는 set 타입을 받을 수 있습니다.
두번째 변수로는 랜덤하게 뽑을 인자의 개수 입니다.
year, mon, mday, hour, min, sec, wday 등이 있다.
객체(Object) = 속성(Attribute) + 기능(Function)
객체는 클래스에서 여러개의 데이터 값으로 생성됨
속성은 객체의 특성이나 상태
기능은 객체가 할 수 있는 일을 의미
(기능은 '메소드(Method)'라고 하는 함수를 사용해 구현)
객체 사용 장점: 코드 재사용, 간결화 및 모튤화에 좋음
클래스: 객체를 만들기 위한 틀(template)
클래스는 데이터(속성)와 기능(메서드)을 함께 묶어서 표현
class 클래스이름(object):
def __init__(self, 속성값1, 속성값2, 속성값3):
self.속성이름1 = 속성값1
self.속성이름2 = 속성값2
self.속성이름3 = 속성값3
def 메서드1(self):
def 메서드2(self):
def 메서드3(self):
객체1 = 클래스이름()
객체2 = 클래스이름()
객체3 = 클래스이름()
class Animal:
def __init__(self, species, age, name):
self.species = species
self.age = age
self.name = name
def eat(self):
print(f"{self.name}이(가) 먹이를 먹습니다.")
def move(self):
print(f"{self.name}이(가) 움직입니다.")
def make_sound(self):
print(f"{self.name}이(가) 소리를 냅니다.")
__init__
클래스의 인스턴스가 생성될 때 자동으로 호출되는 초기화 메소드(클래스의 속성을 초기화하는데 사용)
class 클래스명:
def __init__(self, 인자1, 인자2, ...):
# 초기화 코드
객체를 생성할 때는 클래스이름을 함수처럼 호출해야 하는데, 이때 실제로는 __init__
로 정의된 생성자 함수가 호출된다. __init__
함수 내부에서는 생성자를 호출할 때 넣은 입력 변수, 즉 인자의 값을 속성값으로 저장한다.
메서드(클래스의 함수)의 첫 번째 매개변수는 반드시 self로 지정해야 한다. (self는 인스턴스 자신을 참조하는 변수)
객체는 '객체명 = 클래스명()'을 통해서 생성하며, 메서드는 객체 뒤에 점을 붙인 후 메서드를 호출하면 된다.
dog = Animal("개", 3, "멍멍이")
cat = Animal("고양이", 2, "야옹이")
- 객체는 클래스에서 정의한 속성과 메서드를 가진다.
- 객체의 속성과 메소드에 접근하려면 점(.) 연산자를 사용한다.
dog 객체의 속성들을 출력하려면 아래 코드와 같이 사용하면 된다.
print(dog.species) # 출력: 개
print(dog.age) # 출력: 3
print(dog.name) # 출력: 멍멍이
아래는 dog와 cat 객체의 메소드를 호출하여 각 동물의 행동을 출력하는 코드이다. 객체의 메소드는 해당 클래스에 정의된 메소드를 사용하며, 객체 간에 독립적으로 동작한다.
dog.eat()
dog.move()
dog.make_sound()
cat.eat()
cat.move()
cat.make_sound()