"5. 함수"의 두 판 사이의 차이
(→선언위치) |
|||
(사용자 3명의 중간 판 9개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
함수의 사용에 대한 문서. | 함수의 사용에 대한 문서. | ||
+ | |||
+ | <youtube>https://www.youtube.com/watch?v=sUQTDqQm1Hg</youtube> | ||
==개요== | ==개요== | ||
48번째 줄: | 50번째 줄: | ||
return 반환값 | return 반환값 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | |- | ||
+ | |함수의 타입을 지정할 때 | ||
+ | (타입 힌팅) | ||
+ | |||
+ | (입력) | ||
+ | |함수가 받아들이는 타입을 제한할 수 있다.<syntaxhighlight lang="python"> | ||
+ | def 함수명(인수1: 타입, 인수2: 타입 = 기본값): | ||
+ | 명령 | ||
+ | return 반환값 | ||
+ | </syntaxhighlight>타입을 제한하고 기본값을 넣을 수도 있다. | ||
+ | |- | ||
+ | |함수의 타입을 지정할 때 | ||
+ | (타입 힌팅) | ||
+ | |||
+ | (반환) | ||
+ | |함수가 밷는 타입에 대한 힌트를 줄 수 있다.<syntaxhighlight lang="python"> | ||
+ | def 함수명(인수, 인수2) -> 타입: | ||
+ | 명령 | ||
+ | return 반환값 | ||
+ | </syntaxhighlight>반환 타입을 지정한다. 리스트 따위를 넣을 수 있다. | ||
|- | |- | ||
|함수에 대한 설명을 넣을 때 | |함수에 대한 설명을 넣을 때 | ||
62번째 줄: | 84번째 줄: | ||
!방법 | !방법 | ||
|- | |- | ||
− | |인수의 갯수, 값을 특정할 수 없을 때 | + | |인수가 넣어질 때와 안넣어질 때를 구분할 대. |
+ | |<syntaxhighlight lang="python"> | ||
+ | def 함수명(인수1, 인수2, 인수3=기본값): | ||
+ | 명령 | ||
+ | return 반환값1, 반환값2, ... | ||
+ | </syntaxhighlight>위 형태를 넣으면 인수3을 넣어도 되고 안넣어도 된다. | ||
+ | |- | ||
+ | |인수의 갯수, 값을 특정할 수 없을 때. | ||
가변인수를 사용한다. | 가변인수를 사용한다. | ||
+ | |||
+ | 주어진 인수의 갯수를 넘어 더 많은 인수를 기입하게 되면 튜플형태로 입력된다. | ||
+ | |||
+ | args 안에 데이터가 담겨, 이를 이용할 수 있다. | ||
|<syntaxhighlight lang="python"> | |<syntaxhighlight lang="python"> | ||
− | def 함수명(인수1, 인수2, ..., * | + | def 함수명(인수1, 인수2, ..., *args): |
− | 명령 | + | for i in args: |
+ | 명령 | ||
return 반환값1, 반환값2, ... | return 반환값1, 반환값2, ... | ||
− | </syntaxhighlight> | + | </syntaxhighlight>가변인수는 가장 뒤에 두며, 이들은 튜플형태로 저장된다. |
튜플명은 인수명으로. | 튜플명은 인수명으로. | ||
+ | |||
+ | 일반적으로 arguments의 약자인 args를 쓴다. | ||
|- | |- | ||
− | |튜플이 아닌 딕셔너리로 가변인수 | + | |튜플이 아닌 딕셔너리로 가변인수. |
+ | |||
+ | |||
+ | |||
+ | |||
+ | args와 같이 쓰면, 데이터만 들어온 경우 args에 튜플로 담기고, | ||
+ | |||
+ | <code>변수명 = 3</code> 형태로 들어온 경우 kwargs에 사전형으로 담긴다. | ||
|<syntaxhighlight lang="python"> | |<syntaxhighlight lang="python"> | ||
− | def 함수명(인수1, 인수2, ..., ** | + | def 함수명(인수1, 인수2, ..., **kwargs): |
+ | for x, y in kwargs.items(): | ||
+ | 명령 | ||
+ | |||
+ | # 아래처럼 사용할 수도 있다. | ||
+ | request = kwargs.get('변수명', None) # None 자리엔 없을 때 넣을 기본 값. | ||
+ | |||
+ | return 반환값1, 반환값2, ... | ||
+ | |||
+ | |||
+ | </syntaxhighlight>딕셔너리 인수를 넣을 땐 <code>키=값</code> 형태로 기입한다. | ||
+ | 일반적으로 keyword arguments의 약자인 kwargs를 쓴다. | ||
+ | |} | ||
+ | |||
+ | === 간단하게 사용할 팁 === | ||
+ | {| class="wikitable" | ||
+ | !상황 | ||
+ | !방법 | ||
+ | |- | ||
+ | |함수를 반복해 사용하는데, 사용되는 변수가 너무 많을 때. | ||
+ | 함수를 쓸 때마다 모든 변수를 기입해 넣는 것은 굉장히 불편한 일이다. | ||
+ | |||
+ | 때문에 사전 안에 모든 변수값을 기입해 넣는 방식이 잘 쓰인다. | ||
+ | |<syntaxhighlight lang="python"> | ||
+ | def 함수명(인수1, 인수2, 인수3=기본값): | ||
명령 | 명령 | ||
return 반환값1, 반환값2, ... | return 반환값1, 반환값2, ... | ||
− | + | ||
+ | 사전 = {'인수1':값, | ||
+ | '인수2':값2, | ||
+ | '인수3':값3.....} | ||
+ | |||
+ | # 다음과 같은 형태로 함수에 사전을 넣으면 인수명에 값이 대응된다. | ||
+ | 함수명(**사전) | ||
+ | </syntaxhighlight> | ||
|} | |} | ||
===사용=== | ===사용=== | ||
91번째 줄: | 165번째 줄: | ||
전역변수 : 함수 안팎으로 쓰이는 글로벌한 변수. | 전역변수 : 함수 안팎으로 쓰이는 글로벌한 변수. | ||
+ | |||
+ | 이름이 겹칠 때 전역변수를 사용하고 싶다면 global 변수명을 붙여준다. | ||
===전역변수의 사용=== | ===전역변수의 사용=== | ||
103번째 줄: | 179번째 줄: | ||
<code>global 변수명</code>을 넣어준다. | <code>global 변수명</code>을 넣어준다. | ||
|} | |} | ||
+ | nonlocal 함수 안에서 함수를 또 정의할 때 상위함수의 변수를 다루고 싶다면 <code>nonlocal 변수명</code>을 넣어준다.(한단계 위의 변수를 찾는다.) | ||
+ | |||
+ | 함수 안의 함수는 closure라고 한다. | ||
+ | |||
==ps== | ==ps== | ||
[[분류:기초]] | [[분류:기초]] |
2024년 12월 24일 (화) 09:13 기준 최신판
함수의 사용에 대한 문서.
1 개요[편집 | 원본 편집]
인수를 넣어주면 일정한 연산을 수행하는 기능.
반복된 프로그래밍을 피하고 전체적인 가독성을 높이기 위해, 쉬운 유지보수를 위해 사용한다.
2 선언[편집 | 원본 편집]
2.1 선언위치[편집 | 원본 편집]
사용하기 전에 선언되어야 한다.(보통은 맨 위에)
다른 언어와 달리 탭 1회나 띄어쓰기 4회로 함수 내 명령을 구분한다.(가독성을 위해)
형태 | 방법 |
---|---|
기본형식 | def 함수명(인수값):
명령
|
반환값 만들기 | 결과값을 반환하지 않는 함수를 프로시저라 부른다.def 함수명(인수값):
명령
return 반환값
변수명 = 함수명(인수값) 형태로 반환값을 객체에 담을 수도 있다.
|
인수가 여러개일 때 | def 함수명(인수1, 인수2):
명령
return 반환값
|
반환값이 여러개일 때 | def 함수명(인수1, 인수2, ...):
명령
return 반환값1, 반환값2, ...
변수1, 변수2 = 함수() # 이 형태로 사용하면 반환하는 순서대로 변수에 대입된다. |
인수에 기본값을 지정할 때 | def 함수명(인수1, 인수2=기본값):
명령
return 반환값
|
함수의 타입을 지정할 때
(타입 힌팅) (입력) |
함수가 받아들이는 타입을 제한할 수 있다.def 함수명(인수1: 타입, 인수2: 타입 = 기본값):
명령
return 반환값
|
함수의 타입을 지정할 때
(타입 힌팅) (반환) |
함수가 밷는 타입에 대한 힌트를 줄 수 있다.def 함수명(인수, 인수2) -> 타입:
명령
return 반환값
|
함수에 대한 설명을 넣을 때 | 함수값을 기입할 때 볼 수 있다.def 함수명(인수)
"""함수에 대한 설명"""
명령
|
함수 안에서 함수를 불러오는 등 다양하게 사용할 수 있다.
2.2 가변인수[편집 | 원본 편집]
형태 | 방법 |
---|---|
인수가 넣어질 때와 안넣어질 때를 구분할 대. | def 함수명(인수1, 인수2, 인수3=기본값):
명령
return 반환값1, 반환값2, ...
|
인수의 갯수, 값을 특정할 수 없을 때.
가변인수를 사용한다. 주어진 인수의 갯수를 넘어 더 많은 인수를 기입하게 되면 튜플형태로 입력된다. args 안에 데이터가 담겨, 이를 이용할 수 있다. |
def 함수명(인수1, 인수2, ..., *args):
for i in args:
명령
return 반환값1, 반환값2, ...
튜플명은 인수명으로. 일반적으로 arguments의 약자인 args를 쓴다. |
튜플이 아닌 딕셔너리로 가변인수.
|
def 함수명(인수1, 인수2, ..., **kwargs):
for x, y in kwargs.items():
명령
# 아래처럼 사용할 수도 있다.
request = kwargs.get('변수명', None) # None 자리엔 없을 때 넣을 기본 값.
return 반환값1, 반환값2, ...
키=값 형태로 기입한다.
일반적으로 keyword arguments의 약자인 kwargs를 쓴다. |
2.3 간단하게 사용할 팁[편집 | 원본 편집]
상황 | 방법 |
---|---|
함수를 반복해 사용하는데, 사용되는 변수가 너무 많을 때.
함수를 쓸 때마다 모든 변수를 기입해 넣는 것은 굉장히 불편한 일이다. 때문에 사전 안에 모든 변수값을 기입해 넣는 방식이 잘 쓰인다. |
def 함수명(인수1, 인수2, 인수3=기본값):
명령
return 반환값1, 반환값2, ...
사전 = {'인수1':값,
'인수2':값2,
'인수3':값3.....}
# 다음과 같은 형태로 함수에 사전을 넣으면 인수명에 값이 대응된다.
함수명(**사전)
|
2.4 사용[편집 | 원본 편집]
함수명(인수) 형태로 사용한다.
2.5 tip. 인수가 너무 많을 때[편집 | 원본 편집]
인수가 너무 많을 때 중간에 새로운 인수를 끼워넣어 함수를 편집하게 되면 기존에 사용하던 명령이 어그러질 위험이 있다. 다시 고치기도 귀찮고. 그럴 땐
함수명(인수=입력값)
형태로 사용하면 인수의 순서를 고려하지 않고도 함수를 사용할 수 있다.
3 특성[편집 | 원본 편집]
3.1 지역변수와 전역변수[편집 | 원본 편집]
기본적으로 함수 내부에서 정해진 변수는 사용이 끝나면 지워진다.
지역변수 : 함수 안에서만 쓰이는 변수.
전역변수 : 함수 안팎으로 쓰이는 글로벌한 변수.
이름이 겹칠 때 전역변수를 사용하고 싶다면 global 변수명을 붙여준다.
3.2 전역변수의 사용[편집 | 원본 편집]
에러 | 원인 | 해결법 |
---|---|---|
UnboundLocalError: local variable '변수명' referenced before assignment | 함수 밖의 전역변수를 인식하지 못했을 때. | 함수 초반에
|
nonlocal 함수 안에서 함수를 또 정의할 때 상위함수의 변수를 다루고 싶다면 nonlocal 변수명
을 넣어준다.(한단계 위의 변수를 찾는다.)
함수 안의 함수는 closure라고 한다.