04장 파이썬의 입출력
__04-1 함수
____함수란 무엇인가? ____함수를 사용하는 이유는 무엇일까?
:: "반복적으로 사용되는 가치 있는 부분"을 한 뭉치로 묶어서 "어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다"라는 식의 함수로 작성
작성한 프로그램을 기능 단위의 함수로 분리해 놓으면 프로그램 흐름을 일목요연하게 볼 수 있기 때문
____파이썬 함수의 구조
def 함수 이름 (매개변수):
<수행할 문장1>
<수행할 문장2>
...
- def는 함수를 만들 때 사용하는 예약어
- 함수명은 함수를 만드는 사람이 임의로 만들 수 있다.
- 함수명 뒤 괄호 안의 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수
def add(a, b):
return a + b
>>> a = 3
>>> b = 4
>>> c = add(a, b)
>>> print(c)
7
"이 함수의 이름은 add이고 입력으로 2개의 값을 받으며 리턴값(출력값)은 2개의 입력값을 더한 값이다."
____매개변수와 인수
def add(a, b): # a, b는 매개변수
return a+b
print(add(3, 4)) # 3, 4는 인수
- 매개변수 - 함수에 전달된 값을 저장하는 변수
- 인수 - 함수에 전달하는 값
____입력값과 리턴값에 따른 함수의 형태
# 함수는 입력값을 받아 처리하고 적절한 결과를 반환하는데, 이때 입력값과 반환값의 유무에 따라 4가지 형태로 나뉩니다.
# 1. 일반적인 함수: 입력값 O 리턴값 O : 입력값을 받아 처리하고 그 결과를 반환
def add(a, b):
result = a + b
return result
>>> a = add(3, 4)
>>> print(a)
7
# 2. 입력값 X 리턴값 O : 입력값 없이 함수를 호출하고 리턴값을 받음
def say():
return 'Hi'
>>> a = say()
>>> print(a)
Hi
# 3. 리턴값 X 입력값 O : 입력값을 받아 처리하고 결과를 출력하나, 리턴값은 없음
def add(a, b):
print("%d, %d의 합은 %d입니다." % (a, b, a+b))
>>> add(3, 4)
3, 4의 합은 7입니다.
>>> print(a)
None
# 4. 입력값 X 리턴값 X : 입력값 없이 함수를 호출하고 결과를 출력하며, 리턴값도 없음
def say():
print('Hi')
>>> say()
Hi
____매개변수를 지정하여 호출하기
>>> def sub(a, b):
... return a - b
...
>>> result = sub(a=7, b=3) # a에 7, b에 3을 전달
>>> print(result)
4
>>> result = sub(b=5, a=3) # b에 5, a에 3을 전달 #순서에 상관없이 사용할 수 있다
>>> print(result)
-2
____입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?
# 함수에 *args를 사용하면 여러 개의 입력값을 받아서 처리할 수 있습니다.
# add_many 함수는 임의의 개수의 숫자를 입력받아 모두 더하는 기능을 합니다.
def add_many(*args):
result = 0
for i in args:
result = result + i
return result
>>> result = add_many(1,2,3)
>>> print(result)
6
>>> result = add_many(1,2,3,4,5,6,7,8,9,10)
>>> print(result)
55
# add_mul 함수는 choice 매개변수를 통해 'add' 혹은 'mul'을 선택하고,
# 선택한 연산을 *args로 받은 숫자들에 대해 수행합니다.
def add_mul(choice, *args):
if choice == "add":
result = 0
for i in args:
result = result + i
elif choice == "mul":
result = 1
for i in args:
result = result * i
return result
>>> result = add_mul('add', 1,2,3,4,5)
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120
____키워드 매개변수, kwargs
: 매개변수 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 입력값이 그 딕셔너리에 저장됨
# 키워드 매개변수(kwargs)는 함수에 입력되는 키-값 쌍들을 딕셔너리로 저장합니다.
# 함수 내부에서 **kwargs는 입력된 키-값 쌍을 딕셔너리로 출력합니다.
def print_kwargs(**kwargs):
print(kwargs)
# 예시로 함수에 다양한 키-값 쌍들을 입력, 입력된 키-값 쌍은 딕셔너리 형태로 출력됨
>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}
____함수의 리턴값은 언제나 하나이다
#여러 개의 값을 리턴하는 함수의 호출 결과를 변수에 담으면 하나의 튜플로 저장됩니다.
def add_and_mul(a, b):
return a + b, a * b
result = add_and_mul(3, 4)
print(result) #(7, 12)
# add_and_mul 함수는 (7, 12)라는 튜플을 반환하는데 이 튜플 전체가 result에 저장됩니다.
result1, result2 = add_and_mul(3, 4)
# 여러 개의 값을 리턴하는 함수 호출 결과를 여러 개의 변수로 받으면 튜플의 값을 각각의 변수에 할당합니다.
# result1에는 7이, result2에는 12가 할당됩니다.
# 만약 함수 내에 여러 개의 return문이 있더라도 파이썬은 첫 번째 return문을 만나면 즉시 해당 값만 반환하고 함수를 종료합니다.
# 그래서 두 번째 return문은 실행되지 않고 첫 번째 return문의 값만 반환됩니다.
# 함수 내에서 특정 조건을 만족할 때 함수 실행을 중단하고 빠져나가기 위해 return문을 단독으로 사용할 수 있습니다.
# 예를 들어, 입력값이 '바보'인 경우 함수를 즉시 종료시킬 수 있습니다.
def say_nick(nick):
if nick == "바보":
return # 입력값이 '바보'인 경우 함수 실행을 즉시 중단하고 함수를 빠져나갑니다.
print("나의 별명은 %s 입니다." % nick)
say_nick('야호') # '야호'는 출력됩니다.
say_nick('바보') # '바보'는 입력되었지만 조건에 해당하여 아무것도 출력되지 않고 함수가 즉시 종료됩니다.
____매개변수에 초깃값 미리 설정하기
# 함수의 매개변수에 초깃값을 설정하는 방법을 알아봅니다.
# 예를 들어, 함수의 매개변수 중 일부를 True나 False와 같은 값을 미리 지정하여 함수를 호출할 때 해당 인자를 주지 않아도 되게 합니다.
def say_myself(name, age, man=True):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살입니다." % age)
if man:
print("남자입니다.")
else:
print("여자입니다.")
# 함수를 호출할 때 초깃값을 설정한 매개변수(man=True)는 입력하지 않아도 자동으로 True 값을 갖습니다.
say_myself("박응용", 27)
# 초깃값을 설정한 매개변수(man=True)에 값을 주어 함수를 호출할 수도 있습니다.
say_myself("박응선", 27, False)
# 함수의 매개변수 중 초깃값이 없는 매개변수는 초깃값이 있는 매개변수 뒤에 위치해야 합니다.
# 이 규칙을 어기면 SyntaxError가 발생합니다.
____함수 안에서 선언한 변수의 효력 범위
# 함수 내에서 사용되는 변수는 함수 외부의 변수와는 별개로 취급된다.
# 예를 들어, 함수 내부에서 매개변수 a를 사용하더라도 함수 외부의 변수 a와는 관련이 없다.
# 이로 인해 함수 내부에서 변경한 매개변수는 함수 외부의 변수에 영향을 주지 않는다.
a = 1
# 함수 vartest는 매개변수 a를 1 증가시키는 역할을 합니다.
def vartest(a):
a = a + 1
vartest(a)
print(a) #1을 더했으니까 2가 출력될 것 같지만 결괏값은 1
# 함수 vartest를 호출하여 매개변수 a에 3을 전달합니다.
# 하지만 함수 외부의 변수 b는 함수 내부의 매개변수와는 아무런 연관이 없습니다.
def vartest(a):
b = b + 1
vartest(3)
print(b)
#vartest(3)을 수행하면 vartest 함수 안에서 b는 4가 되지만
#함수를 호출하고 난 뒤 print(b) 문장은 오류가 발생하게 된다.
# 따라서 함수 외부에서의 변수 b를 출력하려고 하면 해당 변수를 찾을 수 없어 오류가 발생합니다
#*위에서 밖에서 정의된 a때문에 오류 안 나길래 b로 바꿈
____함수 안에서 함수 밖의 변수를 변경하는 방법
# 첫 번째 방법: return을 활용
# 함수의 결과값을 변수에 대입하여 함수 외부의 변수를 변경하는 방법
a = 1
# vartest 함수는 입력으로 받은 값에 1을 더한 값을 반환함
def vartest(a):
a = a + 1
return a
# vartest 함수를 호출하여 결과값을 변수 a에 대입함
a = vartest(a)
print(a) # 변수 a를 출력하여 변경된 값을 확인함
# 두 번째 방법: global 키워드를 사용
# 함수 내에서 함수 외부의 변수를 직접 변경하는 방법
a = 1
# vartest 함수 내에서 global 키워드를 사용하여 외부 변수 a를 직접 참조하여 값 변경
def vartest():
global a
a = a + 1
# vartest 함수를 호출하여 외부 변수 a의 값을 변경함
vartest()
print(a) # 변경된 변수 a의 값을 출력하여 확인함
____lambda 예약어
# Lambda 함수를 사용하여 두 개의 매개변수를 받아 더한 값을 리턴하는 함수 생성
>>> add =lambda a, b: a+b
# Lambda 함수를 사용하여 3과 4를 더한 값을 result에 저장하여 출력
>>> result = add(3, 4)
>>> print(result)
7
# 기존에 def를 사용하여 정의한 함수와 Lambda 함수 비교 : 동일하다!
>>> def add(a, b):
... return a+b
...
>>> result = add(3, 4)
>>> print(result)
7
__04-2 사용자 입출력
____사용자 입력 활용하기
# 사용자 입력을 받아 변수에 할당하는 방법
a = input() # 사용자 입력을 받아 변수 a에 저장
print(a) # 입력된 값 출력
# 사용자 입력과 함께 안내 문구를 표시하여 입력 받는 방법
number = input("숫자를 입력하세요: ") # 안내 문구와 함께 사용자 입력을 받아 변수 number에 저장
print(number) # 입력된 값 출력
#input은 입력되는 모든 것을 문자열로 취급하기 때문에 number는 숫자가 아닌 문자열임에 주의
____print 자세히 알기
# 문자열 연결
print("life" "is" "too short") # 따옴표로 둘러싸인 문자열을 연속해서 쓰면 자동으로 연결됨
print("life" + "is" + "too short") # + 연산자를 사용해도 동일한 결과 출력
# 문자열 사이 띄어쓰기
print("life", "is", "too short") # 콤마(,)로 구분하면 문자열 사이에 띄어쓰기 출력
# 한 줄에 결괏값 출력
for i in range(10):
print(i, end=' ') # end 매개변수를 사용하여 출력 끝에 줄바꿈 대신 공백을 넣어 한 줄에 출력
__04-3 파일 읽고 쓰기
____파일 생성하기
f = open("새파일.txt", 'w')
f.close()
파일을 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성된다. 위 예에서는 디렉터리에 파일이 없는 상태에서 새파일.txt를 쓰기 모드인 'w'로 열었기 때문에 새파일.txt라는 이름의 새로운 파일이 현재 디렉터리에 생성되었다.
파일 객체 = open(파일 이름, 파일 열기 모드)
파일 열기 모드에는 다음과 같은 것들이 있다.
파일열기모드 설명
r | 읽기모드 - 파일을 읽기만 할 때 사용 |
w | 쓰기모드 - 파일에 내용을 쓸 때 사용 |
a | 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용 |
f = open("C:/doit/새파일.txt", 'w') #'새파일'만들 경로 지정
f.close()
____파일을 쓰기 모드로 열어 내용 쓰기
# 파일을 쓰기 모드로 열고 데이터 작성하기
# 파일을 쓰기 모드('w')로 열기
# encoding="UTF-8": 한글 깨짐 방지를 위해 UTF-8로 인코딩 설정
f = open("C:/doit/새파일.txt", 'w', encoding="UTF-8")
# 1부터 10까지의 숫자를 반복하면서 파일에 문자열을 씀
for i in range(1, 11):
data = "%d번째 줄입니다.\\n" % i # 문자열을 생성하여 data에 할당
f.write(data) # 파일에 data를 씀
f.close() # 파일 닫기
*새파일 내용 : 1번째줄입니다. 2번째줄입니다. … 10번째줄입니다.
____파일을 읽는 여러 가지 방법
# 파일을 읽는 여러 가지 방법
**# 1. readline 함수 이용하기**
# 파일을 열어 첫 번째 줄을 읽어 출력하는 예제
f = open("C:/doit/새파일.txt", 'r')
line = f.readline() # 파일의 첫 번째 줄을 읽어옴
print(line) # 읽은 줄을 출력
f.close() # 파일을 닫음
'''1번째 줄입니다.'''
****
**# 2. readlines 함수 사용하기**
# 파일을 열어 모든 줄을 읽어서 리스트에 저장하고 출력하는 예제
#readlines 함수는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트를 리턴한다.
f = open("C:/doit/새파일.txt", 'r')
lines = f.readlines() # 파일의 모든 줄을 리스트에 저장
for line in lines: # 리스트에 저장된 각 줄을 출력
print(line)
f.close() # 파일을 닫음
'''["1 번째 줄입니다.\\n", "2 번째 줄입니다.\\n", ..., "10 번째 줄입니다.\\n"]'''
**# 3. read 함수 사용하기**
# 파일을 열어 내용 전체를 문자열로 읽어 출력하는 예제
f = open("C:/doit/새파일.txt", 'r')
data = f.read() # 파일의 전체 내용을 문자열로 저장
print(data) # 문자열을 출력
f.close() # 파일을 닫음
'''1번째 줄입니다.\\n', '2번째 줄입니다.\\n', '3번째 줄입니다.\\n', '4번째 줄입니다.\\n',
'5번째 줄입니다.\\n', '6번째 줄입니다.\\n', '7번째 줄입니다.\\n', '8번째 줄입니다.\\n',
'9번째 줄입니다.\\n', '10번째 줄입니다.\\n'''
**# 4. 파일 객체를 for문과 함께 사용하기**
# 파일을 열어 for문으로 각 줄을 읽어 출력하는 예제
f = open("C:/doit/새파일.txt", 'r')
for line in f: # 파일 객체를 직접 for문에 활용하여 각 줄을 읽어 출력
print(line)
f.close() # 파일을 닫음
'''1번째 줄입니다.\\n', '2번째 줄입니다.\\n', '3번째 줄입니다.\\n', '4번째 줄입니다.\\n',
'5번째 줄입니다.\\n', '6번째 줄입니다.\\n', '7번째 줄입니다.\\n', '8번째 줄입니다.\\n',
'9번째 줄입니다.\\n', '10번째 줄입니다.\\n'''
점프 투 파이썬 < 줄 바꿈(\\n) 문자 제거하기 >
파일을 읽을 때 줄 끝의 줄 바꿈(\\n) 문자를 제거하고 사용해야 할 경우가 많다. 다음처럼 strip 함수를 사용하면 줄 바꿈 문자를 제거할 수 있다.
f = open("C:/doit/새파일.txt", 'r')
lines = f.readlines()
**for** line **in** lines:
line = line.strip() # 줄 끝의 줄 바꿈 문자를 제거한다.
print(line)
f.close()
- line=line.strip(), 또는 line=line.replace(’\n’, ‘’) 을 넣어주면 줄 끝의 줄바꿈 문자를 제거한다.
____파일에 새로운 내용 추가하기
# adddata.py
f = open("C:/doit/새파일.txt",'a')
for i in range(11, 20):
data = "%d번째 줄입니다.\\n" % i
f.write(data)
f.close()
'''1번째 줄입니다.\\n', '2번째 줄입니다.\\n', ... , '19번째 줄입니다.\\n'''
____with 문과 함께 사용하기
with문을 사용하면 with 블록(with 문에 속해있는 문장)을 벗어나는 순간 열린 파일 객체 f가 자동으로 close된다.
f = open("foo.txt", 'w')
f.write("Life is too short, you need python")
f.close()
with open("foo.txt", "w")as f:
f.write("Life is too short, you need python")
'파이썬기초 > 파이썬기본개념2' 카테고리의 다른 글
[점프투파이썬] 03장 프로그램의 구조를 쌓는다! 제어문 [#파이썬공부기록-요약정리] (0) | 2023.11.22 |
---|---|
[점프투파이썬] 02장 파이썬 프로그래밍의 기초, 자료형 [#파이썬공부기록-요약정리] (0) | 2023.11.22 |