p.287 손코딩: 범위 내부의 정수를 모두 더하는 함수 실행 후 코드가 입력된 화면 & 실행 결과 캡쳐

매개변수, 기본 매개변수, 가변 매개변수 정리

 

❤ 05-1 함수 만들기

* 함수를 호출한다는 여러 가지 자료를 저장할 수 있는 자료이다. 함수를 호출할 때 괄호 내부에 넣는 여러 가지 자료를 매개변수라고 한다. 함수를 호출해서 최종적으로 나오는 결과를 리턴값이라고 한다.

 

* 함수의 기본

def 함수 이름():
     문장

 

* 함수에 매개변수 만들기

def 함수 이름(매개변수, 매개변수, ...):
     문장

괄호 내부에 입력한 value와 n이라는 식별자가 곧 매개변수, 이렇게 매개변수를 만들면 함수를 호출할 때 값을 입력해서 함수쪽으로 전달할 수 있다.

* 매개변수와 관련된 TypeError

① 함수를 생성할 때 매개변수를 만들었는데, 함수를 호출할 때 매개변수를 넣지 않는 경우

print_n_times()라는 함수의 매개변수 n이 없다라는 오류

함수를 생성할 때 매개변수를 만들었는데, 함수를 호출할 때 매개변수를 더 많이 넣는 경우

print_n_times()라는 함수에 2개의 매개변수가 필요한데 3개가 들어왔다는 오류

* 가변 매개변수

앞의 함수는 함수를 선언할 때 매개변수와 함수를 호출할 때의 매개변수가 같아야했다. 그러나 가변 매개변수 함수는 매개변수를 원하는 만큼 받을 수 있다. (매개변수 개수가 변할 수 있다는 의미의 가변)

def 함수 이름(매개변수, 매개변수, ...,*가변 매개변수):

     문장

 

✔ 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다.

✔ 가변 매개변수는 하나만 사용할 수 있다.

만약 ("안녕하세요","나는","다비니",3)처럼 사용한다고 하면 어디까지가 가변 매개변수고, 어디가 매개변수 n인지 구분하기 힘들므로 가변 매개변수 뒤에 일반 매개변수가 오지 못하게 막은 것이다.

* 기본 매개변수

매개변수=값 형태로 되어 있는 것이 기본 매개변수

기본 매개변수 뒤에는 일반 매개변수가 올 수 없다.

매개변수 n을 n=2라는 형태로 입력

* 키워드 매개변수

매개변수 이름을 지정해서 입력하는 매개변수

매개변수 이름을 지정해서 입력하는 매개변수인 키워드 매개변수

a는 일반 매개변수이므로 해당 위치에 반드시 입력(1번)

일반 매개변수이지만 키워드 형태로도 사용할 수 있다.(2,3번)

 

키워드를 지정하는 매개변수를 입력하는 경우에는 매개변수 순서를 원하는 대로 입력할 수 있다.(3번)

 

4번은 b를 생략한 형태로, 이렇게 키워드 매개변수를 사용하면 필요한 매개변수에만 값을 전달할 수 있다.

일반 매개변수는 필수로 입력해야한다.

 

* 리턴

# input() 함수의 리턴값을 변수에 저장

value = input("> ")

print(value)

 

* 리턴 - 자료 없이 리턴하기

함수 내부에서는 return 키워드를 사용할 수 있다. 이 키워드는 함수를 실행했던 위치로 돌아가라는 뜻으로, 함수가 끝나는 위치를 의미한다.

return 키워드를 만나는 순간 함수가 종료되어 결과적으로 A만 출력하고 프로그램 종료

* 리턴 - 자료와 함께 리턴하기

* 리턴 - 아무것도 리턴하지 않기

None은 '없다'라는 뜻

* 기본적인 함수의 활용

def 함수(매개변수):
      변수 = 초깃값
      # 여러 가지 처리
      # 여러 가지 처리
      ...
      return 변수

기본 미션 p.287 범위 내부의 정소를 모두 더하는 함수 손코딩

초깃값 설정 output=0으로 변수를 초기화한 뒤에 사용했음. (그래야 연산 결과값에 변화를 주지 않으므로)

기본 매개변수를 사용하여 함수 더 편리하게 사용하기. 매개변수에 기본값을 줌.
추가 미션 💖

 

 

 

❤ 05-2 함수의 활용

* 재귀 함수

팩토리얼로 재귀 함수 알아보기 ~!

반복문으로 팩토리얼 구하기
재귀함수로 팩토리얼 구하기

* 재귀 함수의 문제

한 번 구했던 값도 처음부터 다시 계산하므로 연산 시간이 오래 걸림.

메모화 : 딕셔너리를 사용해서 한 번 계산한 값을 저장하는 것을 메모한다고 표현한다. 딕셔너리에 값이 메모되어 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드의 속도를 빠르게 만드는 것이다. (재귀함수와 함께 많이 사용되는 기술)

 

* UnboudLocalError에 대한 처리

p.297의 코드에서 8행에 global counter

global counter라는 8행 코드를 지우고 실행하면 UnboundLocalError 오류가 발생하는데, 이는 파이썬은 함수 내부에서 함수 외부에 있는 변수를 참조하지 못하기 때문이다. 그래서 

global 변수이름

과 같이 global 키워드를 이용해서 함수 내부에서 함수 외부에 있는 변수라는 것을 알려주면 된다.

 

* 조기 리턴

과거에는 프로그래밍을 할 때 변수는 반드시 앞쪽에서 몰아서 선언하고, 리턴은 반드시 뒤쪽에서 해야한다는 비공식적인 규칙이 있었지만 요즘에는 필요할 때 하면 된다는 인식이 퍼졌다.

왼쪽 코드를 흐름 중간에 return 키워드를 사용하여 들여쓰기 단계를 줄임으로써 코드를 더 쉽게 읽을 수 있게 만들기

 

❤ 05-3 함수 고급

* 튜플과 람다

- 튜플 : 함수와 함께 많이 사용되는 리스트와 비슷한 자료형으로, 리스트와 다른 점은 한번 결정된 요소는 바꿀 수 없다는 점이다.

- 람다 : 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭고, 코드 공간 낭비라는 생각이 들 때 함수를 간단하고 쉽게 선언하는 방법이다.

 

* 튜플

(데이터, 데이터, 데이터, ...)

>>> tuple_test = (10, 20, 30)

>>> tuple_test[0]

10

>>> tuple_test[1]

20

>>> tuple_test[2]

30

 

위 코드는 튜플을 선언해 생성한 후 각 요소를 출력한 것이다. 이것만 보면 튜플과 리스트에는 차이가 없지만, 요소를 변경하려 하면 오류가 난다.

>>> tuple_test[0] = 1

코드를 입력하면 TypeError가 발생한다. 튜플은 내부 요소 변경이 불가능하기 때문이다.

요소를 하나만 가지는 튜플

* 괄호 없는 튜플

리스트와 튜플을 사용하면 특이한 형태로 변수를 선언하고 할당할 수 있다. 또 튜플은 괄호를 생략해도 튜플로 인식할 수 있는 경우에는 괄호를 생략해도 된다.

또 a, b = 10, 20을 a, b = b, a 코드를 통해 값을 교환할 수도 있다.

 

 

* 함수의 매개변수로 함수 전달하기

 

*  fileter()함수와 map() 함수

함수를 매개변수로 사용하는 대표적인 표준 함수로 map() 함수와 filter() 함수가 있다.

map() 함수는 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성해주는 함수이다.

map(함수, 리스트)

flter() 함수는 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로, 새로운 리스트를 구성해주는 함수이다.

filter(함수 리스트)

결과로 나온 <map object>와 <filter object>를 제너레이터라고 부른다. 여기에 list() 함수를 적용해서 강제로 리스트 자료형으로 변환해 출력해본 코드

 

*  람다

람다는 '간단한 함수를 쉽게 선언하는 방법'이다.

lambda 매개변수: 리턴값

power() 함수와 under_3() 함수를 람다로 변환하면

power = lambda x: x*x
under_3 = lambda x: x<3

코드가 된다. def 키워드로 선언했던 함수를 lambda로 바꾸고, return 키워드를 따로 쓰지 않았다는 정도의 차이가 생긴다.

 

*  파일 처리

ⓐ 파일 열기

파일 객체 = open(문자열: 파일 경로, 문자열: 읽기 모드)

모드에는 이 3개를 지정할 수 있다.

ⓑ 파일 닫기

파일 객체.close()

위 코드를 실행했더니 같은 폴더에 파일이 생성된 것을 확인할 수 있다.

ⓒ with 키워드

프로그램이 길어지면 open() 함수와 close() 함수 사이에 많은 코드가 들어가므로 파일을 열고 닫지 않는 실수를 하는 경우가 생길 수 있으므로 이런 실수를 방지하기 위해 with 키워드를 사용한다.

with open(문자열: 파일 경로, 문자열: 모드) as 파일 객체:
      문장

ⓓ 텍스트 읽기

파일 객체.read()

ⓔ 텍스트 한 줄씩 읽기

텍스트를 사용하여 데이터를 구조적으로 표현할 수 있는 방법으로 CSV, XML, JSON 등이 있다.

CSV(Comma Separated Values)는 쉼표로 구분된 값들을 의미한다.

이름, 키, 몸무게 → 헤더
윤인성, 176, 62
연하진, 169, 50 → 데이터

 

for 한 줄을 나타내는 문자열 in 파일 객체:
     처리

콜백 함수를 람다로 바꾸기 p.340

딕셔너리 오름차순 정렬하기 p.341

 

+ 함수의 값 복사와 레퍼런스 복사

파이썬은 함수를 호출할 때 함수 내부 코드를 실행하기 위해 함수 내부의 변수를 저장할 스택을 추가로 만든다.

def 함수(b):

     c=10

a=10

함수(a)

 

이 코드를 실행하면 메모리에 2개의 스택이 만들어지는데, 가장 외곽에 있는 스택을 전역 스택이라고 한다.

(왼) 기본 자료형 복사 (우) 객체 자료형 복사

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ정리ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ