4-1. 함수

함수란 무엇인가?

  • 함수는 믹서기와 비슷함
  • 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것, 이것이 바로 함수가 하는 일

함수를 사용하는 이유는 무엇일까?

  • 프로그래밍을 하다 보면 똑같은 내용을 반복해서 작성할 때가 있음
  • 반복되는 부분이 있을 경우 “반복적으로 사용되는 가치 있는 부분”을 한 뭉치로 묶어서 “어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다”라는 식의 함수로 작성하는 것이 현명함
  • 자신이 만든 프로그램을 함수화하면 프로그램 흐름을 일목요연하게 볼 수 있기 때문
  • 프로그램 흐름도 잘 파악할 수 있고 오류가 어디에서 나는지도 바로 알아차릴 수 있다. 함수를 잘 사용하고 함수를 적절하게 만들 줄 아는 사람이 능력 있는 프로그래머이다.

파이썬 함수의 구조

def 함수명(매개변수):
    <수행할 문장1>
    <수행할 문장2>
    ...
  • def는 함수를 만들 때 사용하는 예약어
  • 함수 이름은 함수를 만드는 사람이 임의로 만들 수 있음
  • 함수 이름 뒤 괄호 안의 매개변수는 이 함수에 입력으로 전달되는 값을 받는 변수
>>> def add(a, b):
...     return a+b
...
>>>

이 함수의 이름(함수 이름)은 add이고 입력으로 2개의 값을 받으며 결괏값은 2개의 입력값을 더한 값

  • return은 함수의 결괏값을 돌려주는 명령어

  • add 함수를 사용 예

>>> a = 3
>>> b = 4
>>> c = add(a, b)
>>> print(c)
7

매개변수와 인수

  • 매개변수(parameter)인수(arguments)는 혼용해서 사용되는 헷갈리는 용어이므로 잘 기억하자!!
    • 매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미
    • 인수는 함수를 호출할 때 전달하는 입력값을 의미
def add(a, b):  # a, b는 매개변수
    return a+b

print(add(3, 4))  # 3, 4는 인수

입력값과 결괏값에 따른 함수의 형태

  • 함수는 들어온 입력값을 받아 어떤 처리를 하여 적절한 결괏값을 돌려줌

입력값 —> 함수 —-> 결괏값

  • 함수의 형태는 입력값과 결괏값의 존재 유무에 따라 4가지 유형으로 나뉨

일반적인 함수

  • 입력값이 있고 결괏값이 있는 함수가 일반적인 함수
def 함수이름(매개변수):
    <수행할 문장>
    ...
    return 결과값

일반 함수의 전형적인 예

def add(a, b): 
    result = a + b 
    return result
  • add 함수는 2개의 입력값을 받아서 서로 더한 결괏값을 돌려줌

  • 이 함수를 사용하는 방법

    • 입력값으로 3과 4를 주고 결괏값을 돌려줌
>>> a = add(3, 4)
>>> print(a)
7

결괏값을 받을 변수 = 함수이름(입력인수1, 입력인수2, …)

입력값이 없는 함수

>>> def say(): 
...     return 'Hi' 
... 
>>>
  • say라는 이름의 함수
    • 매개변수 부분을 나타내는 함수 이름 뒤의 괄호 안이 비어 있음
  • 이 함수를 사용하는 방법
>>> a = say()
>>> print(a)
Hi
  • a = say()처럼 작성하면 a에 Hi 문자열이 대입됨

결괏값을 받을 변수 = 함수이름()

결괏값이 없는 함수

>>> def add(a, b): 
...     print("%d, %d의 합은 %d입니다." % (a, b, a+b))
... 
>>>
  • 결괏값이 없는 함수는 호출해도 돌려주는 값이 없기 때문에 다음과 같이 사용함
>>> add(3, 4)
3, 4 합은 7입니다.

함수이름(입력인수1, 입력인수2, …)

  • 결괏값은 오직 return 명령어로만 돌려받을 수 있음

  • 돌려받을 값을 a 변수에 대입하여 출력해 보면 결괏값이 있는지 없는지 알 수 있음

>>> a = add(3, 4)
>>> print(a)
None

입력값도 결괏값도 없는 함수

>>> def say(): 
...     print('Hi')
... 
>>>
  • 입력 인수를 받는 매개변수도 없고 return문도 없으니 입력값도 결괏값도 없는 함수

  • 이 함수를 사용하는 방법은 단 한 가지

>>> say()
Hi

함수이름()

매개변수 지정하여 호출하기

  • 함수를 호출할 때 매개변수를 지정할 수도 있음
>>> def add(a, b):
...     return a+b
... 
  • 매개변수를 지정하여 사용할 수 있음
>>> result = add(a=3, b=7)  # a에 3, b에 7을 전달
>>> print(result)
10
  • 매개변수를 지정하면 다음과 같이 순서에 상관없이 사용할 수 있다는 장점이 있음
>>> result = add(b=5, a=3)  # b에 5, a에 3을 전달
>>> print(result)
8

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

여러 개의 입력값을 받는 함수 만들기

  • 예를 들어 add_many(1, 2)이면 3을, add_many(1,2,3)이면 6을, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이면 55를 돌려주는 함수
>>> def add_many(*args): 
...     result = 0 
...     for i in args: 
...         result = result + i 
...     return result 
... 
>>>
  • add_many() 함수는 입력값이 몇 개이든 상관이 없음
    • *args처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어 줌
    • add_many(1, 2, 3)처럼 이 함수를 쓰면 args는 (1, 2, 3)이 되고, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)처럼 쓰면 args는 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이 됨
    • *args는 임의로 정한 변수 이름, *pey, *python처럼 아무 이름이나 써도됨

args는 매개변수를 뜻하는 영어 단어 arguments의 약자이며 관례적으로 자주 사용함

  • 이 함수를 직접 실행한 경우
>>> 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_many(1,2,3)으로 함수를 호출하면 6을 돌려주고, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9,10)을 대입하면 55를 돌려줌

  • 여러 개의 입력을 처리할 때 def add_many(*args)처럼 함수의 매개변수로 *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 
... 
>>>
  • add_mul 함수는 여러 개의 입력값을 의미하는 *args 매개변수 앞에 choice 매개변수가 추가되어 있음
  • 이 함수는 다음과 같이 사용할 수 있음
>>> result = add_mul('add', 1,2,3,4,5)
>>> print(result)
15
>>> result = add_mul('mul', 1,2,3,4,5)
>>> print(result)
120
  • 매개변수 choice에 ‘add’가 입력된 경우 *args에 입력되는 모든 값을 더해서 15를 돌려주고, ‘mul’이 입력된 경우 *args에 입력되는 모든 값을 곱해서 120을 돌려줌

키워드 파라미터 kwargs

  • 키워드 파라미터를 사용할 때는 매개변수 앞에 별 두 개(**)를 붙임
>>> def print_kwargs(**kwargs):
...     print(kwargs)
...
  • print_kwargs 함수는 매개변수 kwargs를 출력하는 함수
>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'age': 3, 'name': 'foo'}
  • 입력값 a=1 또는 name='foo', age=3이 모두 딕셔너리로 만들어져서 출력된다는 것을 확인할 수 있음
    • **kwargs처럼 매개변수 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장됨

여기에서 kwargs는 keyword arguments의 약자이며 args와 마찬가지로 관례적으로 사용함

함수의 결괏값은 언제나 하나이다

>>> def add_and_mul(a,b): 
...     return a+b, a*b

add_and_mul 함수는 2개의 입력 인수를 받아 더한 값과 곱한 값을 돌려주는 함수

  • 이 함수를 다음과 같이 호출하면 어떻게 될까?
>>> result = add_and_mul(3,4)
  • 결괏값은 a+ba*b 2개인데 결괏값을 받아들이는 변수는 result 하나만 쓰였으니 오류가 발생하지 않을까?
    • 하지만 오류는 발생하지 않음 그 이유는 함수의 결괏값은 2개가 아니라 언제나 1개라는 데 있음
    • add_and_mul 함수의 결괏값 a+ba*b는 튜플값 하나인 (a+b, a*b)로 돌려줌
  • 따라서 result 변수는 다음과 같은 값을 갖게 됨
result = (7, 12)
  • 결괏값으로 (7, 12)라는 튜플 값을 갖게됨

  • 이 하나의 튜플 값을 2개의 결괏값처럼 받고 싶다면 다음과 같이 함수를 호출하면됨

>>> result1, result2 = add_and_mul(3, 4)
  • 이렇게 호출하면 result1, result2 = (7, 12)가 되어 result1은 7이 되고 result2는 12가됨
>>> def add_and_mul(a,b): 
...     return a+b 
...     return a*b 
... 
>>>
  • 위와 같이 return문을 2번 사용하면 2개의 결괏값을 돌려주지 않을까?
>>> result = add_and_mul(2, 3)
>>> print(result)
5

add_and_mul(2, 3)의 결괏값은 5 하나뿐임
두 번째 return문인 return a*b는 실행되지 않음

  • 두 번째 return문인 return a*b는 실행되지 않음
    • 따라서 이 함수는 다음과 완전히 동일함
>>> def add_and_mul(a,b): 
...     return a+b 
... 
>>>
  • 함수는 return문을 만나는 순간 결괏값을 돌려준 다음 함수를 빠져나감

return의 또 다른 쓰임새

  • 특별한 상황일 때 함수를 빠져나가고 싶다면 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있음
>>> def say_nick(nick): 
...     if nick == "바보": 
...         return 
...     print("나의 별명은 %s 입니다." % nick)
... 
>>>
  • 위 함수는 ‘별명’을 입력으로 전달받아 출력하는 함수
  • 이 함수 역시 반환 값(결괏값)은 없음
  • 만약에 입력값으로 ‘바보’라는 값이 들어오면 문자열을 출력하지 않고 함수를 즉시 빠져나감
>>> say_nick('야호')
나의 별명은 야호입니다.
>>> say_nick('바보')
>>>
  • return으로 함수를 빠져나가는 방법은 실제 프로그래밍에서 자주 사용됨

매개변수에 초깃값 미리 설정하기

def say_myself(name, old, man=True): 
    print("나의 이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % old) 
    if man: 
        print("남자입니다.")
    else: 
        print("여자입니다.")

say_myself 함수는 3개의 매개변수를 받아서 마지막 인수인 man이 True이면 “남자입니다.”, False이면 “여자입니다.”를 출력함

  • 위 함수를 보면 매개변수가 name, old, man=True 3개
  • man=True처럼 매개변수에 미리 값을 넣어 준 것
    • 이것이 바로 함수의 매개변수 초깃값을 설정하는 방법
  • 함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 이렇게 함수의 초깃값을 미리 설정해 두면 유용

  • say_myself 함수는 다음처럼 사용할 수 있음
say_myself("박응용", 27)
say_myself("박응용", 27, True)
  • 입력값으로 “박응용”, 27처럼 2개를 주면 name에는 “박응용”이 old에는 27이 대입됨, 그리고 man이라는 변수에는 입력값을 주지 않았지만 초깃값 True를 갖게 됨

  • 위 예에서 함수를 사용한 2가지 방법은 모두 동일한 결과를 출력함

나의 이름은 박응용입니다.
나이는 27살입니다.
남자입니다.
  • 초깃값이 설정된 부분을 False로 바꾼 경우
say_myself("박응선", 27, False)
  • man 변수에 False 값이 대입되어 다음과 같은 결과가 출력됨
나의 이름은 박응선입니다.
나이는 27살입니다.
여자입니다.

함수의 매개변수에 초깃값을 설정할 때 주의할 점

def say_myself(name, man=True, old): 
    print("나의 이름은 %s 입니다." % name) 
    print("나이는 %d살입니다." % old) 
    if man: 
        print("남자입니다.") 
    else: 
        print("여자입니다.")
  • 이전 함수와 바뀐 부분은 초깃값을 설정한 매개변수의 위치
    • 이것은 함수를 실행할 때 오류가 발생함
say_myself("박응용", 27)
  • 위와 같이 함수를 호출한다면 name 변수에는 “박응용”이 들어감
  • 파이썬 인터프리터는 27을 man 변수와 old 변수 중 어느 곳에 대입해야 할지 알 수 없음
  • 오류 메시지를 보면 다음과 같음
SyntaxError: non-default argument follows default argument
  • 위 오류 메시지는 초깃값을 설정해 놓은 매개변수 뒤에 초깃값을 설정해 놓지 않은 매개변수는 사용할 수 없다는 뜻
  • 매개변수로 (name, old, man=True)는 되지만 (name, man=True, old)는 안됨
  • 초기화시키고 싶은 매개변수를 항상 뒤쪽에 놓아야 함

함수 안에서 선언한 변수의 효력 범위

# vartest.py

a = 1
def vartest(a):
    a = a +1

vartest(a)
print(a)
  • 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 “함수만의 변수”임
  • def vartest(a)에서 입력값을 전달받는 매개변수 a는 함수 안에서만 사용하는 변수이지 함수 밖의 변수 a가 아님

  • 따라서 vartest 함수는 다음처럼 변수 이름을 hello로 한 vartest 함수와 완전히 동일함
def vartest(hello):
    hello = hello + 1
  • 함수 안에서 사용하는 매개변수는 함수 밖의 변수 이름과는 전혀 상관이 없음
# vartest_error.py

def vartest(a):
    a = a + 1

vartest(3)
print(a)
  • vartest(3)을 수행하면 vartest 함수 안에서 a는 4가 되지만 함수를 호출하고 난 뒤에 print(a) 문장은 오류가 발생하게됨
    • print(a)에서 입력받아야 하는 a 변수를 어디에서도 찾을 수가 없기 때문임
  • 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않음

함수 안에서 함수 밖의 변수를 변경하는 방법

  • vartest라는 함수를 사용해서 함수 밖의 변수 a를 1만큼 증가시키는 법

1. return 사용하기

# vartest_return.py

a = 1 
def vartest(a): 
    a = a +1 
    return a

a = vartest(a) 
print(a)
  • a = vartest(a)라고 대입하면 a가 vartest 함수의 결괏값으로 바뀜
  • vartest 함수 안의 a 매개변수는 함수 밖의 a와는 다른 것

2. global 명령어 사용하기

# vartest_global.py

a = 1 
def vartest(): 
    global a 
    a = a+1

vartest() 
print(a)
  • vartest 함수 안의 global a 문장은 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻임
    • 하지만 프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋음
      • 왜냐하면 함수는 독립적으로 존재하는 것이 좋음
      • 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아님
  • 가급적 global 명령어를 사용하는 이 방법은 피하고 return 방법을 사용하는게 좋음

lambda

  • lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할을 함
  • 보통 함수를 한줄로 간결하게 만들 때 사용
  • 람다라고 읽고 def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로씀

lambda 매개변수1, 매개변수2, … : 매개변수를 이용한 표현식

>>> add = lambda a, b: a+b
>>> result = add(3, 4)
>>> print(result)
7
  • add는 두 개의 인수를 받아 서로 더한 값을 돌려주는 lambda 함수
  • 위 예제는 def를 사용한 다음 함수와 하는 일이 완전히 동일함
>>> def add(a, b):
...     return a+b
...
>>> result = add(3, 4)
>>> print(result)
7

lambda 예약어로 만든 함수는 return 명령어가 없어도 결괏값을 돌려줌

4-2. 사용자 입력과 출력

사용자 입력

input( )의 사용

>>> a = input()
Life is too short, you need python
>>> a
'Life is too short, you need python'
>>>
  • input은 입력되는 모든 것을 문자열로 취급함

프롬프트를 띄워서 사용자 입력 받기

  • 입력받을 때 “숫자를 입력하세요” or “이름을 입력하세요”라는 안내 문구 또는 질문이 나오도록 하고 싶을 때
    • input()의 괄호 안에 질문을 입력하여 프롬프트를 띄워주면 됨

input(“질문 내용”)

>>> number = input("숫자를 입력하세요: ")
숫자를 입력하세요:
  • 숫자를 입력하라는 프롬프트에 3을 입력하면 변수 number에 3이 대입됨
>>> number = input("숫자를 입력하세요: ")
숫자를 입력하세요: 3
>>> print(number)
3
>>>
  • input은 입력되는 모든 것을 문자열로 취급하기 때문에 number는 숫자가 아닌 문자열임에 주의!!
>>> type(number)
<class 'str'>
>>>
  • print문이 수행해 온 일은 우리가 입력한 자료형을 출력하는 것
>>> a = 123
>>> print(a)
123
>>> a = "Python"
>>> print(a)
Python
>>> a = [1, 2, 3]
>>> print(a)
[1, 2, 3]

큰따옴표(“)로 둘러싸인 문자열은 + 연산과 동일하다

>>> print("life" "is" "too short") # ①
lifeistoo short
>>> print("life"+"is"+"too short") # ②
lifeistoo short
  • ①과 ②는 완전히 동일한 결괏값을 출력함
    • 즉 따옴표로 둘러싸인 문자열을 연속해서 쓰면 + 연산을 한 것과 같음

문자열 띄어쓰기는 콤마로 한다

>>> print("life", "is", "too short")
life is too short
  • 콤마(,)를 사용하면 문자열 사이에 띄어쓰기를 할 수 있음

한 줄에 결괏값 출력하기

  • 한 줄에 결괏값을 계속 이어서 출력하려면 매개변수 end를 사용해 끝 문자를 지정해야함
>>> for i in range(10):
...     print(i, end=' ')
...
0 1 2 3 4 5 6 7 8 9

4-3. 파일 읽고 쓰기

파일 생성하기

  • 다음 소스 코드를 에디터로 작성해서 저장한 후 실행하면 프로그램을 실행한 디렉터리에 새로운 파일이 하나 생성된 것을 확인할 수 있음
f = open("새파일.txt", 'w')
f.close()
  • 파일을 생성하기 위해 우리는 파이썬 내장 함수 open()을 사용함
  • open() 함수는 다음과 같이 “파일 이름”과 “파일 열기 모드”를 입력값으로 받고 결괏값으로 파일 객체를 돌려

파일 객체 = open(파일 이름, 파일 열기 모드)

파일 열기 모드

파일열기모드 설명
r 읽기모드 - 파일을 읽기만 할 때 사용
w 쓰기모드 - 파일에 내용을 쓸 때 사용
a 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용
  • 파일을 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성됨
  • 위 예에서는 디렉터리에 파일이 없는 상태에서 새파일.txt를 쓰기 모드인 ‘w’로 열었기 때문에 새파일.txt라는 이름의 새로운 파일이 현재 디렉터리에 생성됨

  • 만약 새파일.txt 파일을 C:/doit 디렉터리에 생성하고 싶다면 다음과 같이 작성해야 함
f = open("C:/doit/새파일.txt", 'w')
f.close()
  • f.close()는 열려 있는 파일 객체를 닫아 주는 역할을 함
    • 이 문장은 생략해도 됨, 프로그램을 종료할 때 파이썬 프로그램이 열려 있는 파일의 객체를 자동으로 닫아줌
    • 하지만 close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋음
      • 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생함

파일 경로와 슬래시(/)

  • 파이썬 코드에서 파일 경로를 표시할 때 "C:/doit/새파일.txt" 처럼 슬래시(/)를 사용할 수 있음
  • 만약 역슬래시(\)를 사용한다면 "C:\\doit\\새파일.txt" 처럼 역슬래시를 2개 사용하거나 r"C:\doit\새파일.txt"와 같이 문자열 앞에 r 문자(Raw String)를 덧붙여 사용해야 함
    • 왜냐하면 "C:\note\test.txt"처럼 파일 경로에 \n과 같은 이스케이프 문자가 있을 경우 줄바꿈 문자로 해석되어 의도했던 파일 경로와 달라질 수 있음

파일을 쓰기 모드로 열어 출력값 적기

# writedata.py

f = open("C:/doit/새파일.txt", 'w')
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i
    print(data)
  • 첫 번째 방법은 모니터 화면 대신 파일에 결괏값을 적는 방법
  • 두 번째 방법은 우리가 계속 사용해 왔던 모니터 화면에 출력하는 방법
  • 두 방법의 차이점은 print 대신 파일 객체 f의 write 함수를 사용한 것 말고는 없음

  • 명령 프롬프트 창에서 첫 번째 예제를 실행
C:\Users> cd C:\doit
C:\doit>python writedata.py
C:\doit>
  • 이 프로그램을 실행한 C:/doit 디렉터리를 살펴보면 새파일.txt 파일이 생성되었음을 확인할수 있음
1 번째 줄입니다.
2 번째 줄입니다.
3 번째 줄입니다.
4 번째 줄입니다.
5 번째 줄입니다.
6 번째 줄입니다.
7 번째 줄입니다.
8 번째 줄입니다.
9 번째 줄입니다.
10 번째 줄입니다.

프로그램의 외부에 저장된 파일을 읽는 여러 가지 방법

readline 함수 이용하기

# readline_test.py

f = open("C:/doit/새파일.txt", 'r')
line = f.readline()
print(line)
f.close()
  • f.open("새파일.txt", 'r')로 파일을 읽기 모드로 연 후 readline()을 사용해서 파일의 첫 번째 줄을 읽어 출력하는 경우
  • 앞에서 만든 새파일.txt를 수정하거나 지우지 않았다면 위 프로그램을 실행했을 때 새파일.txt의 가장 첫 번째 줄이 화면에 출력됨
1번째 줄입니다.
  • 만약 모든 줄을 읽어서 화면에 출력하고 싶다면 다음과 같이 작성하면됨
# readline_all.py

f = open("C:/doit/새파일.txt", 'r')
while True:
    line = f.readline()
    if not line: break
    print(line)
f.close()
  • while True: 무한 루프 안에서 f.readline()을 사용해 파일을 계속해서 한 줄씩 읽음
  • 만약 더 이상 읽을 줄이 없으면 break를 수행(readline()은 더 이상 읽을 줄이 없을 경우 빈 문자열(‘‘)을 리턴함)

※ 한 줄 씩 읽어 출력할 때 줄 끝에 \n 문자가 있으므로 빈 줄도 같이 출력된다.

while True:
    data = input()
    if not data: break
    print(data)
  • 위 예는 사용자의 입력을 받아서 그 내용을 출력하는 경우
  • 첫 번째 예는 파일을 사용한 입력 방법
  • 두 번째 예는 키보드를 사용한 입력 방법

readlines 함수 사용하기

f = open("C:/doit/새파일.txt", 'r')
lines = f.readlines()
for line in lines:
    print(line)
f.close()
  • readlines() 함수는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트로 돌려
  • lines는 리스트 ["1 번째 줄입니다.\n", "2 번째 줄입니다.\n", ..., "10 번째 줄입니다.\n"]가 됨
  • f.readlines()에서 f.readline()과는 달리 s가 하나 더 붙어 있음에 유의!!

줄 바꿈(\n) 문자 제거하기

  • 파일을 읽을 때 줄 끝의 줄 바꿈(\n) 문자를 제거하고 사용해야 할 경우가 많음
  • strip() 함수를 사용하면 줄 바꿈 문자를 제거할 수 있음
f = open("C:/doit/새파일.txt", 'r')
lines = f.readlines()
for line in lines:
    line = line.strip()  # 줄 끝의 줄 바꿈 문자를 제거한다.
    print(line)
f.close()

read 함수 사용하기

f = open("C:/doit/새파일.txt", 'r')
data = f.read()
print(data)
f.close()
  • f.read()는 파일의 내용 전체를 문자열로 돌려줌
  • data는 파일의 전체 내용

파일에 새로운 내용 추가하기

  • 쓰기 모드(‘w’)로 파일을 열 때 이미 존재하는 파일을 열면 그 파일의 내용이 모두 사라짐
  • 원래 있던 값을 유지하면서 단지 새로운 값만 추가해야 할 경우 파일을 추가 모드(‘a’)로 열면됨
# adddata.py

f = open("C:/doit/새파일.txt",'a')
for i in range(11, 20):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()
  • 위 예는 새파일.txt 파일을 추가 모드(‘a’)로 열고 write를 사용해서 결괏값을 기존 파일에 추가해 적는 예임
  • 추가 모드로 파일을 열었기 때문에 새파일.txt 파일이 원래 가지고 있던 내용 바로 다음부터 결괏값을 적기 시작함

with문과 함께 사용하기

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")
  • with문을 사용하면 with 블록을 벗어나는 순간 열린 파일 객체 f가 자동으로 close되어 편리함

sys 모듈로 매개변수 주기

C:\> type a.txt
  • type 명령어는 바로 뒤에 적힌 파일 이름을 인수로 받아 그 내용을 출력해 주는 명령 프롬프트 명령어
  • 대부분의 명령 프롬프트 명령어는 다음과 같이 명령행(명령 프롬프트 창)에서 매개변수를 직접 주어 프로그램을 실행하는 방식을 따름

명령 프롬프트 명령어 [인수1 인수2 …]

  • 파이썬에서는 sys 모듈을 사용하여 매개변수를 직접 줄 수있음
  • sys 모듈을 사용하려면 아래 예의 import sys처럼 import 명령어를 사용해야함
# sys1.py

import sys

args = sys.argv[1:]
for i in args:
    print(i)
  • 위 예는 입력받은 인수를 for문을 사용해 차례대로 하나씩 출력하는 예
  • sys 모듈의 argv는 명령 창에서 입력한 인수를 의미함
  • argv[0]은 파일 이름 sys1.py가 되고 argv[1]부터는 뒤에 따라오는 인수가 차례로 argv의 요소가 됨

  • 이 프로그램을 C:\doit 디렉터리에 저장한 후 매개변수를 함께 주어 실행하면 다음과 같은 결괏값을 얻음
C:\doit>python sys1.py aaa bbb ccc
aaa
bbb
ccc
# sys2.py
import sys
args = sys.argv[1:]
for i in args:
    print(i.upper(), end=' ')
  • 문자열 관련 함수인 upper()를 사용하여 명령 행에 입력된 소문자를 대문자로 바꾸어주는 프로그램
C:\doit>python sys2.py life is too short, you need python
LIFE IS TOO SHORT, YOU NEED PYTHON

느낀점

  • 함수의 입력값과 결괏값에 따른 함수의 4가지 유형을 파악할 수 있었고 함수 매개변수에 초기값 설정하는 부분의 순서를 지키지 않을 경우 오류가 발생한다는 사실은 처음 알게되었다.
  • lambda라는 이름을 어디선가 들어봤던거 같은데 파이썬에서 사용되는 용어인지는 모르겠지만 이번에 람다에 대해서 알게되었다.

reference

점프 투 파이썬