들어가며
이번 시간에는 파이썬에서의 사용자 정의 함수를 배워보았다. 그리고 지금까지 배웠던 내용들을 다시 리뷰해보는 시간을 가졌다. 먼저 함수를 정의하고 다루는 방법에 대해 알아보자.
함수와 메서드
함수는 `def`를 이용하여 정의할 수 있다. `def` 뒤에는 함수의 이름을 지정하고 괄호 안에는 넣고자 하는 매개변수를 넣는다. 함수에서 실행하고자 하는 코드는 아래 코드와 같이 들여쓰기를 함으로써 한 코드블록으로 묶어줘야 한다.
또한 함수에는 반환값이라는 개념이 있는데 `return`을 이용해서 함수의 실행이 끝나면 값을 반환할 수 있다. 아래의 `add`함수는 매개변수 a와 b를 더한 값을 반환하는 기능을 가진 함수라고 보면된다. 함수 호출 후 반환된 값은 임의로 생성한 변수에 저장을 할 수도 있다.
# 함수의 정의
def add(a, b):
return a + b
# 함수의 호출
result = add(4, 10)
result
함수 매개변수 전달 방법
매개변수를 전달하는 방법은 4가지가 있다. 첫번째는 가장 일반적이고, 두번째는 매개변수의 이름에 값을 대입하여 넘기는 방법이다. 아래에서는 이름을 우선으로 값을 할당한다는 것을 알려주기 위해 일부러 `a`와 `b`의 순서를 바꾼 예시이다. 세번째는 매개변수 왼쪽에 `*`을 적음으로써 미정된 개수의 매개변수를 받아야할 때 사용된다. 즉 매개변수로 한개를 넣든 두개를 넣든 임의의 개수로 값을 넘겨줄 수 있는 방법이다. 네번째는 매개변수를 `키=값` 형태로 받아 함수 내부로 전달되는 방법이다. 출력해보면 매개변수로 전달된 키와 값이 추가되어 출력되는 것을 알 수 있다.
# 위치에 의한 매개변수 전달
sub(10, 7)
# 이름에 의한 매개변수 전달
sub(b=7, a=10) # 변수 이름 우선으로 값 할당 즉, b=7은 b로 할당, a=10은 a로 할당
# 입력값의 개수가 미정일 경우(매개변수를 여러개 받을 때)
def sum(*nums):
result = 0
for x in nums:
result += x
return result
# 키워드 매개변수( 매개변수를 (키=값) 형태로 받을 때, 딕셔너리 형태)
def print_kwargs(**kwargs):
print(kwargs)
print_kwargs(name='홍길동', age=30, height=190, wiget = 20)
Special Parameters /, *
처음에 조금 이해가 안갔다가 예시를 보고 이해한 개념이다. `print`함수의 매개변수 중 `end='/n'`이라는 게 있는데, 개행문자를 보면 알겠지만 출력될 결과물 끝에 문자를 지정할 수 있는 기능을 가지고 있다. 초기값은 `\n`이라 따로 지정을 안하면 자동으로 줄바꿈이 되지만 이걸 `.`으로 지정한다고 해보자.
print('안녕하세요', end='?')
print('반갑습니다')
# 안녕하세요?반갑습니다
이렇게 줄바꿈이 되지 않고 이어서 '반갑습니다'가 출력되는 것을 알 수 있다. 뜬금없이 `end` 매개변수를 언급한 이유는 이 `end`는 매개변수의 어느 위치에서든 사용이 가능하기 때문이다. 공식 문서에서 `print` 매개변수를 보면 `(...(생략), *, end='\n', ...(생략))` 이렇게 구성되어있다. 즉, `*` 다음에 오는 매개변수는 위치에 상관없이 지정을 해줄 수 있다는 말이다. `end` 뿐만아니라 `*` 이후에 오는 모든 속성이 가능하다.
반대로 `/` 다음에 오는 속성들은 무조건 정해진 위치에서만 가능하다. 그 예시는 다음과 같다.
def standard_arg(arg):
print(arg)
def pos_only_arg(arg, /):
print(arg)
def kwd_only_arg(*, arg):
print(arg)
def combined_example(pos_only, /, standard, *, kwd_only):
print(pos_only, standard, kwd_only)
# standard_arg(1)
# standard_arg(arg=2)
# pos_only_arg(3) # (b=3) 이런식으로는 사용X
# kwd_only_arg(arg=4)
# combined_example(1, standard=2, kwd_only=3)
유용한 기능 - Python 내장 함수
아래와 같이 파이썬 내장함수는 정말 다양하다. 교수님께서는 이 함수들을 일일이 다 외워서 쓰기보다는 그때 그때 필요한 상황에 맞게 찾아서 쓰면 충분하다고 하셨다. 리스트를 다루는 반복문에서 쓰이는 `len()`이나 입력받는 함수인 `input()`, 최대 최소값을 구하는 `max()`, `min()` 같은 경우는 자주 쓰게 될 것 같다.
# abs
## abs(x)는 어떤 숫자를 입력받았을 때 그 숫자의 절댓값을 리턴하는 함수이다.
# all
## all(x)는 반복 가능한 데이터 x를 입력값으로 받으며 이 x의 요소가 모두 참이면 True, 거짓이 하나라도 있으면 False를 리턴한다.
## 반복 가능한 데이터란 for 문에서 사용할 수 있는 자료형을 의미한다. 리스트, 튜플, 문자열, 딕셔너리, 집합 등이 있다.
# all의 내부
'''
def ALL(iterable):
for element in iterable:
if not element:
return False
return True
'''
# any
## any(x)는 반복 가능한 데이터 x를 입력으로 받아 x의 요소 중 하나라도 참이 있으면 True를 리턴하고 x가 모두 거짓일 때만 False를 리턴한다.
# chr
## chr(i)는 유니코드 숫자 값을 입력받아 그 코드에 해당하는 문자를 리턴하는 함수이다.
# dir
## dir은 객체가 지닌 변수나 함수를 보여 주는 함수이다.
# divmod
## divmod(a, b)는 2개의 숫자 a, b를 입력으로 받는다. 그리고 a를 b로 나눈 몫과 나머지를 튜플로 리턴한다.
# enumerate
## enumerate는 ‘열거하다’라는 뜻이다. 이 함수는 순서가 있는 데이터(리스트, 튜플, 문자열)를 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.
for i, name in enumerate(['body', 'foo', 'bar']):
print(f'arr[{i}]={name}')
# eval(생략)
## eval(expression)은 문자열로 구성된 표현식을 입력으로 받아 해당 문자열을 실행한 결괏값을 리턴하는 함수이다.
eval('1+2')
# filter
## filter란 ‘무엇인가를 걸러 낸다’라는 뜻으로, filter 함수도 이와 비슷한 기능을 한다.
## filter(함수, 반복_가능한_데이터)
def isEven(x):
return x % 2 == 0
x = list(filter(isEven, [1,2,3,4,5,6]))
print(x)
x = list(filter(lambda x: x % 2 == 0, [1,2,3,4,5,6]))
# id
## id(object)는 객체를 입력받아 객체의 고유 주솟값(레퍼런스)을 리턴하는 함수이다.
x = 10; y = 11
print(id(x)==id(y))
# input
## input([prompt])는 사용자 입력을 받는 함수이다. 입력 인수로 문자열을 전달하면 그 문자열은 프롬프트가 된다.
# len
## len(s)는 입력값 s의 길이(요소의 전체 개수)를 리턴하는 함수이다.
# max
## max(iterable)은 인수로 반복 가능한 데이터를 입력받아 그 최댓값을 리턴하는 함수이다.
# min
## min(iterable)은 max 함수와 반대로, 인수로 반복 가능한 데이터를 입력받아 그 최솟값을 리턴하는 함수이다.
# pow
## pow(x, y)는 x를 y제곱한 결괏값을 리턴하는 함수이다.
# round
## round(number [,ndigits])는 숫자를 입력받아 반올림해 리턴하는 함수이다.
# sorted
## sorted(iterable)는 입력 데이터를 정렬한 후 그 결과를 리스트로 리턴하는 함수이다.
# sum
## sum(iterable)은 입력 데이터의 합을 리턴하는 함수이다.
# type
## type(object)는 입력값의 자료형이 무엇인지 알려 주는 함수이다.
# zip
## zip(*iterable)은 동일한 개수로 이루어진 데이터들을 묶어서 리턴하는 함수이다.
list(zip([1, 2, 3], [4, 5, 6]))
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
list(zip("abc", "def"))
# map
input_str = "1 5 10 8 20 19 100"
max(list(map(int, input_str.split())))
마무리
파이썬 기초2에서 연습문제 마지막 부분에 행렬을 다룬 3문제가 생각보다 어려웠던 것 같다. 심지어 그중 한문제는 코딩테스트 문제로 접했던 적이 있음에도 불구하고 흐름을 기억해내는데 꽤 오랜 시간이 걸렸다. 어제 `Class ABC`에서 대표님과 현업개발자로 계신 과장님 말씀처럼 기본기를 탄탄하게 가져가는 게 정말 중요하다고 느껴진 하루였다.
'ABC부트캠프 테크노트' 카테고리의 다른 글
[7일차] ABC부트캠프 : 파이썬 프로그래밍 데이터 전처리 기초 (0) | 2024.07.12 |
---|---|
[6일차] ABC부트캠프 : 파이썬 프로그래밍 미니프로젝트 (0) | 2024.07.11 |
[4일차] ABC부트캠프 : 파이썬 프로그래밍 기초2 (0) | 2024.07.09 |
[3일차] ABC부트캠프 : 파이썬 프로그래밍 기초1 (0) | 2024.07.08 |
[2일차] ABC부트캠프 : ESG포럼 & 세미나 (0) | 2024.07.05 |