여니의 프로그래밍 study/파이썬

[#9 파이썬 기초] 함수 정의하기

여니's 2021. 1. 6. 15:15

- 함수를 사용하는 이유는?

: 코드의 재사용을 위해 사용한다.

 

- 함수의 2가지 작업 : 정의하기, 호출하기

 

1. 함수 정의하기 : def

def 함수명():


2. 함수 호출하기 : ()

함수명()

 

ex코드)

if 함수명():

~~~~

>> if문에서 이 함수를 호출하여 반환되는 값으로 조건 테스트도 가능하다.

 


3. 인수와 매개변수

def 함수명(매개변수):return ~~~

 

- 인수란?: 함수로 전달한 값을 의미한다. 인수의 값은 함수 내에서 해당하는 매개변수에 복사된다.즉 함수 외부에서는 인수라고 하고, 함수 내부에서는 매개변수라고 한다.

 

 

1. 유용한 None

- None이란?

: 아무것도 없다는 것을 뜻하는 파이썬의 특별한 값으로 false랑은 다른의미이다.

2. 위치 인수

: 파이썬은 다른 언어에 비해서 함수의 인수를 유연하고 독특하게 처리를 한다.

위치 인수는 값을 순서대로 상승하는 매개변수에 복사하는 것을 의미한다.

위치 인수의 단점은 각 위치의 의미를 알고 지정해야 한다는 점이다.

 

3. 키워드 인수

: 인수를 함수 정의와 다른 순서로 지정할 수 있다.

4. 기본 매개변수  값 지정하기

>> 형식 >>

def 함수명(매개변수1,매개변수2,매개변수3='기본값'):

예제1
예제2

5. 위치 인수 분해하기 & 모으기

- 파이썬에서는 포인터가 없다.

- 애스터리스크(*)를 이용해서 나머지 인수들을 모두 취하게 할 수 있다.

※ 애스터리스크(*)를 사용할 때 관용적으로 args를 사용한다.

애스터리스크는 함수 호출 또는 정의에서만 사용할 수 있다.

함수 내부에서 애스터리스크는 모든 위치의 인수를 단일 인수 튜플로 수집한다.

즉 함수 외부에서 분해된 값들을 함수 내부에서 모으는 역할을 한다.

 

6. 키워드 인수 분해하기 & 모으기

- 키워드 인수를 딕셔너리로 묶이 위해 두 개의 애스터리스크(**)를 사용함.

위치 인수는 *args

키워드 인수는 **kwargs

 

**kwargs는 함수 외부에서 분해된 이름=값을 함수 내부로 모으는 역할을 한다.

 

7. 키워드 전용 인수

 


4. 함수의 독스트링

: 함수 바디 시작 부분에 문자열을 포함시켜서 함수 정의에 문서를 붙일 수 있다.

def 함수명():

'문자열~~~'

return ~~

 

-함수의 독스트링을 출력하려면 help()함수를 호출

- 서식 없는 독스트링 

>>print(함수명.__doc__)


5. 일등 시민 : 함수

: 모든 것은 객체다

객체는 숫자, 문자열, 튜플, 리스트, 딕셔너리, 함수를 포함한다.

괄호가 없으면 객체이고, 파이썬에서 모든 것은 객체이다.

함수는 일등 시민에 속한다.

함수를 변수에 할당하거나, 다른 함수에서 이를 인수로 사용하고, 함수에서 이를 반환할 수 있다.

 


6. 내부함수

: 함수 안에 또 다른 함수를 정의할 수 있다.

내부 함수는 반복문이나 코드 중복을 피하기 위해 또 다른 함수 내에 어떤 복잡한 작업을 한 번 이상 수행할 때 유용하다.

inner함수는 c+d를 반환, outer함수는 내부함수인 inner함수 자체를 반환

1. 클로저

내부 함수는 클로저처럼 동작한다.

클로저란?

: 퍼스트클래스 함수를 지원하는 언어의 네임 바인딩 기술이다.

어떤 함수를 함수 자신이 가지고 있는 환경과 함께 저장한 레코드이다. 

일반 함수와 다르게 자신의 영역 밖에서 호출된 함수의 변수값과 레퍼런스를 복사하고 저장한 뒤 이 캡처한 값들에 접근할 수 있도록 도와준다.


7. lambda : 익명함수

- 람다는 많은 작ㅇ느 함수를 정의하고, 이들을 호출해서 얻은 모든 결과값을 저장하는 겨우 유용하다.

특히 콜백 함수를 정의하는 GUI에서 람다 사용

 


8. 제너레이터

- 제너레이터란 시퀀스를 생성하는 객체이다.

제너레이터를 순회할 때마다 마지막으로 호출된 항목을 기억하고 다음 값을 반환한다. 

일반 함수는 이전 호출에 대한 메모리가 없고, 항상 똑같은 상태로 첫 번째 줄부터 수행한다.

 

range()도 제너레이터에 속한다.

 

 

1. 제너레이터 함수

: yield문으로 반환한다.

잠재적으로 큰 시퀀스를 생성하고 제너레이터 컴프리헨션에 대한 코드가 길면 제너레이터 함수를 사용

 

- 순회를 마친 제너레이터를 다시 순회하면 아무것도 반환하지 않는다. 

즉 제너레이터는 한 번만 순회할 수 있다.

 

2. 제너레이터 컴프리헨션

: 제너레이터 함수의 축약 버전으로 안 보이게 yield문을 실행하고 제너레이터 객체를 반환한다.

 

- yield

: 함수를 종결하지 않고 계속 값을 반환해주는 역할을 하는데, 반복적으로 return 해주는 것을 의미한다.

함수 안에서 yield문이 어떤 동작을 수행하는 것을 제너레이터라고 한다.

즉 제너레이터는 yield가 포함된 함수이다.

 


9. 데커레이터

: 하나의 함수를 취해서 또 다른 함수를 반환하는 함수이다.

 

*args, **kwargs, 내부함수, 함수 인수를 사용한다.

데커레이터를 사용하고 싶은 함수에 그냥 @데커레이터_이름을 추가한다.

 

- 함수는 여러 데커레이터를 가질 수 있다.

 

(1) 데커레이터 수동활용

(2)@ 활용

여러 데커레이터가 수행될 수 있으나

순서가 다르면,

중간과정도 달라진다.

 


10. 네임스페이스와 스코프

- 전역변수를 바꾸려면 global을 선언한 뒤 바꿔줘야 한다.

만약 global 키워드를 사용하지 않으면

파이썬은 로컬 네임스페이슬르 사용하고 변수는 지역 변수가 된다.

지역변수는 함수 실행 후 사라진다.

 

* locals()함수 || globals()함수

locals()함수는 로컬 네임스페이스의 내용이 담긴 딕셔너리를 반환

globals()함수는 글로벌 네임 스페이스의 내용이 담긴 딕셔너리를 반환


11. 이름에 __ 사용하면 안 된다.

두 언더바는 사용하면 안된다.

__로 시작하고 끝나는 이름은 파이썬 내부 사용을 위해 예약되어 있기 때문이다.


12. 재귀함수

- 함수가 자기 자신을 호출하는 것을 의미한다.

파이썬에서 재귀가 너무 깊다면,

자기 자신을 많이 호출한다면 예외가 발생한다.

 

재귀함수는 리스트의 리스트의 리스트와 같이 고르지 않은 데이터를 처리할 때 유용하다.

시퀀스의 시퀀스를 하나의 시퀀스로 수집하기

isinstance(item,list):

>> item이 list형인지 알아보고 맞으면 true를 반환, 아니면 false를 반환한다.


13. 비동기함수

- def 앞에 async 키워드가 붙으면 비동기 함수이다.

함수를 호출하기 전에 await 키워드가 있으면 해당 함수는 비동기이다.

 

비동기함수는 실행 완료보다는 제어를 넘겨주는 것이다.

여러 동작을 동시에 처리하는 방식!

 

<->동기방식

 

async def 함수명():

asyncio는 비동기 프로그램을 위한 모듈이다.

cpu 작업과 입출력 작업을 병렬로 처리해서,

멀티 스레드나 멀티 프로세스보다 쉽게 병렬 작업을 구현할 수 있다.

 


14. 예외

- 잠재적인 모든 에러를 방지하기 위해서 적절한 예외처리가 필요하다.

 

1.  try, except

except 예외 타입 as 이름

 

- err 변수에 IndexError 예외를, other 변수에 다른 기타 예외를 저장한다.

 

 

참고 출처

: 처음 시작하는 파이썬