Programming Language/Python

[Python] 기본 문법(9): 함수(Function)

lxvxxu 2024. 7. 19. 01:00

 

Python Fucntion Elements

  1) 전달값    ※ 필수 요소 X

  2) 반환값     ※ 필수 요소 X

  3) 동작

 

 

- 내장 함수: 파이썬에서 특정 기능을 하도록 미리 만들어 둔 함수

- 사용자 정의 함수: 개발자가 직접 코드를 작성해 만든 함수

 

형식 ( 함수 정의)
def 함수명(parameter/매개변수):
    실행할 문장1  # 함수 본문
    실행할 문장2
    . . .

 


※ 함수명 짓기 Tip

    함수명은 함수의 동작을 드러낼 수 있게 짓는 것이 좋다.
    변수명 규칙과 동일하게
       1. 문자로 시작한다.
       2. 단어가 여럿일 때에는 언더바(_)로 구분
       3. 일반적으로 변수는 명사, 함수는 동사를 사용한다.

 

실습1: 출금하기

https://thebook.io/080357/0236/

 

실습2: 수수료 부과하기

https://thebook.io/080357/0238/

 

 

 

함수 호출

기본값

함수를 호출할 때 직접 정의한 사용할 값

함수에서 매개변수에 미리 지정해 둔 값

 

def profile(name, age=20, main_lang="파이썬"):
	print("이름 : {0}\t나이 : {1}\t주 사용 언어 : {2}".format(name, age, main_lang))

profile("찰리")	# age, main_lang은 기본값 사용
profile("찰리", 22)	# main_lang은 기본값 사용
profile("찰리", 24, "자바")	# 기본값을 사용하지 않음

 

 

※ 전달값 작성 순서

함수를 정의할 때 일반 전달값기본값이 있는 전달값을 함께 사용하는 경우에는 반드시 일반 전달값을 먼저 적어야 합니다.

 

올바른 함수 정의 예시

def buy(item1, item2="음료수"):
	print(item1, item2)
    
buy("빵")

 

 

올바르지 않은 함수 정의 예시

def buy(item1="음료수", item2):
	print(item1, item2)
    
buy("빵")

 

=> SyntaxError: non-default argument follows default argument

 

 

- keyword argument (키워드 인자)

함수를 호출할 때 전달값뿐만 아니라 어디에 전달할지 명시적으로 지정하는 것

키워드 인자는 보통 어떤 함수에 전달값이 많고 기본값이 잘 정의돼 있을 때

대부분 기본값을 그대로 사용하면서 필요한 부분만 콕 집어서 값을 전달하려는 경우에 유용하다.

무엇보다 순서에 구애받지 않으므로 함수에서 사용 가능한 키워드 인자만 알고 있으면 사용할 수 있다.

 

일반 전달값 *(콕 집지 않고 전달)과 키워드 인자(콕 집어서 값을 전달)를 함께 사용해 함수를 호출할 때는

반드시 일반 전달값을 순서대로 먼저 적고 나서 키워드 인자를 적어야 한다.

※ 또한, 키워드 인자에 오타가 있으면 오류가 발생할 수 있으니 주의할 것.

 

def profile(name, age, main_lang):
	print(name, age, main_lang)
    
profile("찰리", age=20, main_lang="파이썬")	# 올바른 함수 호출: 일반 전달값을 먼저 작성
profile(name="루시", 25, "파이썬")	# 잘못된 함수 호출: 키워드 인자를 먼저 작성

 

 

- * 위치 인자 (positional argument)

함수를 호출할 때 함수에서 정의된 순서대로 입력하는 전달값

이 책에서는 키워드 인자와 구분하기 위해 일반 절달값으로 표현했다.

 

 

가변 인자 (vaiable argument)

정의된 전달값 개수 미만을 받기 => 나머지는 모두 빈 값으로 채워야 한다.

정의된 전달값 개수 초과를 받기 => ?

이 때 Variable Argument를 사용하면 둘 다 간단하게 해결할 수 있다.

 

가변 인자: 개수가 변할 수 있는 인자

함수에서 전달값 앞에 *을 추가하면 가변 인자가 된다.

가변 인자는 전달값이 몇 개가 들어오든 묶어서 튜플로 인식한다.

형식
def 함수명(전달값1, 전달값2, . . ., *가변 인자):
    실행할 문장1
    실행할 문장2
    . . .
    return 반환값

 

 

>> 튜플 바로가기

 

def profile(name, age, *language):
	print("이름 : {0}]t나이 : {1}\t".format(name, age), end=" ")
  	  print(language, type(language))
    
    profile("찰리", 20, "파이썬", "자바", "C", "C++", "C#", "자바스크립트")
	profile("루시", 25, "코틀린", "스위프트")

 

이처럼 가변 인자를 사용하면, 함수는 매개변수로 전달값을 순서대로 받고 남은 전달값이 몇 개든지

상관없이 묶어서 튜플로 처리합니다.

그래서 호출할 때마다 전달값의 개수가 달라져도 문제 없습니다.

 

https://thebook.io/080357/0253/


매개변수 end

 

아래의 코드는 결과를 2줄로 나누어서 출력하니 내용을 파악하기 어렵다.

def profile(name, age, lang1, lang2, lang3, lang4, lang5):
	print("이름 : {0}\t나이 : {1}\t".format(name, age))
    print(lang1, lang2, lang3, lang4, lang5)
    
profile("찰리", 20, "파이썬", "자바", "C", "C++", "C#")
profile("루시", 25, "코틀린", "스위프트", "", "", "")

 

 

실행결과를 한 줄로 출력하고 싶을 때 사용할 수 있는 end라는 매개변수가 있다.

함수를 호출할 때 기본값을 가지는 매개변수 'end'

형식
print(출력할 내용, sep=" ", end = "\n", file = None, flush = False)

 

def profile(name, age, lang1, lang2, lang3, lang4, lang5):
	print("이름 : {0}\t나이 : {1}\t".format(name, age), end = " ")
    print(lang1, lang2, lang3, lang4, lang5)
    
profile("찰리", 20, "파이썬", "자바", "C", "C++", "C#")
profile("루시", 25, "코틀린", "스위프트", "", "", "")

 


 

변수

- 지역 변수 (local variable)

- 전역 변수 (global variable)

 

전역 변수와 동일명의 지역 변수를 만들어 값을 수정하더라도

전역 변수와 지역 변수는 분리되므로 전역 변수의 값에 영향을 미치지 않는다.

 

영향을 미치게 하려면

global 변수명

을 사용해주어야 한다.

 

glasses = 10

def rent(people):
	global glasses	# 전역 공간에 있는 glasses 변수를 함수 안에서 사용하겠다는 표시
    glasses = glasses - people
    print("[함수 내부] 남은 3D 안경 개수: {0}".format(glasses))

print("전체 3D 안경 개수: {0}".format(glasses))
rent(2)
print("남은 3D 안경 개수: {0}".format(glasses))