본문 바로가기

파이썬기초/파이썬기본개념2

[점프투파이썬] ## 04장 파이썬의 입출력 [#파이썬공부기록-요약정리]

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")