TIL 31. python 함수 기본 (+open)

rahula·2021년 6월 4일
0

python

목록 보기
5/10
post-thumbnail

파이썬 함수의 기본에 대해 알아보겠습니다. 이 글은 책 점프 투 파이썬을 토대로 작성됐습니다.

함수

반복적으로 사용되는 가치 있는 부분을 한 뭉치로 묶어서 어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다.

def

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

*args

입력값이 몇 개가 될 지 모를 때엔 어떻게 해야 할까?

당장 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

**kwargs

키워드 파라미터는 인자값들을 딕셔너리로 만든다.

def func(**kwargs):
    print(kwargs)

func(name="mike", age= 20)
# {'name': 'mike', 'age': 20}

return

함수의 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

lambda는 함수를 선언할 때 쓰는 예약어로 def와 동일한 역할을 한다.
보통 함수를 한 줄로 간결하게 만들 때 쓴다.

add = lambda first,second : first + second

result = add(10,20)
print(result)  # 30

input

input함수를 이용하여 명령프롬프트에서 직접 입력한 값을 프로그램에 적용시킬 수 있다.


result = input()

print(f"you typed {result}!")

open 함수

open?

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이 있다는 것을 확인했다.

open함수의 매개변수들

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

파이썬에는 외부 파일을 읽어들여 프로그램에서 쓸 수 있는 여러가지 방법이 있다.
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

각각의 줄을 리스트로 반환받고 싶다면 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

파일 내용 전체를 문자열로 반환받고 싶다면 read를 쓰면 된다.


my_file = open("지빠귀.txt", mode='r')
file_string = my_file.read()
print(file_string)

my_file.close()

with문과 함께

매번 파일 닫기가 귀찮다면, with문이 좋은 선택이다. with블록을 벗어나는 순간 열린 파일 객체가 자동으로 close되어서 편리하다.

with open("지빠귀.txt", mode='r') as my_file:
    file_string = my_file.read()
    print(file_string)
profile
백엔드 지망 대학생

0개의 댓글