[TIL] 입력과 출력
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+b
와a*b
2개인데 결괏값을 받아들이는 변수는 result 하나만 쓰였으니 오류가 발생하지 않을까?- 하지만 오류는 발생하지 않음 그 이유는 함수의 결괏값은 2개가 아니라 언제나 1개라는 데 있음
- add_and_mul 함수의 결괏값
a+b
와a*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 명령어는 사용하지 않는 것이 좋음
- 가급적 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 자세히 알기
- 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라는 이름을 어디선가 들어봤던거 같은데 파이썬에서 사용되는 용어인지는 모르겠지만 이번에 람다에 대해서 알게되었다.