파이썬 함수의 기본에 대해 알아보겠습니다. 이 글은 책
점프 투 파이썬
을 토대로 작성됐습니다.
반복적으로 사용되는 가치 있는 부분을 한 뭉치로 묶어서 어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다.
def
는 함수를 선언할 때 쓰는 예약어다.
def func(입력값):
return 출력값
매개변수(parameter)와 인수(argument)는 자주 혼용되서 사용된다.
매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미한다.
인수는 함수를 호출할 때 실질적으로 전달하는 입력값을 의미한다.
매개변수는 해당 함수에서 선언한 변수라고 생각하자.
def func(parameter):
return parameter + 1
func(1)
위의 코드에서 parameter은 함수안에서 선언된 것으로 볼 수 있다.
def func():
parameter = 1
return parameter + 1
func()
일반적인 함수는 특정한 입력값에 대해 특정한 로직으로 결과값을 반환한다.
def func(input):
output = input + 1
return output
그러나 함수의 입력값과 결과값은 우리가 쓸 수 있는 능력이지, 함수를 만들 때 필수조건은 아니다.
즉, 우리는 함수를 만들 때 입력값이 없거나, 결과값이 없거나, 둘 다 없는 함수를 얼마든지 만들 수 있다.
def no_input():
return "결과값"
def no_output(arg):
print(arg)
def no_both():
print("just say hello")
보통은 함수에서 지정한 매개변수의 순서에 따라 인자값(인수)을 넣어야 한다. 그러나 파이썬에서는 매개변수의 이름을 언급함으로써 순서에 상관없이 매개변수를 넣을 수 있다.
def func(first, second):
return first + second
func(second = 100, first = 1) # 101
입력값이 몇 개가 될 지 모를 때엔 어떻게 해야 할까?
당장 print
함수만 보더라도, 입력값이 몇개가 되든 들어온 순서대로 콘솔에 출력한다.
print(1,2,3,4,5,6,7,8,9,0)
# 1 2 3 4 5 6 7 8 9 0
이럴 때 쓰는 것이 *args
이다.
def func(*args):
print(args)
print(type(args))
func(1,2,3,4,5,6,7,8,9,0)
"""
1 2 3 4 5 6 7 8 9 0
(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
<class 'tuple'>
"""
이 때 특이사항은, 인자값들을 리스트가 아닌 튜플로 만든다는 것이다. 중간에 변형되는 것을 방지하기 위함인 듯 하다.
꼭 매개변수가 하나일 필요는 없다. 다른 인자값들은 특정 순서대로 받고, 그 뒤에 받을 인자값들을 *args
로 받을 수 있다.
def func(choice, *args):
if choice == "+":
result = 0
for arg in args:
result = result + arg
if choice == "*":
result = 1
for arg in args:
result = result * arg
return result
func("+", 1,2,3,4,5) # 15
func("*", 1,2,3,4,5) # 120
키워드 파라미터는 인자값들을 딕셔너리로 만든다.
def func(**kwargs):
print(kwargs)
func(name="mike", age= 20)
# {'name': 'mike', 'age': 20}
함수의 return값은 언제나 하나이다.
def func(a,b):
return a,b
result = func(10,20)
print(result)
print(type(result))
# (10, 20)
# <class 'tuple'>
위의 return문은 여러 개의 값을 return하는 듯 보이지만, 사실은 ()
표현이 생략된 튜플이다.
return문은 함수 실행을 즉시 종료시킨다.
return문 아래의 코드는 모두 실행되지 않으므로, 의미 없는 코드이다.
def func():
return 1
return 2
return 3
func() # 1
결과값이 없더라도, return을 이용해서 어떤 분기에 대해서 함수를 종료시킬 수 있다.
def func(arg):
if arg < 10:
return
return arg * 2
print(func(1)) # None
print(func(20)) # 40
어떤 함수들은 인자값을 필수로 받을 필요가 없는 경우도 있고, 인자값을 쓸 패턴이 너무 단순해서 생략하는 경우도 있을 것이다. 그럴 때 매개변수에 초깃값을 미리 설정한다.
def func(name, age, is_man = True):
print(name)
print(age)
print(is_man)
func("mike", 25)
# mike 25 True
lambda
는 함수를 선언할 때 쓰는 예약어로 def
와 동일한 역할을 한다.
보통 함수를 한 줄로 간결하게 만들 때 쓴다.
add = lambda first,second : first + second
result = add(10,20)
print(result) # 30
input
함수를 이용하여 명령프롬프트에서 직접 입력한 값을 프로그램에 적용시킬 수 있다.
result = input()
print(f"you typed {result}!")
open
은 파일을 생성하는데 사용하는 파이썬 내장 함수다.
파일 이름과 파일 열기 모드를 입력값으로 받고, 결과값으로 파일정보가 담긴 객체를 반환한다.
result = input("문자를 입력하세요 : ")
print(f"you typed {result}!",end="")
txt_file = open(f"{result}.txt", 'w')
print(txt_file)
# <_io.TextIOWrapper name='지빠귀.txt' mode='w' encoding='UTF-8'>
명령 프롬프트에서 나는 '지빠귀'라고 입력했고, 예상대로 '지빠귀.txt'라는 파일이 하나 생성됐다. 그리고 open
함수의 반환값에서 매개변수에는 name, mode, encoding이 있다는 것을 확인했다.
name
매개변수로 입력하는 파일확장자는 csv, txt 외에도 다른 것들로 만들 수 있는 듯하다.
또한 파일경로를 적어주면 파일을 현재 디렉토리가 아닌 다른 디렉토리에 생성할 수도 있다.
파일 열기 모드에는 'r'(읽기 모드), 'w'(쓰기 모드), 'a'(추가모드)가 있다.
encoding은 언젠가 알아봐야겠다.
result = input("문자를 입력하세요 : ")
txt_file = open(f"지빠귀.txt", 'a')
for item in range(7):
data = f"{item + 1}일째 {result}을 공부하고 있다. \n"
txt_file.write(data)
txt_file.close()
몇일을 더 공부해야 할까.
파이썬에는 외부 파일을 읽어들여 프로그램에서 쓸 수 있는 여러가지 방법이 있다.
readline
은 기본적으로 파일의 첫번째 줄을 반환한다.
my_file = open("지빠귀.txt", mode='r')
line = my_file.readline()
print(line)
# 1일째 파이썬을 공부하고 있다.
인자값으로 숫자를 넣어서 그 인덱스만큼 텍스트를 반환받는 방법도 있다.
line = my_file.readline(12)
print(line)
# 1일째 파이썬을 공부하
print(line + "기 싫어")
# 1일째 파이썬을 공부하기 싫어
모든 줄을 반환받고 싶다면 반복문을 쓰면 된다.
my_file = open("지빠귀.txt", mode='r')
while True:
line = my_file.readline()
print(line)
if not line : break
my_file.close()
각각의 줄을 리스트로 반환받고 싶다면 readlines
를 쓰면 된다.
my_file = open("지빠귀.txt", mode='r')
all_lines = my_file.readlines()
print(all_lines)
my_file.close()
"""
['1일째 파이썬을 공부하고 있다. \n', '2일째 파이썬을 공부하고 있다. \n', '3일째 파이썬을 공부하고 있다. \n', '4일째 파이썬을 공부하고 있다. \n', '5일째 파이썬을 공부하고 있다. \n', '6일째 파이썬을 공부하고 있다. \n', '7일째 파이썬을 공부하고 있다. \n']
"""
파일 내용 전체를 문자열로 반환받고 싶다면 read
를 쓰면 된다.
my_file = open("지빠귀.txt", mode='r')
file_string = my_file.read()
print(file_string)
my_file.close()
매번 파일 닫기가 귀찮다면, with
문이 좋은 선택이다. with
블록을 벗어나는 순간 열린 파일 객체가 자동으로 close
되어서 편리하다.
with open("지빠귀.txt", mode='r') as my_file:
file_string = my_file.read()
print(file_string)