[Python] 3. 함수 정리 및 예제풀이
📢Key Words: 자료형, 제어문, 함수
점프 투 파이썬을 참고한 내용 정리
- https://wikidocs.net/11 해당 링크 참조
1. 함수
01. 함수
- 함수란 무엇인가?
- 입력값을 가지고 어떤 일을 수행한 다음에 그 결과물을 내어놓는 것
- 함수를 사용하는 이유는 무엇일까?
- 반복되는 부분이 있을 경우 “반복적으로 사용되는 가치 있는 부분”을 한 뭉치로 묶어서 “어떤 입력값을 주었을 때 어떤 결괏값을 돌려준다”라는 식의 함수로 작성하는 것이 현명하다.
- 프로그램 흐름을 일목요연하게 볼 수 있기 때문이다.
- 파이썬 함수의 구조
def 함수명(매개변수): <수행할 문장1> <수행할 문장2> ...
- 매개변수와 인수
- 매개변수(parameter)와 인수(arguments)는 혼용해서 사용되는 헷갈리는 용어이므로 잘 기억해 두자. 매개변수는 함수에 입력으로 전달된 값을 받는 변수를 의미하고 인수는 함수를 호출할 때 전달하는 입력값을 의미한다. ```python def add(a, b): # a, b는 매개변수 return a+b
print(add(3, 4)) # 3, 4는 인수 ```
- 입력값과 결괏값에 따른 함수의 형태
- 함수의 형태는 입력값과 결괏값의 존재 유무에 따라 4가지 유형으로 나뉜다.
- 일반적인 함수: 입력값이 있고 결괏값이 있는 함수
def 함수이름(매개변수): <수행할 문장> ... return 결과값
- 입력값이 없는 함수
>>> def say(): ... return 'Hi' ... >>>
- 결괏값이 없는 함수
>>> def add(a, b): ... print("%d, %d의 합은 %d입니다." % (a, b, a+b)) ... >>>
- print문은 함수의 구성 요소 중 하나인 <수행할 문장="">에 해당하는 부분일 뿐, 결괏값은 오직 return 명령어로만 돌려받을 수 있다.수행할>
- 입력값도 결괏값도 없는 함수
>>> def say(): ... print('Hi') ... >>>
- 매개변수 지정하여 호출하기
- 매개변수를 지정하면 다음과 같이 순서에 상관없이 사용할 수 있다는 장점이 있다.
>>> def add(a, b): ... return a+b ... >>> result = add(b=5, a=3) # b에 5, a에 3을 전달 >>> print(result) 8
- 매개변수를 지정하면 다음과 같이 순서에 상관없이 사용할 수 있다는 장점이 있다.
- 입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?
def 함수이름(*매개변수): <수행할 문장> ... >>> def add_many(*args): ... result = 0 ... for i in args: ... result = result + i ... return result ... >>>
- 매개변수 부분이 *매개변수로 바뀌었다.
- 입력값을 전부 모아서 튜플로 만들어 주기 때문이다
- args는 인수를 뜻하는 영어 단어 arguments의 약자이며 관례적으로 자주 사용한다.
>>> 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
- 키워드 파라미터 kwargs
- 매개변수 앞에 별 두 개(**)를 붙인다.
- 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결괏값이 그 딕셔너리에 저장된다.
>>> 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) result = (7, 12) >>> result1, result2 = add_and_mul(3, 4)
- a+b와 ab는 튜플값 하나인 (a+b, ab)로 돌려준다.
- result1, result2 = (7, 12)가 되어 result1은 7이 되고 result2는 12
- 특별한 상황일 때 함수를 빠져나가고 싶다면 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있다.
>>> def say_nick(nick): ... if nick == "바보": ... return ... print("나의 별명은 %s 입니다." % nick) ... >>>
- 매개변수에 초깃값 미리 설정하기
def say_myself(name, old, man=True): print("나의 이름은 %s 입니다." % name) print("나이는 %d살입니다." % old) if man: print("남자입니다.") else: print("여자입니다.") def say_myself(name, man=True, old): print("나의 이름은 %s 입니다." % name) print("나이는 %d살입니다." % old) if man: print("남자입니다.") else: print("여자입니다.")
- 매개변수에 초깃값을 미리 설정해 주는 경우
- 함수의 매개변수에 들어갈 값이 항상 변하는 것이 아닐 경우 유용
- 초기화시키고 싶은 매개변수를 항상 뒤쪽에 놓는 것을 잊지 말자.
- 함수 안에서 선언한 변수의 효력 범위
a = 1 def vartest(a): a = a +1 vartest(a) print(a) ::1
- 함수 안에서 새로 만든 매개변수는 함수 안에서만 사용하는 “함수만의 변수”이기 때문이다
- 함수 안에서 선언한 매개변수는 함수 안에서만 사용될 뿐 함수 밖에서는 사용되지 않는다.
- 함수 안에서 함수 밖의 변수를 변경하는 방법
- return 사용하기
a = 1 def vartest(a): a = a +1 return a a = vartest(a) print(a)
- global 명령어 사용하기
a = 1 def vartest(): global a a = a+1 vartest() print(a)
- global a 문장은 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻
- 함수는 독립적으로 존재하는 것이 좋기 때문이다. 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다. 프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋다
- return 사용하기
- lambda
>>> add = lambda a, b: a+b >>> result = add(3, 4) >>> print(result) 7
- lambda는 함수를 생성할 때 사용하는 예약어로 def와 동일한 역할
- def를 사용해야 할 정도로 복잡하지 않거나 def를 사용할 수 없는 곳에 주로 쓰인다.
- lambda 예약어로 만든 함수는 return 명령어가 없어도 결괏값을 돌려준다.
02. 사용자 입력 및 출력
- 사용자 입력
>>> a = input() Life is too short, you need python >>> a 'Life is too short, you need python' >>> >>> number = input("숫자를 입력하세요: ") 숫자를 입력하세요: 3 >>> print(number) 3 >>>
- input은 입력되는 모든 것을 문자열로 취급한다.
- 사용자에게 입력받을 때 “숫자를 입력하세요”라든지 “이름을 입력하세요”라는 안내 문구 또는 질문이 나오도록 하고 싶을 때가 있다. 그럴 때는 input()의 괄호 안에 질문을 입력하여 프롬프트를 띄워주면 된다.
- number는 숫자가 아닌 문자열임에 주의
- print 자세히 알기
- 큰따옴표(“)로 둘러싸인 문자열은 + 연산과 동일하다
>>> 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
03. 파일 읽고 쓰기
- 한 줄에 결괏값을 계속 이어서 출력하려면 매개변수 end를 사용해 끝 문자를 지정
- 큰따옴표(“)로 둘러싸인 문자열은 + 연산과 동일하다
- 파일 생성하기
f = open("새파일.txt", 'w') f.close()
- 프로그램을 실행한 디렉터리에 새로운 파일이 하나 생성
- 파이썬 내장 함수 open을 사용했다. open 함수는 다음과 같이 “파일 이름”과 “파일 열기 모드”를 입력값으로 받고 결괏값으로 파일 객체를 돌려준다.
-
파일열기모드 설명 r 읽기모드 - 파일을 읽기만 할 때 사용 w 쓰기모드 - 파일에 내용을 쓸 때 사용 a 추가모드 - 파일의 마지막에 새로운 내용을 추가 시킬 때 사용 - 쓰기 모드로 열면 해당 파일이 이미 존재할 경우 원래 있던 내용이 모두 사라지고, 해당 파일이 존재하지 않으면 새로운 파일이 생성
- f.close()는 열려 있는 파일 객체를 닫아 주는 역할. 생략해도 된다.
- 하지만 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려고 하면 오류가 발생하기 때문. close()를 사용해서 열려 있는 파일을 직접 닫아 주는 것이 좋다.
"C:/doit/새파일.txt"
를 \n과 같은 이스케이프 문자가 있을 경우 줄바꿈 문자로 해석, 역슬래시()를 사용한다면"C:\\doit\\새파일.txt"
처럼 역슬래시를 2개 사용하거나r"C:\doit\새파일.txt"
와 같이 문자열 앞에 r 문자(Raw String)를 덧붙여 사용해야 한다.
- 파일을 쓰기 모드로 열어 출력값 적기
# writedata.py f = open("C:/doit/새파일.txt", 'w') for i in range(1, 11): data = "%d번째 줄입니다.\n" % i f.write(data) f.close() #vs for i in range(1, 11): data = "%d번째 줄입니다.\n" % i print(data)
- 두 번째 방법은 우리가 계속 사용해 왔던 모니터 화면에 출력하는 방법이고, 첫 번째 방법은 모니터 화면 대신 파일에 결괏값을 적는 방법
- 프로그램의 외부에 저장된 파일을 읽는 여러 가지 방법
- readline 함수 이용하기
# readline_test.py f = open("C:/doit/새파일.txt", 'r') line = f.readline() print(line) f.close() #vs f = open("C:/doit/새파일.txt", 'r') while True: line = f.readline() if not line: break print(line) f.close()
- readline()을 사용해서 파일의 첫 번째 줄을 읽어 출력
- while True: 무한 루프 안에서 f.readline()을 사용해 파일을 계속해서 한 줄씩 읽어 들이면 모든 문장을 읽을 수 있다.
- readline()은 더 이상 읽을 줄이 없을 경우 빈 문자열(‘‘)을 리턴한다.
- readlines 함수 사용하기
- readlines 함수는 파일의 모든 줄을 읽어서 각각의 줄을 요소로 갖는 리스트로 돌려준다.
- 줄 바꿈(\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()는 파일의 내용 전체를 문자열로 돌려준다
- readline 함수 이용하기
- 파일에 새로운 내용 추가하기
f = open("C:/doit/새파일.txt",'a') for i in range(11, 20): data = "%d번째 줄입니다.\n" % i f.write(data) f.close()
- 원래 있던 값을 유지하면서 단지 새로운 값만 추가해야 할 경우도 있다. 이런 경우에는 파일을 추가 모드(‘a’)로 열면 된다.
- 새파일.txt 파일을 추가 모드(‘a’)로 열고 write를 사용해서 결괏값을 기존 파일에 추가해 적는 예이다.
- with문과 함께 사용하기
f = open("foo.txt", 'w') f.write("Life is too short, you need python") f.close() #vs with open("foo.txt", "w") as f: f.write("Life is too short, you need python")
- 파일을 열고 닫는 것을 자동으로 처리
-
with 블록을 벗어나는 순간 열린 파일 객체 f가 자동으로 close
- sys 모듈로 매개변수 주기
import sys args = sys.argv[1:] for i in args: print(i) #출력값 C:\doit>python sys1.py aaa bbb ccc aaa bbb ccc
sys 모듈
- argv[0]은 파일 이름 sys1.py가 되고 argv[1]부터는 뒤에 따라오는 인수가 차례로 argv의 요소가 된다.
04. 연습문제
Summary
보완점
- 문자열을 자동으로 끊어서 받을 수 있나?
- 자료형 별 함수 구분
개인 공부 기록용 블로그 입니다.