가변 길이 인수: 함수가 임의의 수의 인수를 받을 수 있게 해주는 프로그래밍 기능입니다.
- 함수의 매개변수(input)가 여러개 일때마다 함수를 수정하면 비효율적인 방식이 됩니다.
- 매개변수 개수와 상관없이 함수를 1개로 만들고 싶을때 입력값을 리스트 또는 튜플과 같은 반복형(literable)자료로 받거나 가변인자함수 방식을 사용해야합니다.
현재, 우리가 사용하는 함수는 입출력 변수가 하나씩인데, 예시 이미지로 Square 클래스에 forward 메서드만 봐도

x = Variable(np.array(0.5)) -> a = A(x)로 들어가서 연산 진행 시 forward input : 0.5, output 즉, y가 0.25로 하나의 값만 리턴 합니다.
근데 덧셈이나 곱셈 처럼 입력이 여러개거나 sperate처럼 출력인 여러개인 경우도 생각해줘야합니다.


11.1 Function 클래스 수정
가변 길이 입출력을 표현하려면 변수들을 리스트(또는 튜플)에 넣어서 처리하면 편할 거 같습니다.
즉, Function 클래스는 지금처럼 '하나의 인수'를 '하나의 값'만 반환하는 것 입니다.
대신, 인수와 반환 값의 타입을 리스트로 바꾸고, 필요한 변수들을 이 리스트에 넣습니다.

11.2 Add 클래스 구현

아래 이미지를 보면 동작할때 값들이 어떻게 되는지 눈으로 따라갈 수 있습니다.

해당 방식의 문제점은 Add 클래스에 입력 변수를 리스트에 담아 건네주라고 하고, 반환값으로 튜플을 받는 것이 부자연스러움 > 다음장에서 구현
*(추가) 파이썬에서 리스트, 튜플의 차이
| 리스트 | 튜플 | |
| 가변성 | 가변적(Mutable) | 불변적(Immutable) |
| 표현 | 대괄호 [] | 소괄호 () or 쉼표로 구분된 값 |
| 사용 케이스 | 변경 가능한 데이터 | 변경 불가능한 데이터, 딕셔너리의 키로 사용 |
| 메서드 | append(), remove(), pop()등 | index(), count() |
# 리스트 예시
fruits = ['apple', 'banana', 'cherry']
fruits.append('orange')
print('append_orange', fruits) # append_orange ['apple', 'banana', 'cherry', 'orange']
fruits.remove('orange')
print('remove_orange', fruits) # remove_orange ['apple', 'banana', 'cherry']
fruits.append(1)
print('append_int number 1', fruits) # append_int number 1 ['apple', 'banana', 'cherry', 1]
fruits.pop()
print('pop_int number 1', fruits) # pop_int number 1 ['apple', 'cherry', 1]
# 튜플 예시
number = (1, 2, 4, 4, 5, 3)
index_of_3 = number.index(3)
print('index', index_of_3) # index 5
count_of_3 = number.count(3)
print('count', count_of_3) # count 1
# 튜플 딕셔너리 키로 사용할 때
dic = {(1, 2): "value"}
print(dic[(1, 2)]) # value
'Study 공부할레나' 카테고리의 다른 글
| [스터디/밑시딥3] 제 2고지 자연스러운 코드로_13. 가변 길이 인수(역전파 편) (0) | 2023.08.21 |
|---|---|
| [스터디/밑시딥3] 제 2고지 자연스러운 코드로_12. 가변 길이 인수(개선편) (0) | 2023.08.20 |
| [스터디/밑시딥3] 제 1고지 미분 자동 계산_10. 테스트 (0) | 2023.08.15 |
| [스터디/밑시딥3] 제 1고지 미분 자동 계산_9. 함수를 더 편리하게 (0) | 2023.08.15 |
| [스터디/밑시딥3] 제 1고지 미분 자동 계산_8. 재귀에서 반복문으로 (0) | 2023.08.13 |