Python Functions for Beginners
함수의 이해 (Understanding of Functions in Python)

1️⃣ 함수의 정의 (Function definition)
2️⃣ 함수의 쓰임새 (Practical applications of functions)
3️⃣ 함수의 사용법 (How to use functions)
4️⃣ 함수의 형태 (Forms of functions)
5️⃣ 매개변수 활용법 (Using parameters)
6️⃣ 초기값 설정하기 (Setting default values)
7️⃣ 함수안에서 변수 범위 (Variable scope inside functions)
8️⃣ lambda, input(), print() 함수 (lambda, input(), print() functions)
1️⃣ 함수의 정의
(Function definition)
함수는 프로그래밍에서 특정 작업을 수행하기 위해 미리 정의(predefined)된 코드 블록이다. 이 코드 블록은 입력 데이터를 받아서 미리 정의된 연산을 수행하고, 그 결과를 출력 데이터로 반환(returns the result as output data)한다.

예를 들어, 위의 예시에서 1 + 2라는 함수는 입력 데이터로 1과 2를 받아서 덧셈 연산을 수행하고, 결과로 3을 반환한다.
2️⃣ 함수의 쓰임새
(Practical applications of functions)
함수는 코드의 중복을 없애고 간결한 코드 작성을 가능하게 한다.
함수는 매개변수와 인수를 통해 값을 전달한다.
함수는 return을 통해 결과를 반환한다.
함수를 왜 사용하는 걸까?(Why do we use functions?)
코드의 중복 제거(Elimination of code redundancy)
자주 사용되는 연산을 반복적으로 수행할때, 코드 중복을 줄일 수 있다.프로그램의 가독성(Improved program readability)
프로그램의 흐름을 이해하기 쉬워지며, 코드에서 오류가 발생할 지점도 찾기 쉬워진다.코드의 재사용성(Enhanced code reusability)
함수로 정의된 연산은 코드로 손쉽게 공유가 가능하다.
예를 들어, "문장의 길이를 세어라"라는 연산을 함수로 정의하면 매번 길이를 측정할 때마다 같은 코드를 반복하지 않고 함수를 호출하여 간단히 사용할 수 있다.

3️⃣ 함수의 사용법
(How to use functions)
✅ 파이썬 함수의 구조 (Structure of Python functions)

def: 함수를 정의할 때 사용하는 예약어이다.
함수 이름(function name): 사용자가 임의로 정할 수 있는 함수의 이름이다.
매개변수(parameters): 함수에 입력으로 전달되는 값을 받는 변수이다.
return: 함수의 실행 결과를 반환하는 키워드이다.
✅ 함수 정의 예제 (Example of defining the function)
# 함수 정의하기 (Defining the function)
def add(a, b): #2개의 숫자를 입력하면
return a + b #그 두개의 숫자를 더한 결과가 출력된다.
# 함수 호출하기 (Calling the function)
a = 3 #위에 언급된 a, b와 이 a, b는 이어진다.
b = 4
c = add(a, b) #Add(3, 4)의 반환값을 c에대입
print(c) # 출력 결과는 7로 나온다.
✅ 매개변수와 인수(parameter and arguments)
매개변수(parameter) :
함수 정의에서 사용되는 변수이다.
함수에 입력으로 전달된 값을 받는 변수이다.
예를 들어, 함수
add(a, b)에서a와b는 매개변수이다.
인수 (Argument):
함수를 호출할 때 전달되는 실제 값이다.
함수를 호출할 때, 매개변수에서 전달받는 실제 값을 인수라고 한다.
예를 들어,
print(add(3, 4))에서3과4는 인수이다.
def add(a, b): # a, b는 매개변수(parameter)이다.
return a + b
print(add(3, 4)) # 3, 4는 인수(arguments)이다.
4️⃣ 함수의 형태
(Forms of functions)

입력값(Input): 파이썬에서는 함수 정의 시 매개변수(parameter)로 나타낸다.
결과값(Output): 파이썬에서는 함수 내부에서
return키워드를 사용하여 반환한다.
우리가 일반적으로 생각하는 함수의 기본적인 형태인 매개 변수(parameter)함수는 들어온 입력값을 받아 어떤 처리를 하여 적절한 결과값을 돌려주는 형태를 일컫는다. 하지만 매개변수가 있는 함수, 없는 함수가 있다. 이렇듯 함수의 형태는 입력값과 결과값에 따라 다양하다. 아래와 같이 4가지의 유형으로 나뉜다.
일반적인 함수 (Normal function)
입력값이 없는 함수 (No input function)
결과값이 없는 함수 (No output function)
입력값도 결과값도 없는 함수 (No input, no output function)
- 일반적인 함수 (Normal function)
입력값이 있고 결괏값을 반환하는 함수이다.
전형적인 예로는 두 수를 더하는 함수이다.
예를 들어,
a + b의 결과값을 반환하는 함수를 정의하고, 그 결과값을 변수에 할당하는 방식이다.
def add(a, b): # def 함수 이름(매개변수 parameters)
result = a + b # 수행할 문장
return result # a+b의 결괏값 반환
a = add(3,4) #결과값을 받을 변수
print(a) # 함수이름(입력인수1, 입력인수2, ...)
7 #최종 결과값
- 입력값이 없는 함수 (No input function)
함수가 매개변수(parameters) 없이 정의되고 호출될 수 있다.
예를 들어, 어떤 인사말을 출력하는 함수
say()가 있다. 이 함수는 매개변수 부분을 나타내는 함수 이름 뒤의 괄호안이 비어있다.이런 함수를 사용할 때는 say()처럼 괄호 안에 아무 값도 넣지 않아야 한다.
def say(): #파라미터가 비어있다.
return 'Hi'
a = say() #함수 호출시에도 파라미터를 비워둬야한다. 결과값을 받을 변수 = 함수이름()
print(a)
Hi #결과값
- 결과값이 없는 함수 (No output function)
함수가 어떠한 결과값도 반환하지 않고, 호출을 해도 돌려주는 값이 없다.
아래에 보이는 예제처럼 연산은 하는데 그 결과를 return 하지 않는다.
그럼에도 불구하고 호출을 하면 리턴값은 없지만 화면에 메시지를 출력하는 함수가 있다. 이 함수는 출력을 하지만, 호출 시에는 결과값을 반환하지 않는다.
def add(a, b):
print("%d, %d의 합은 %d입니다." % (a, b, a+b))
add(3, 4) #함수이름(입력인수1, 입력인수2)
3, 4의 합은 7입니다. #리턴값이 없음에도 불구하고 결과값이 출력되었다.
💡결과값이 진짜 없을까? (Is there really no return value?)
파이썬에서 함수가 명시적으로 반환할 값을 지정하지 않으면, 함수는 자동으로 None을 반환한다. None은 파이썬에서 결괏값이 없음을 나타내는 특별한 값이다. 따라서 "결괏값이 없는 함수"라고 하면, 함수가 명시적으로 값을 반환하지 않거나 return 문이 없는 경우를 의미한다. 예를 들어, 아래와 같이 함수를 정의하고 return 문이 없이 호출하면 None이 반환된다.
# 함수 정의하기 (결괏값 없는 함수)
def greet(name):
print(f"Hello, {name}!") #출력 결과: Hello, Bob!
# 함수 호출 (결괏값이 없음)
result = greet("Bob")
print(result) # 출력 결과: None
- 입력값도 결과값도 없는 함수 (No input, no output function)
입력 인수를 받는 매개변수도 없고, return 문도 없는, 즉 입력값도 결괏값도 없는 함수이다.
예를 들어, 단순히 화면에 인사말을 출력하는 기능을 하는 함수이다.
# 함수 정의하기 (입력값도 결괏값도 없는 함수)
def say():
print("Hello, World!")
# 함수 호출 (입력값도 결괏값도 없음)
say() # 출력 결과는 "Hello, World!"이다.
5️⃣ 매개변수 활용법
(Using parameters)
- 함수를 호출할 때 파라미터를 지정할 수 있다.
예를 들어,
add함수에 파라미터를 지정하여 호출할 수 있다.파라미터를 직접 지정하면 함수 정의 시 파라미터의 순서와 관계없이 값을 전달할 수 있는 장점이 있다. 이는 함수 호출 시 인수(arguments)의 위치를 신경쓰지 않고도 파라미터를 전달할 수 있게 해준다.
# 함수 정의하기 (두 수를 더하는 함수)
def add(a, b):
return a + b
# 매개변수 지정하여 함수 호출 (순서에 상관없이 사용)
result1 = add(a=3, b=5) # 매개변수 순서를 지정하여 호출
result2 = add(b=5, a=3) # 매개변수 순서를 바꿔서 호출
print(result1) # 출력 결과: 8
print(result2) # 출력 결과: 8
위의 예시에서 add 함수는 두 개의 매개변수 a와 b를 받아서 덧셈을 수행한다. 함수 호출 시 매개변수를 지정하여 순서를 바꾸거나 생략하여도 동일한 결과를 얻는다.
6️⃣ 초기값 설정하기
(Setting default values)
초기값을 미리 설정하여 매개변수가 항상 변하지 않는 경우에 유용하게 사용할 수 있다.
매개 변수에 들어 갈 값이 항상 변하는 것이 아니면, 초기값을 미리 설정하는 것이 유용하다.
아래의 예제는 함수를 정의하고 파라미터에 man=True:이렇게 초기값을 설정하여 default값을 넣어주었다. 이렇게 함수의 파라미터 초깃값을 설정할 수 있다.
아래의 예제는man 매개변수가 True일 때 "남자입니다.", False일 때 "여자입니다."를 출력하는 함수이다.
# say_myself 함수 정의하기
def say_myself(name, old, man=True):
print("나의 이름은 %s입니다." % name)
print("나이는 %d살입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
# 함수 호출 예시
say_myself("홍길동", 30, True)
say_myself("박지영", 25, False)
나의 이름은 홍길동입니다.
나이는 30살입니다.
남자입니다.
나의 이름은 박지영입니다.
나이는 25살입니다.
여자입니다.
say_myself 함수에서 name과 old는 필수 파라미터이고, man은 초기값이 True로 설정되어 있다. 따라서 함수를 호출할 때 man 파라미터를 명시적으로 지정하지 않으면 True로 간주된다. 즉 say_myself 함수는 man=True로 설정되어 있으므로, man 매개변수를 생략하면 자동으로 True로 처리되었다.
또다른 예제를 참고해보자
# say_myself 함수 정의하기
def say_myself(name, old, man=True): # 초깃값이 설정되었다.
print("나의 이름은 %s입니다." % name)
print("나이는 %d살입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
# 함수 호출 예시
say_myself("박응용", 27)
위의 예시에서 say_myself 함수는 man=True로 초기값을 설정하였다. 함수 호출 시 name과 old 매개변수는 반드시 값을 전달해야 하지만, man 매개변수는 생략할 경우 자동으로 True가 설정된다. 따라서 함수 호출 결과는 다음과 같다.
나의 이름은 박응용입니다.
나이는 27살입니다.
남자입니다.
이와 같이 초기값을 설정하면 함수 호출 시 일부 매개변수를 생략하거나 지정하지 않아도 기본 동작을 정의할 수 있어 편리하다.
7️⃣ 함수안에서 변수 범위
(Variable scope inside functions)
지역 변수 (Local variables)
함수 내부에서 선언된 변수는 해당 함수 내에서만 유효하다. 이러한 변수를 "지역 변수"라고 한다.
함수 내부에서 동일한 이름의 변수를 사용해도 함수 외부에서는 영향을 미치지 않는다.
💡함수 안에서 사용할 변수의 이름을 함수밖에서도 동일하게 사용한다면? 아래의 예제참조
# 함수 밖에서 변수 a 선언
a = 10
# vartest 함수, 파라미터로 a를 갖도록 선언
def vartest(a):
print("함수 안의 변수 a:", a) # 함수 내에서 매개변수 a 출력
# 함수 호출
vartest(5) # 함수에 5를 인수로 전달
# 함수 외부의 변수 a 출력
print("함수 외부의 변수 a:", a)
함수 외부에서도 동일한 이름의 변수
a가 있지만, 함수 내부의a와는 별개로 동작한다. 따라서 함수 외부의a값은 변하지 않고, 10으로 출력된다. (아래의 결과 참조)이처럼 함수 내에서 사용되는 변수는 해당 함수 내에서만 유효(local variable)하며, 함수 외부의 동일한 이름의 변수와는 별개로 처리된다.
함수 안의 변수 a: 5
함수 외부의 변수 a: 10
8️⃣ lambda 함수 (lambda function)
lambda 매개변수1, 매개변수2, ... : 표현식람다는 함수를 간단하게 정의할 때 사용하는 예약어이다.
보통 한 줄로 간결하게 함수를 만들 때 유용하게 사용된다.
함수의 정의를 간결하게 하고, 코드의 가독성을 높일 수 있다.
일반적으로 복잡하지 않은 함수를 정의할 때 사용하며,
def키워드를 사용하지 않고 간단히 표현식으로 함수를 정의할 수 있다.
# 두 수를 더하는 간단한 람다 함수 정의
add = lambda x, y: x + y
# 함수 호출 예시
result = add(3, 5)
print(result) # 출력 결과: 8
def add(a, b):
return a+b
result = add(3, 4)
print(result) #출력 결과: 8
위의 코드에서 lambda x, y: x + y는 두 수를 더하는 함수를 정의하였다. lambda 키워드를 사용하여 x와 y라는 매개변수를 받고, x + y라는 표현식을 통해 두 수를 더하여 반환한다. 이 함수는 add라는 변수에 할당되어, add(3, 5)와 같이 호출된다.
위의 두가지 예제는 같은 출력 결과:8 을 도출한다. 람다함수를 이용한 코드가 간결함을 확인할 수 있다.
8️⃣ Input() 함수 (Input() function)
input() 함수는 사용자가 콘솔(키보드)에 입력한 값을 받아 어떤 변수에 저장할 때 사용한다. input() 함수는 입력된 모든 값을 문자열로 취급한다. 이를 다른 데이터 유형으로 변환하려면 추가적인 변환 작업이 필요하다. 파이썬에서 미리 적용해높은 파이썬 함수이다.
# 사용자가 입력한 값을 a에 대입
a = input("문장을 입력하세요: ")
# 입력된 값을 출력
print("입력된 문장:", a)

input("문장을 입력하세요: ")는 사용자가 키보드에 입력한 값을 받는다.input()함수 안에 있는 문자열은 프롬프트로 사용자에게 보여진다.사용자가 입력한 값은 변수
a에 저장된다.print("입력된 문장:", a)는 저장된 값을 출력한다. (결과 위의 캡쳐 참조)
💡입력된 값을 다른 데이터 유형으로 변환하기
입력된 값을 정수나 실수로 변환하려면 int() 또는 float() 함수를 사용해야 한다.
# 사용자가 입력한 값을 정수로 변환하여 a에 대입
a = int(input("정수를 입력하세요: "))
# 입력된 값을 출력
print("입력된 정수:", a)
# 사용자가 입력한 값을 실수로 변환하여 b에 대입
b = float(input("실수를 입력하세요: "))
# 입력된 값을 출력
print("입력된 실수:", b)

8️⃣ print() 함수 (print() function)
print() 함수는 파이썬에서 제공하는 함수이다. 다양한 자료형을 출력할 수 있으며, 문자열을 띄어쓰기하거나 연결하는 방법도 제공한다.
숫자 출력하기 (printing numbers)
a = 123
b = 45.67
print(a) # 정수 123 출력
print(b) # 실수 45.67 출력
문자열 출력하기 (printing strings)
print("Hello, World!") # 문자열 Hello, World! 출력
리스트 출력하기 (printing lists)
my_list = [1, 2, 3, 4, 5]
print(my_list) # 리스트 [1, 2, 3, 4, 5] 출력
문자열 띄어쓰기: 콤마(,) 사용 (spacing strings: using comma (,) )
print("Hello", "World") # 출력: Hello World
print("Number:", 123) # 출력: Number: 123
문자열 연결하기: 큰 따옴표(") 사용 (concatenating strings: using double quotes(") )
print("Hello" + " World") # 출력: Hello World
print("Number: " + str(123)) # 출력: Number: 123
print("life"+"is"+"too short") # 출력: lifeistoo short, 개발자들은 주로 이 방법 사용용
함수 연습
(Functions practice)
짝수를 판별하는 함수의 예제이다.
numbers = [1,2,3,4,5,6,7,8,9,10]
# 짝수를 판별하는 함수
def is_even(x): #x에 데이터가 들어오면
return x % 2 == 0 #x가 짝수이면 True를 반환, 홀수이면 False를 반환
# filter 함수를 사용하여 짝수만 필터링
even_numbers = list(filter(is_even, numbers))
print(even_numbers)
#결과값: [2, 4, 6, 8, 10]
하지만 lambda() 함수를 사용하여 더 간단하게 구현이 가능하다.
numer_list = [1,2,3,4,5,6,7,8,9,10]
result = list(filter(lambda x: x%2==0, numer_list)) #람다 람수 사
print(result)
#결과값: [2, 4, 6, 8, 10]
똑같은 결과값이 나오고 가독성이 높아졌다.
함수 파일 읽고 쓰기
(file reading & writing in function)
✅ 파일 생성하기 (creating a file)
파이썬에서는 파일 입출력 함수를 사용하여 파일을 생성하고 데이터를 저장할 수 있는데
파일을 생성하기 위해 파이썬 내장 함수 open()을 사용한다.
💡open()함수: 파일을 생성하기 위해 사용된다. ‘파일 이름’과 ‘파일 열기 모드’를 입력값으로 받고 결괏값으로 파일 객체를 반환한다.

💡파일 열기 모드(file opening mode): 파일을 어떻게 열고, 어떤 작업을 수행할 것인지 지정하는 방법이다. 파일 열기 모드는 문자열로 지정하며, 주로 사용하는 모드는 다음과 같다. 참고로 파일을 쓰기 모드(w)로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성된다.

아래의 소스 코드를 실행하면 프로그램을 실행한 디렉터리에 새로운 파일이 생성됨을 확인 할 수 있다.
f = open("practice.txt", "w")
f.close()
!ls #이 코드를 실행하면 새로운 txt 파일을 확인할 수 있다.
f = open("practice.txt", 'w')
for i in range(1,11):
data = "%d번째 줄입니다.\n" %i
f.write(data)
f.close()
#위 코드를 실행하고 !cat practice.txt를 실행하면 아래와 같은 결과가 나온다.

✅ 파일 읽기 (reading a file)
readline() 함수
readlines() 함수
read() 함수
파이썬에서 파일을 읽을 때, 여러 가지 방법을 사용할 수 있는데 위에 언급된 3가지를 살펴보자
readline() 함수: 파일의 첫 번째 줄을 읽어 출력하는 코드이다.
f = open("practice.txt", 'r')
line = f.readline()
print(line)
f.close()

모든 줄을 읽어서 화면에 출력하려면 아래와 같이 실행한다.
#모든 줄을 읽어서 화면에 출력하기
f = open("practice.txt", 'r')
while True: #무한루프 안에서 f.readline()을 사용해 파일을 계속해서 한줄씩 읽어 들임
line = f.readline() #readline()은 더 이상 읽을 줄이 없을 경우 None 출력
if not line: break #더 이상 읽을 줄이 없으면 break 수행
print(line)
f.close()

readlines() 함수: 함수는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트로 반환한다.
f = open("practice.txt", 'r')
lines = f.readlines() #파일의 모든 줄을 읽은 뒤, 각각의 줄을 요소로 갖는 리스트로 반환
print(type(lines))
for line in lines:
print(line)
f.close()

print(type(lines))를 통해 <class 'list'> 을 볼 수 있다.
read() 함수: f.read()는 파일 내용 전체를 하나의 문자열로 반환한다. data는 파일의 전체 내용
f = open("practice.txt", 'r')
data = f.read()
print(type(data)) #파일 전체가 str, 문자열임을 확인 가능
print(data)
f.close()
<class 'str'>
1번째 줄입니다.
2번째 줄입니다.
3번째 줄입니다.
4번째 줄입니다.
5번째 줄입니다.
6번째 줄입니다.
7번째 줄입니다.
8번째 줄입니다.
9번째 줄입니다.
10번째 줄입니다.
💡위의 파이썬 코드에서 f.는 파일 객체를 나타낸다. 파일을 열 때 open() 함수를 사용하여 파일 객체를 생성하고, 이 파일 객체(f)를 통해 파일에 대한 다양한 작업을 수행할 수 있다. 예를 들어:
f.read()는 파일의 내용을 읽어와 문자열로 반환한다.f.close()는 파일을 닫는다. 파일을 열었으면 작업이 끝난 후에는 항상 파일을 닫아주는 것이 좋다.
따라서 f.는 파일 객체를 통해 파일과 관련된 작업을 수행할 수 있도록 한다.
with 문(with statement)
파일을 열고 닫는 방법
(how to open and close a file)
f.close()는 열려 있는 파일 객체를 닫아 주는 역할을 한다.
쓰기 모드로 열었던 파일을 닫지 않고 다시 사용하면 오류가 발생하기 때문에 close()를 사용해서 열려 있는 파일을 직접 닫아야 한다.
아래 예제의 결과물은
!cat foo.txt를 실행하면 write의 괄호안에 작성한 코드가 출력된다.
f = open("foo.txt", 'w')
f.write("Life is too short, you need python")
f.close()
with ~ as문을 사용해서 파일을 열고 닫는 방법
(how to open and close a file using the with ~as statement)
with문은 파일을 열고 닫는 것을 자동으로 처리해 주는 문법이다.
앞선 예제를 with문을 사용하여 수정한 코드를 참고해보자
with문을 사용하면 with 블록을 벗어나는 순간 열린 파일 객체 f가 자동으로 close 된다.
with open("foo.txt", "w") as f:
f.write("Life is too short, you need python and python and python")

open("foo.txt", "w")을 호출하여 파일을 연다.열린 파일 객체를 변수
f에 할당한다. (as f:)
as f:다음에 오는 블록(들여쓰기로 구분된 코드 부분)에서f를 사용하여 파일에 대한 작업을 수행할 수 있다.블록이 끝나면(
with블록을 벗어나면) 자동으로f.close()가 호출되어 파일이 닫힌다.
with open("foo.txt", "w") as f:구문은 파일을 안전하게 열고 사용한 후에 자동으로 닫아주는 편리한 방법을 제공한다.
퀴즈(Quiz)




