함수란?
- 지금까지 무심코 코드에서 사용된 많은 함수들이 존재 한다.
- 예를들면, sum, len, range 같은 함수 등이 있다.
- 함수란 우리가 알고있는 개념처럼 주어진 입력(input)에 대해서 의도된 출력(output)를 전달하는 역할을 한다.
- python 내부에 이미 정의(구현)된 함수를 내장함수(built-in function)이라고 한다.
함수의 정의
def 함수명(매개변수):
수행할문장들..
- def 키워드 사용한다.
- 매개변수란 함수에 입력으로 전달하는 값을 의미한다. parameter라고 한다.
- : (콜론)
- body (함수의 구현 부분, 함수 역시 코드 블록이기 때문에 들여쓰기 된 부분까지 함수의 코드블록으로 인지 함)
- 함수를 호출한 코드 (caller)로 함수가 해당 기능을 수행하고 완료된 값(output)을 전달하기 위해 return 키워드 사용한다.
- 즉, return 이후에 오는 값을 caller로 전달한다.
- 함수의 네이밍 무척 중요하다.
- 즉, 어떤 기능을 하는 함수인지 이름으로 최대한 나타날 수 있게 해야한다.
def my_add(value1, value2):
result = value1+value2
return result
result_value = my_add(2,4)
print(result_value)
6
함수의 사용(호출)
- 함수명(argument1, argument2, ... argumentn)
- 위와 같이 정의 된 함수의 이름과 전달되는 argument(인수)를 괄호안에 전달하여 함수를 호출
- 함수가 호출되면 실행의 흐름이 호출자(caller)에서 함수(callee)로 변경 된다.
print(my_add(4,4))
8
parameter
- 함수에 전달되는 입력(input)
- 입력이 필요하지 않을 수도, 1개의 입력만 있을 수도, 여러개의 입력이 존재할 수 도 있다.
- 파라미터로 int, string, float, boolm, list, dict 등등 어떤 파이썬 객체도 전달 가능하다.
- 심지어, 함수도 함수의 파라미터로 전달 가능하다.
- python의 경우, 타입 명시가 없기 때문에, 함수 생성 시, 의도된 파라미터의 타입에 맞게 입력을 전달하는 것이 중요하다.
- 또한 파라미터를 전달 할 때, 정의된 순서에 따라 값을 전달하는 것이 중요하다.
Default parameter (기본 인자)
- 함수의 파라미터에 기본값 지정 가능하다.
- 파라미터를 명시하지 않을 경우, 지정된 기본값으로 대체한다.
- 디폴트 파라미터 뒤에 일반 파라미터가 위치할 수 없다.
def test_add(x, y=10, z=5) :
return x*y+z
test_add(10)
test_add(10,23)
test_add(1,32,5)
37
print('abc', end='bye~~')
abcbye~~
def print_num(a,b,c):
print(a)
print(b)
print(c)
print_num(23,54,5)
list_a = [66,33,22]
print_num(*list_a) # *표는 언패킹 적용해줌
23
54
5
66
33
22
def gugu_print(dan):
print(dan, "단")
for i in range(1,10):
print(f'{dan}*{i}={dan*i}')
print('---------')
gugu_print(3)
3 단
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27
---------
a = list(range(1,10))
dan = 0
i = 0
def gugu_print(dan) :
for dan in a :
result = dan*i
return result
gugu_print(3)
0
- 기본 파라미터의 다른 예
- print 함수
- sep, end, file등 여러 기본 파라미터를 가짐
- print 함수
def test2(x,y,z):
print('x:',x)
print('y:',y)
print('z:',z)
test2(3,4,5)
x: 3
y: 4
z: 5
keyword parameter (키워드 파라미터)
- 파이썬의 경우, 파라미터에 값을 전달 할 때, 파라미터의 이름을 명시하여 전달 가능하다.
- 파라미터 이름을 사용하지 않을 경우, 기본적으로 순서에 맞게 전달한다.
test2(y=20,x=10,z=8)
x: 10
y: 20
z: 8
def person_info(name,phone,address):
print('이름:',name)
print('전화번호:', phone)
print('주소:', address)
person_info('kang','010-1111-1111','경기도 고양시')
person = {'name':'kang', 'phone':'010-1111-1111', 'address':'경기도 고양시'}
person_info(**person) # ** 딕셔너리 언패킹
이름: kang
전화번호: 010-1111-1111
주소: 경기도 고양시
이름: kang
전화번호: 010-1111-1111
주소: 경기도 고양시
return (리턴)
- 함수의 종료를 명시한다.
- return 옆에 값이나 수식이 있다면 해당 값을 호출자(caller)에게 반환(전달)한다.
- return 만 존재하면 None을 반환
- return이 없는 경우, 함수 코드 블록이 종료되면 종료된다. 이때도 None을 반환한다.
multiple return (복수 값 반환)
- tuple반환을 하여 복수개의 값 리턴 가능하다.
variable scope (변수의 범위)
- 변수가 참조 가능한 코드상의 범위를 명시한다.
- 함수내의 변수는 자신이 속한 코드 블록이 종료되면 소멸된다.
- 이렇게 특정 코드 블록에서 선언된 변수를 지역변수(local variable) 라고한다.
- 반대로 가장 상단에서 정의되어 프로그램 종료 전까지 유지되는 변수를 전역변수(global variable)라고한다.
- 같은 이름의 지역변수와 전역변수가 존재할 경우, 지역변수의 우선순위가 더 높다.
variable length argument (가변길이 인자)
- 함수에 전달되는 파라미터의 개수가 가변적일때 사용한다.
- 예를들면 print 함수나 format 함수를 생각해 볼 수 있다.
- args : 파라미터를 튜플의 형태로 전달 (함수 선언시 매개변수 앞에 * 붙임)
- kwargs : 파리미터를 딕셔너리 형태로 전달(네임드 파라미터) (함수 선언시 매개변수 앞에 ** 붙임)
def 함수이름(*매개변수):
수행할 문장
...
def 함수이름(**kwargs):
수행할 문장
keyword parameter (키워드 파라미터)
- **가 붙은 경우에는 키워드 파라미터로 인식
- 즉 함수 호출 시, 파리미터의 이름과 값을 함께 전달 가능
def func2(**kwargs):
for key, value in kwargs.items():
print(key,value)
func2(a=1)
func2(test=1, test2=32)
func2(name='kang', age=20, phone='010-1111-1111')
a 1
test 1
test2 32
name kang
age 20
phone 010-1111-1111
위치 인수와 키워드 인수를 함께 사용하기
def my_func(*args,**kwargs):
print(*args,**kwargs)
my_func(1,2,3,sep='\t',end='\tend')
1 2 3 end
연습문제
1.리스트를 입력받아서 리스트의 요소중 중복된 값은 삭제하고, 유일한 값만 유지하는 리스트를 반환하는 함수를 정의 하세요.
입력 예 [1,2,2,3,4,5,4]
출력 예 [1,2,3,4,5]
x = [1,2,2,3,4,5,4]
def no_dup(x):
result = list(set(x))
return result
no_dup(x)
[1, 2, 3, 4, 5]
- 문자열 두개를 인자로 전달받아 길이가 더 긴 문자열을 반환하는 함수를 정의하세요. 단, 두개의 길이가 같다면 첫번째 인자를 반환하세요.
입력 예 'test' 'python' 출력 예 'python'
입력 예 'java' 'test' 출력 예 'java'
def longer(a,b):
if len(a) >= len(b) :
return a
else :
return b
print(longer('python', 'test'))
print(longer('java', 'test'))
python
java
def max_find(*nums):
return max(nums)
max_find(1,2,3,4,100,20)
100
value_list = input().split()
int_list=[]
for value in value_list:
int_list.append(int(value))
print(int_list)
max_find(*int_list)
m_list = list(map(int, value_list))
print(m_list)
#map(함수, 반복가능한자료형)
max_find(*list(map(int,input().split())))
'[Python]' 카테고리의 다른 글
파이썬 - 파일 입출력 (0) | 2022.05.23 |
---|---|
파이썬 - lambda 함수 (0) | 2022.05.21 |
파이썬 - 반복문(for) (0) | 2022.05.20 |
파이썬 - 반복문(while) (0) | 2022.05.20 |
파이썬 - 조건문 (if, elif, else) (0) | 2022.05.20 |