내 필기인데 알아보겠어?
네, 필기 내용을 잘 이해할 수 있습니다! 정리된 내용은 파이썬 함수와 관련된 중요한 개념들을 다루고 있네요. 이를 바탕으로 각 내용을 조금 더 체계적으로 설명해 보겠습니다.
함수와 관련된 개념 정리
1. 함수의 기본 개념
- 함수는 반복적인 작업을 수행하기 위해 정의됩니다.
- 코드를 모듈화하여 유지보수와 재사용성을 높이는 데 사용됩니다.
- 함수는 다음과 같은 특징을 가집니다:
- 정의(Definition): def 키워드를 사용하여 정의
- 매개변수(Parameter): 함수가 입력받는 값
- 반환값(Return Value): 함수가 처리 후 돌려주는 값
- 호출(Invocation): 함수를 실행하는 행위
2. 매개변수와 인자
- 매개변수(Parameter): 함수 정의 시 입력값을 받는 변수
def greet(name): # 여기서 name이 매개변수 print(f"Hello, {name}!")
- 인자(Argument): 함수 호출 시 실제로 전달되는 값
greet("Alice") # 여기서 "Alice"가 인자
3. 함수의 종류
(1) 매개변수가 없는 함수
def hi():
print("hi")
print("안녕")
print("나 혼자 있고 싶으니까 가세요")
print("-" * 18)
hi()
- 입력값 없이 호출 가능
- 고정된 동작을 수행하는 경우 사용
(2) 매개변수가 있는 함수
def hello(name, age):
print(f"hi {name}, age is {age}")
hello("won", 25)
hello("im", 30)
- 매개변수를 통해 유연한 동작을 수행 가능
- 호출 시 인자를 전달해야 함
(3) 결과값을 반환하는 함수
def plus_x_y(x, y):
return x + y
a = plus_x_y(4, 44)
print(a * 10)
- return 키워드를 사용해 값을 반환
- 반환값은 다른 작업에 재사용 가능
(4) 결과값을 반환하지 않는 함수
def display_message():
print("This function doesn't return a value.")
- 단순히 동작만 수행하고 끝나는 함수
4. 가변 매개변수
(1) 위치 기반 가변 매개변수 (*args)
- 여러 개의 값을 전달할 수 있음
def get_number(*args):
for i, v in enumerate(args):
print(f"result {i}: {v}")
get_number(1, 2, 3, 4, 5) # 인자 개수와 관계없이 처리 가능
(2) 키워드 기반 가변 매개변수 (**kwargs)
- 키-값 쌍 형태의 데이터를 전달
def get_info(**kwargs):
for k, v in kwargs.items():
print(f"{k}: {v}")
get_info(name="im", age=25)
(3) *args와 **kwargs를 함께 사용하는 함수
- 위치 인자, 키워드 인자 모두 처리 가능
def example_args(arg1, arg2, *args, **kwargs):
print(f"arg1: {arg1}, arg2: {arg2}")
print(f"args: {args}")
print(f"kwargs: {kwargs}")
example_args(1, 2, 3, 4, 5, name="im", city="Seoul")
5. 파이썬 함수의 키워드 인자
- 인자의 이름을 명시하여 전달
def greet(name, age):
print(f"Hello {name}, you are {age} years old!")
greet(name="Alice", age=30) # 명확한 인자 전달
6. 입력과 타입 변환
- input() 함수는 항상 문자열(str)로 값을 반환
- 숫자로 사용하려면 int()로 변환 필요
a = input("Enter a number: ")
print(a) # 문자열로 출력
print(int(a) + 10) # 정수로 변환 후 연산
주요 개념 요약
- 함수 설계: 기능별로 쪼개는 것이 유지보수에 유리
- 매개변수와 인자 구분: 정의 시 매개변수, 호출 시 인자
- 가변 매개변수 사용법:
- *args: 위치 기반 다수 인자 처리
- **kwargs: 키워드 기반 다수 인자 처리
- 함수 호출 규칙: 키워드 인자는 위치 인자 뒤에 와야 함
디폴트 매개변수에 대해 알려줘
디폴트 매개변수(Default Parameters)
디폴트 매개변수란 함수에서 특정 매개변수에 기본값을 미리 설정해 놓는 것을 의미합니다. 이를 통해 함수 호출 시 해당 매개변수를 생략하면 기본값이 자동으로 사용됩니다. 이는 코드의 간결성을 높이고 함수 호출의 유연성을 증가시킵니다.
파이썬에서 디폴트 매개변수의 사용법
다음은 디폴트 매개변수를 설정하는 일반적인 방법입니다:
def greet(name="친구"):
print(f"안녕하세요, {name}님!")
# 함수 호출 예시
greet() # 출력: 안녕하세요, 친구님!
greet("철수") # 출력: 안녕하세요, 철수님!
주요 특징:
- 순서: 디폴트 매개변수는 필수 매개변수 뒤에 위치해야 합니다.
def example(b=10, a): # 오류 발생 pass
- def example(a, b=10): # 올바른 형태 pass
- 가변적 사용: 디폴트 매개변수를 필요에 따라 생략하거나 재정의할 수 있습니다.
- 변경 가능한 디폴트 값 주의: 리스트나 딕셔너리 같은 가변 객체를 디폴트 값으로 사용할 때 예상치 못한 동작이 발생할 수 있습니다.이를 방지하려면 None을 기본값으로 사용한 후 조건문으로 초기화합니다:
- def add_item(item, my_list=None): if my_list is None: my_list = [] my_list.append(item) return my_list print(add_item(1)) # 출력: [1] print(add_item(2)) # 출력: [2]
- def add_item(item, my_list=[]): my_list.append(item) return my_list print(add_item(1)) # 출력: [1] print(add_item(2)) # 출력: [1, 2] (이전 리스트를 계속 참조)
디폴트 매개변수를 사용하는 장점
- 간결한 코드 작성: 반복적으로 같은 값을 전달할 필요가 없습니다.
- def calculate_total(price, tax=0.1): return price * (1 + tax) print(calculate_total(100)) # tax 기본값 사용 print(calculate_total(100, 0.2)) # tax 재정의
- 가독성 향상: 함수의 의도를 명확히 전달할 수 있습니다.
- 유연성 제공: 다양한 상황에서 하나의 함수로 여러 시나리오를 처리할 수 있습니다.
유의사항
- 디폴트 매개변수는 매개변수 간의 의존성을 고려하여 사용해야 합니다.
- 너무 많은 디폴트 매개변수를 설정하면 함수가 복잡하고 가독성이 떨어질 수 있습니다.
- 디폴트 매개변수 값은 함수가 정의될 때 한 번만 평가됩니다. 따라서 가변 객체를 디폴트 값으로 설정할 때는 특히 신중해야 합니다.
키워드인자, 위치인자에 대해서도 알려줘
키워드 인자와 위치 인자
함수를 호출할 때 파라미터를 전달하는 방법에는 위치 인자와 키워드 인자가 있습니다. 두 가지 방식은 유연하게 조합하여 사용할 수 있지만, 규칙을 준수해야 합니다.
1. 위치 인자(Positional Arguments)
위치 인자는 매개변수의 순서에 따라 값을 전달합니다. 함수 호출 시 입력한 값이 매개변수의 선언된 순서대로 매핑됩니다.
예제
def introduce(name, age, city):
print(f"안녕하세요, 저는 {name}이고, 나이는 {age}살이며, {city}에 살고 있습니다.")
introduce("철수", 25, "서울")
# 출력: 안녕하세요, 저는 철수이고, 나이는 25살이며, 서울에 살고 있습니다.
특징
- 위치가 중요하기 때문에 순서를 바꾸면 잘못된 값이 매핑될 수 있습니다.
introduce(25, "철수", "서울")
# 출력: 안녕하세요, 저는 25이고, 나이는 철수살이며, 서울에 살고 있습니다.
2. 키워드 인자(Keyword Arguments)
키워드 인자는 매개변수 이름을 명시적으로 지정하여 값을 전달합니다. 이 방식은 순서를 무시하고, 지정된 이름에 따라 값을 매핑합니다.
예제
introduce(name="철수", city="서울", age=25)
# 출력: 안녕하세요, 저는 철수이고, 나이는 25살이며, 서울에 살고 있습니다.
특징
- 매개변수 이름을 명시하므로 순서에 의존하지 않아도 됩니다.
- 가독성이 좋고, 명확한 값을 전달할 수 있습니다.
3. 위치 인자와 키워드 인자의 혼용
위치 인자와 키워드 인자를 함께 사용할 수 있습니다. 단, 위치 인자를 먼저 사용해야 하며, 키워드 인자는 뒤에 와야 합니다.
예제
introduce("철수", age=25, city="서울")
# 출력: 안녕하세요, 저는 철수이고, 나이는 25살이며, 서울에 살고 있습니다.
잘못된 사용 예
introduce(age=25, "철수", city="서울")
# 오류 발생: SyntaxError: positional argument follows keyword argument
4. *args와 **kwargs: 동적 인자 처리
때로는 함수에 전달할 인자의 개수가 가변적일 수 있습니다. 이 경우 *args와 **kwargs를 사용하여 위치 인자와 키워드 인자를 동적으로 처리할 수 있습니다.
예제
- *args: 위치 인자를 가변적으로 처리
def sum_numbers(*args):
return sum(args)
print(sum_numbers(1, 2, 3, 4)) # 출력: 10
- **kwargs: 키워드 인자를 가변적으로 처리
def display_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
display_info(name="철수", age=25, city="서울")
# 출력:
# name: 철수
# age: 25
# city: 서울
요약: 위치 인자 vs 키워드 인자
특징 위치 인자 키워드 인자
매핑 방식 | 매개변수 선언 순서에 따라 매핑 | 매개변수 이름을 명시적으로 지정하여 매핑 |
가독성 | 매개변수 의미가 명확하지 않을 수 있음 | 매개변수 의미를 명확하게 전달 |
혼용 가능 여부 | 혼용 가능하나 위치 인자가 먼저 와야 함 | 뒤에 위치해야 함 |
유연성 | 고정된 순서로 값을 전달해야 함 | 순서와 상관없이 매개변수 이름으로 값 전달 가능 |
실제 사용 시 장점과 주의점
- 장점:
- 키워드 인자를 사용하면 코드 가독성이 좋아지고, 실수를 줄일 수 있습니다.
- 위치 인자는 빠르고 간단한 호출에 유용합니다.
- 주의점:
- 위치 인자와 키워드 인자를 혼용할 때 규칙을 잘 따라야 합니다.
- *args와 **kwargs를 사용할 때는 가독성을 유지하기 위해 명확한 문서화를 하는 것이 중요합니다.
위치인자는 무조건 키워드 인자보다 앞에 나와야해?
네, 위치 인자는 항상 키워드 인자보다 앞에 나와야 합니다. 이는 파이썬 함수 호출의 문법 규칙입니다. 위치 인자가 뒤에 오면 파이썬은 어떤 값이 위치 인자인지, 어떤 값이 키워드 인자인지 구분할 수 없기 때문에 오류를 발생시킵니다.
왜 위치 인자가 키워드 인자보다 앞에 나와야 할까?
- 명확한 매핑: 위치 인자는 함수 정의에서 매개변수의 순서대로 값을 매핑하기 때문에, 이를 키워드 인자 뒤에 배치하면 혼란이 발생할 수 있습니다.
- 구문적 일관성: 파이썬은 호출 구문에서 위치 인자를 먼저 처리한 다음, 남은 매개변수를 키워드 인자로 처리합니다. 이 순서를 어기면 파이썬은 해석할 수 없게 됩니다.
규칙 위반 예제
다음은 잘못된 사용으로 오류가 발생하는 경우입니다:
def greet(name, age):
print(f"안녕하세요, {name}님. 나이는 {age}살이시군요!")
# 잘못된 호출
greet(age=25, "철수")
# 오류 발생: SyntaxError: positional argument follows keyword argument
이 코드에서 age=25를 먼저 전달한 후 "철수"라는 위치 인자를 전달했기 때문에 오류가 발생합니다. 키워드 인자가 먼저 나오면 파이썬은 이후에 오는 값이 어떤 매개변수에 해당하는지 명확히 알 수 없습니다.
올바른 호출 예제
다음은 규칙을 준수한 예입니다:
greet("철수", age=25) # 올바른 호출
# 출력: 안녕하세요, 철수님. 나이는 25살이시군요!
여기서 "철수"는 위치 인자로 name에 매핑되고, age=25는 키워드 인자로 매핑됩니다. 호출 순서가 명확하므로 문제가 없습니다.
위치 인자와 키워드 인자의 혼용 규칙
- 위치 인자를 먼저 전달: 위치 인자는 키워드 인자보다 앞에 나와야 합니다.
- 키워드 인자는 순서 무관: 키워드 인자는 매개변수 이름을 명시하므로 순서에 의존하지 않습니다.
- 모든 인자를 키워드 인자로 전달 가능: 위치 인자 없이 모든 인자를 키워드 인자로 전달할 수도 있습니다.
- greet(name="철수", age=25)
- 혼용 시 위치 인자를 먼저 사용:
- greet("철수", age=25) # 위치 인자 먼저
참고: 가변 인자와 함께 사용할 때
*args와 **kwargs를 함께 사용하는 경우에도 이 규칙은 유지됩니다.
def example(a, b=10, *args, **kwargs):
print(a, b, args, kwargs)
# 올바른 호출
example(1, 20, 3, 4, name="철수", city="서울")
# 출력: 1 20 (3, 4) {'name': '철수', 'city': '서울'}
# 잘못된 호출
example(name="철수", 1, 20)
# 오류 발생: positional argument follows keyword argument
/ 앞에 있는 것만 위치 인자로 받겠다는 게 무슨 말이야?
/ 앞에 있는 것만 위치 인자로 받겠다는 의미
파이썬 함수 정의에서 /는 **"이전의 모든 매개변수는 위치 인자로만 사용해야 한다"**는 규칙을 강제하는 역할을 합니다. 이는 **위치 전용 인자(positional-only arguments)**를 명시적으로 지정할 때 사용됩니다.
위치 전용 인자란?
위치 전용 인자는 함수 호출 시 반드시 위치 인자로 전달해야 하는 매개변수를 의미합니다. 즉, 키워드 인자로 값을 전달할 수 없습니다.
위치 전용 인자 사용 예시
def example(a, b, /, c, d):
print(a, b, c, d)
# 호출 방법
example(1, 2, c=3, d=4) # 정상
example(1, 2, 3, 4) # 정상
# 잘못된 호출
example(a=1, b=2, c=3, d=4) # 오류 발생
# TypeError: example() got some positional-only arguments passed as keyword arguments
위 코드에서 a와 b는 / 앞에 있으므로 반드시 위치 인자로 전달해야 합니다.
/의 역할
- / 앞의 매개변수들은 위치 인자만 허용합니다.
- / 뒤의 매개변수들은 위치 인자 또는 키워드 인자 모두 가능합니다.
예제
def greet(name, /, message="안녕하세요"):
print(f"{name}, {message}")
# 올바른 호출
greet("철수") # 출력: 철수, 안녕하세요
greet("철수", message="반갑습니다") # 출력: 철수, 반갑습니다
# 잘못된 호출
greet(name="철수", message="반갑습니다")
# TypeError: greet() got some positional-only arguments passed as keyword arguments
- name은 / 앞에 있으므로 키워드 인자로 사용할 수 없습니다.
- message는 / 뒤에 있으므로 키워드 인자로 전달 가능합니다.
위치 전용 인자를 사용하는 이유
- API 설계의 명확성: 특정 매개변수는 위치 인자로만 사용하도록 강제함으로써, 함수 호출 방식이 일관되고 명확해집니다.
- 예: 수학 함수 pow(x, y)에서 x와 y는 위치 인자로만 전달하는 것이 직관적입니다.
- 호환성 유지: 기존에 위치 인자로만 전달되던 매개변수를 키워드 인자로 사용할 경우, 함수 정의를 수정하거나 호출 방식에 문제가 생길 수 있습니다. 위치 전용 인자를 명시하면 이러한 문제를 방지할 수 있습니다.
- 성능 향상: 키워드 인자는 매개변수 이름을 확인하는 추가 작업이 필요하므로, 위치 인자만 사용하는 것이 약간 더 빠릅니다.
/와 함께 사용하는 가변 매개변수
/와 *를 함께 사용하면 위치 전용, 위치 또는 키워드 혼용, 키워드 전용 매개변수를 모두 정의할 수 있습니다.
def func(a, b, /, c, *, d):
print(a, b, c, d)
# 호출 방법
func(1, 2, 3, d=4) # 정상: a, b는 위치 인자, c는 혼용 가능, d는 키워드 인자
func(1, 2, c=3, d=4) # 정상
# 잘못된 호출
func(a=1, b=2, c=3, d=4) # 오류 발생
# TypeError: func() got some positional-only arguments passed as keyword arguments
/의 실용적인 활용 예
1. 간단한 함수 정의
def divide(a, b, /):
return a / b
divide(10, 2) # 정상
divide(a=10, b=2) # 오류 발생
이 함수는 a와 b를 위치 인자로만 전달하도록 강제하여 혼란을 방지합니다.
2. 내장 함수와의 일관성
파이썬 내장 함수 중 일부는 이미 위치 전용 인자를 사용합니다.
help(print)
# 출력:
# print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False, /)
print() 함수의 value는 위치 전용입니다. 키워드 인자로 전달할 수 없습니다.
정리
- /: 이전 매개변수들은 위치 인자로만 사용할 수 있음.
- 위치 전용 인자는 API 설계의 명확성과 성능에 유리함.
- 키워드 인자를 혼용하려면 / 뒤에 매개변수를 배치해야 함.
내 필기 내용을 알아보겠니?
네, 필기 내용을 잘 이해할 수 있습니다! 필기에서 다루고 있는 내용은 파이썬의 **클래스와 객체지향 프로그래밍(OOP)**의 핵심 개념을 다룬 것입니다. 이를 더 구조적으로 설명하면서 보충해드리겠습니다.
클래스란 무엇인가?
클래스는 객체를 생성하기 위한 설계도 또는 틀입니다. 현실 세계의 사물처럼 속성(데이터)과 행동(메서드)을 묶어 하나의 단위로 정의합니다.
- 클래스: 설계도 또는 붕어빵 틀
- 객체(인스턴스): 클래스를 기반으로 만들어진 실제 데이터 (붕어빵)
왜 클래스를 사용할까?
- 복잡한 데이터와 행동을 구조화:
- 여러 함수와 변수를 관리하는 대신, 관련 있는 데이터와 행동을 묶어 코드 가독성과 유지보수성을 높임.
- 반복 작업의 간소화:
- 동일한 구조의 객체를 쉽게 생성하고 관리.
- 현실 세계를 모델링:
- 사물을 속성과 메서드로 표현하여, 프로그램 설계가 직관적이고 이해하기 쉬움.
클래스의 주요 개념
1. 클래스 변수와 인스턴스 변수
클래스 변수 (Class Variable)
- 클래스 자체에 속하는 변수로, 모든 객체가 공유합니다.
- 클래스 선언 내부에 정의되며, 객체를 생성하지 않고도 접근할 수 있습니다.
- 공유 데이터를 저장할 때 사용됩니다.
인스턴스 변수 (Instance Variable)
- 각 객체에 고유하게 속하는 변수로, 객체마다 독립적으로 값을 가집니다.
- self 키워드를 통해 정의하며, 객체가 생성될 때 초기화됩니다.
예제
class Cat:
# 클래스 변수
legs = 4
tail = 1
def __init__(self, name, age):
# 인스턴스 변수
self.name = name
self.age = age
# 인스턴스화
a = Cat("Podo", 3)
b = Cat("Momo", 4)
# 클래스 변수: 모든 객체가 공유
print(a.legs) # 4
print(b.legs) # 4
# 인스턴스 변수: 각 객체에 고유
print(a.name) # Podo
print(b.name) # Momo
2. 매직 메서드 (Magic Method)
매직 메서드는 파이썬 클래스에 미리 정의된 특수 메서드입니다.
- __init__: 생성자 메서드로, 객체가 생성될 때 자동 호출되어 초기화 작업을 수행.
- 기타 매직 메서드:
- __str__: 객체를 문자열로 표현.
- __eq__: 객체 비교.
- __add__: 객체 간 덧셈 재정의.
예제
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Cat(name={self.name}, age={self.age})"
a = Cat("Podo", 3)
print(a) # Cat(name=Podo, age=3)
3. 메서드와 함수의 차이
- 클래스 밖에 정의된 것: 함수
- 클래스 안에 정의된 것: 메서드
- 메서드는 객체와 관련된 작업을 수행합니다.
- 첫 번째 매개변수로 **self**를 사용하여 객체를 참조.
예제
class Cat:
def __init__(self, name):
self.name = name
# 메서드
def say_hi(self):
return f"{self.name} says hi!"
cat = Cat("Podo")
print(cat.say_hi()) # Podo says hi!
클래스 예제: 정리된 형태
class Cat:
# 클래스 변수
legs = 4
tail = 1
def __init__(self, name, age):
# 인스턴스 변수
self.name = name
self.age = age
# 메서드
def say_hi(self):
return f"{self.name} says hi!"
# 객체 생성
cat1 = Cat("Podo", 3)
cat2 = Cat("Momo", 4)
# 클래스 변수 접근
print(cat1.legs) # 4
# 인스턴스 변수 접근
print(cat1.name) # Podo
print(cat2.name) # Momo
# 메서드 호출
print(cat1.say_hi()) # Podo says hi!
클래스가 현실을 모델링하는 방식
- 속성: 사물의 특징 (예: 고양이의 이름, 나이, 다리 개수)
- 메서드: 사물의 행동 (예: 고양이가 "야옹" 소리를 내다)
붕어빵 틀 예시
class 붕어빵틀:
# 클래스 변수
재료 = "밀가루"
def __init__(self, 맛, 크기):
# 인스턴스 변수
self.맛 = 맛
self.크기 = 크기
# 객체 생성
붕어빵1 = 붕어빵틀("팥", "큰")
붕어빵2 = 붕어빵틀("슈크림", "작은")
print(붕어빵1.맛) # 팥
print(붕어빵2.맛) # 슈크림
후 오늘
배운 게 너무 많고
필기도 열심히하고
뿌듯하다
절대 내가 복붙만 한 게 아니라
내가 강의 듣는 중간중간에 물어본 것과 내 필기를 정리해달라고 했다!!!!진짜임
챗 지피티가 정리를 잘 하는걸 어쩌겠는가... 보기가 너무 좋은걸...
아무튼 내일도 알차게 보내야지.
'TIL' 카테고리의 다른 글
내일배움캠프 2주차 WIL - Python 연산자와 자료형 (3) | 2024.12.13 |
---|---|
내일배움캠프 본캠프 15일차 - 파이썬 - 연산자, 자료형 / 함수 문제 풀기 (1) | 2024.12.13 |
내일배움캠프 본캠프 13일차 - 머신러닝 회귀모델 코드 뜯어보기 (0) | 2024.12.11 |
내일배움캠프 본캠프 12일차 - 머신러닝 : 데이터 전처리, 의사결정나무 실습 (1) | 2024.12.10 |
내일배움캠프 본캠프 11일차 - 머신러닝 개념 정리 (1) | 2024.12.09 |