4주차 과제
기본미션 : p.223[직전 해보는 손코딩: 범위 내부의 정수를 모두 더하는 함수] 실행 후 코드가 입력된 화면 및 실행 결과 화면 인증샷
함수 : 코드의 집합
함수를 사용한다 = 함수를 호출한다
def print_3_times():
print("안녕하세요")
print("안녕하세요")
print("안녕하세요")
print_3_times()
매개변수 : 함수를 호출할 때 괄호 내부에 넣는 여러 자료 값
def print_n_times(value, n):
for i in range(n):
print(value)
print_n_times("안녕", 5)
매개변수와 관련된 TypeError : 요청한 매개변수와 숫자가 일치하지 않으면 오류 발생
def print_n_times(value, n):
for i in range(n):
print(value)
print_n_times("안녕", 5, 10)
가변 매개변수 : print() 함수와 같이 매개변수를 원하는 만큼 받을 수 있는 함수
def print_n_times(n, *values):
# n번 반복
for i in range(n):
#values는 리스트처럼 활용
for value in values:
print(value)
#단순 줄바꿈
print()
#함수 호출
print_n_times(3, "안녕하세요", "즐거운", "파이썬 프로그래밍")
-> 가변 매개변수 뒤에는 일반 매개변수가 올 수 없다. 위의 예제에서 n을 아픙로 옮기고 매개변수 *values를 뒤로 밀었다. *values는 리스트처럼 사용하면 된다
기본 매개변수 : '매개변수=값' 형태로 되어있고, 매개변수를 입력하지 않았을 경우 매개변수에 들어가는 기본 값. 기본 매개변수 뒤에는 일반 매개변수가 올 수 없다
def print_n_times(value, n=2):
#n번 반복한다
for i in range(n):
print(value)
#함수를 호출
print_n_times("안녕하세요")
-> 기본 매개변수 뒤에 일반 매개변수를 오지 못하게 막은 이유 : 만약 print_n_times(n=2, value) 형태로 사용할 수 있다면 print_n_times("안녕하세요")라고 입력했을 때, "안녕하세요"라는 글자가 첫번째 매개변수에 할당되어야 하는지 두번째 매개변수에 할당되어야 하는지 확실하게 알 수 없다. 그래서 파이썬 프로그래밍 언어는 내부적으로 기본 매개변수 뒤에 일반 매개변수가 오지 못하게 막은 것이다.
키워드 매개변수 : 가변 매개변수와 기본 매개변수 둘다 사용하는 방법
1) 기본 매개변수가 가변 매개변수보다 앞에 올 때
def print_n_times(n=2, *values):
#n번 반복
for i in range(n):
#values는 리스트처럼 활용
for value in values:
print(value)
#단순한 줄바꿈
print()
# 함수를 호출 print_n_times("안녕","즐거운","파이썬")
-> 위의 예제에서 n에는 매개변수가 순서대로 입력되므로 n에는 "안녕"이 들어가고, values에는 ["즐거운", "파이썬"]이 들어간다. 그런데 range() 함수의 매개변수에는 숫자만 들어올 수 있으므로 TypeError 에러가 발생한다. 따라서 기본 매개변수는 가변 매개변수 앞에 써도 의미가 없다
2) 가변 매개변수가 기본 매개변수보다 앞에 올 때
def print_n_times(*values, n=2):
#n번 반복
for i in range(n):
#values는 리스트처럼 활용
for value in values:
print(value)
#단순한 줄바꿈
print()
# 함수를 호출
print_n_times("안녕","즐거운","파이썬", 3)
3) 키워드 매개변수
def print_n_times(*values, n=2):
#n번 반복
for i in range(n):
#values는 리스트처럼 활용
for value in values:
print(value)
#단순한 줄바꿈
print()
# 함수를 호출
print_n_times("안녕","즐거운","파이썬",n=3)
-> n=" "과 같은 형식으로 매개변수 이름을 직접적으로 지정해서 값을 입력해 줌
키워드 매개변수 사용 예)
기본 매개변수 중에서 필요한 값만 입력할 때
def test(a, b=10, c=100):
print(a+b+c)
#1) 기본 형태
test(10,20,30)
#2) 키워드 매개변수로 모든 매개변수를 지정한 형태
test(a=10, b=100, c=200)
#3) 키워드 매개변수로 모든 매개변수를 마구잡이로 지정한 형태
test(c=10, a=100, b=200)
#4) 키워드 매개변수로 일부 매개변수만 지정한 형태
test(10, c=200)
리턴값 : 함수를 호출해서 최종적으로 나오는 결과
1) 자료없이 리턴하기
def return_test():
print("A 위치입니다")
return print("B 위치입니다")
return_test()
-> return 키워드를 만나는 순간 함수가 종료됨. 결과적으로 "A 위치입니다" 만 출력
2) 자료와 함께 리턴하기
def return_test():
return 100
value = return_test()
print(value)
-> 리턴 뒤에 자료를 입력하면 자료를 가지고 리턴함. 결과로 100이 출력됨
3) 아무것도 리턴하지 않기
def return_test():
return value = return_test()
print(value)
-> None을 출력함.
기본적인 함수의 활용
1) 범위 내부의 정수를 모두 더하는 함수
def sum_all(start, end):
output = 0
for i in range(start, end+1):
output += i
return output
print("0 to 100:", sum_all(0,100))
print("0 to 1000:", sum_all(0,1000))
print("50 to 100:", sum_all(50,100))
print("500 to 1000:", sum_all(500,1000))
2) 기본 매개변수와 키워드 매개변수를 활용해 범위의 정수를 더하는 함수
def sum_all(start=0, end=100, step=1):
output = 0
for i in range(start, end+1, step):
output += i
return output
print("A:", sum_all(0,100,10))
print("B:", sum_all(end=100))
print("C:", sum_all(end=100, step=2))
재귀 함수 : '자기 자신을 호출'
1) 반복문으로 팩토리얼
def factorial(n):
output =1
for i in range(1, n+1):
output *= i
return output
print("1!:", factorial(1))
print("2!:", factorial(2))
print("3!:", factorial(3))
print("4!:", factorial(4))
print("5!:", factorial(5))
2) 재귀함수로 팩토리얼
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
print("1!:", factorial(1))
print("2!:", factorial(2))
print("3!:", factorial(3))
print("4!:", factorial(4))
print("5!:", factorial(5))
재귀 함수의 문제
1) 피보나치 수열(1)
def fibonacci(n):
if n == 1:
return 1
if n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
print("fibonacci(1):", fibonacci(1))
print("fibonacci(2):", fibonacci(2))
print("fibonacci(3):", fibonacci(3))
print("fibonacci(4):", fibonacci(4))
print("fibonacci(5):", fibonacci(5))
2) 피보나치 수열(2)
counter = 0
def fibonacci(n):
print("fibonacci({})를 구한다.".format(n))
global counter
counter += 1
if n == 1:
return 1
if n ==2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
fibonacci(10)
print("---")
print("fibonacci(10) 계산에 활용된 덧셈 횟누는 {}번이다".format(counter))
-> fibonacci(10)을 구하는데 109번이나 연산했다.
UnboundLocalError에 대한 처리
-> 위의 코드에서 global counter 부분을 주석처리하면, UnboundLocalError 예외를 출력함.
global 키워드는 파이썬언어에만 있는 특이한 구조이다. 함수 내부에서 함수 외부에 있는 변수를 설명하려면 global 키워드를 사용해서 변수를 참조(reference) 한다.
메모화 : 딕셔너리를 사용해서 한 번 계산한 값을 저장한다. 이를 메모(memo)한다고 표현한다. 딕셔너리에 값이 메모되어 있으면 처리를 수행하지 않고 곧바로 메모된 값을 돌려주면서 코드의 속도를 빠르게 만든다. 메모화를 사용하면 실행 후 곧바로 결과를 출력할 정도로 빨라진다. 재귀함수와 함께 사용되는 기술이다.
dictionary = { 1: 1, 2: 1 }
def fibonacci(n):
if n in dictionary:
return dictionary[n]
else: output = fibonacci(n-1) + fibonacci(n-2)
dictionary[n] = output
return output
print("fibonacci(10):", fibonacci(10))
print("fibonacci(20):", fibonacci(20))
print("fibonacci(30):", fibonacci(30))
조기 리턴
dictionary = { 1: 1, 2: 1 }
def fibonacci(n):
if n in dictionary:
return dictionary[n]
# 들여 쓰기 단계가 줄어 코드 읽기가 쉬움. 조기 리턴
output = fibonacci(n-1) + fibonacci(n-2)
dictionary[n] = output
return output
print("fibonacci(10):", fibonacci(10))
print("fibonacci(20):", fibonacci(20))
print("fibonacci(30):", fibonacci(30))
* 코드에 이름 붙이기 : 주석을 잘 사용하여 프로그램을 작성할 때 가독성이 좋아지게 한다. 또는 함수를 만든다
-> 한 줄의 코드라도 의미를 가지고 있다면 함수로 만든느 것이 좋다.(모듈)
* 코드 유지보수 : 함수를 사용할 경우, 수정이 쉽다!
튜플 : 함수와 함께 많이 사용되는 리스트와 비슷한 자료형. 리스트와 다른 점은 한번 결정된 요소는 바꿀 수 없다
1)리스트와 튜플 사용 예
[a,b] = [10,20]
(c,d) = (10,20)
print("a:", a)
print("b:", b)
print("c:", c)
print("d:", d)
2) 괄호가 없는 튜플
tuple_test = 10,20,30,40
print("#괄호가 없는 튜플의 값과 자료형 출력")
print("tuple test:", tuple_test)
print("type(tuple_test):",type(tuple_test))
print()
a,b,c = 10,20,30
print("#괄호가 없는 튜플을 활용한 할당")
print("a:", a)
print("b:", b)
print("c:", c)
3) 변수값을 교환하는 튜플
a,b = 10,20
print("# 교환 전 값")
print("a:", a)
print("b:", b)
print()
print("#교환 후 값")
print("a:", a)
print("b:", b)
print()
4) 여러 개 값 리턴
def test():
return(10,20)
a, b = test()
print("a:", a)
print("b:", b)
-> enumerate(), items() 함수를 사용할 때, i, value 는 (i, value) 튜플에서 괄호를 제거한 것
for i, value in enumerate([1,2,3,4,5,6]):
print("{}번째 요소는 {}입니다".format(i,value))
-> divmod() 함수도 튜플을 리턴하는 함수.
a, b = 97,40
divmod(a,b)
x, y = divmod(a,b)
x >>>2
y >>>17
람다 : 매개변수로 함수를 전달하기 위해 함수 구문을 작성하는 것이 번거롭고 코드 공간 낭비라는 생각이 들 때 함수를 간단하고 쉽게 선언하는 방법
1) 매개변수로 함수 전달
def call_10_times(func):
for i in range(10):
func()
def print_hello():
print("안녕")
call_10_times(print_hello)
2) map() 함수와 filter() 함수
- 함수를 매개변수로 전달하는 대표적인 표준 함수
def power(item):
return item * item
def under_3(item):
return item < 3
list_input_a = [1,2,3,4,5]
output_a = map(power, list_input_a)
print("# map() 함수의 실행결과")
print("map(power, list_input_a:", output_a)
print("map(power, list_input_a:", list(output_a))
print()
output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))
-> map() 함수와 filter() 함수는 모두 첫번째 매개변수에 함수, 두번째 매개변수에 리스트를 넣는다.
-> 출력값에 <map object>, <filter object> 가 나오는데 이를 제너레이터(generator)라고 한다.
3) 람다 : 간단한 함수를 쉽게 선언하는 방법
power = lambda x: x*x
under_3 = lambda x: x < 3
list_input_a = [1,2,3,4,5]
output_a = map(power, list_input_a)
print("# map() 함수의 실행결과")
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()
output_b = filter(under_3, list_input_a)
print("# filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))
4) 인라인람다 : 함수의 매개변수에 람다를 바로 넣는 것
list_input_a = [1,2,3,4,5]
output_a = map(lambda x: x * x, list_input_a)
print("# map() 함수의 실행결과")
print("#map(power, list_input_a):", output_a)
print("map(power, list_input_a):", output_a)
print("map(power, list_input_a):", list(output_a))
print()
output_b = filter(lambda x : x<3, list_input_a)
print("#filter() 함수의 실행결과")
print("filter(under_3, list_input_a):", output_b)
print("filter(under_3, list_input_a):", list(output_b))
파일처리
- 파일은 크게 텍스트 파일과 바이너리 파일로 나뉨
1) 파일 열고 닫기
- 파일 열기 : 파일 객체 = open(문자열: 파일 경로, 문자열: 읽기 모드)
- 파일 닫기 : 파일 객체.close()
file = open("basic.txt", "w")
file.write("Hello Python Programming...!")
file.close()
2) with 키워드 : 프로그램이 길어지면서 조건문과 반복문이 들어가다보면 파일을 열고 닫지 않는 실수를 하는 경우가 생길 수 있다. 이런 실수를 방지하기 위해 with 키워드를 사용한다
with open("basic.txt", "w") as file:
#파일에 텍스트 씀
file.write("Hello Python Programming...!")
3) 텍스트 읽기 : write(), read()
with open("basic.txt", "r") as file:
contents = file.read()
print(contents)
4) 텍스트 한줄씩 읽기 : 텍스트를 사용해 데이터를 구조적으로 표현할 수 있는 방법으로 CSV, XML, JSON 등이 있다.
랜덤하게 1000명의 키와 몸무게 만들기
import random
hanguls = list("가나다라마바사아자차카타파하")
with open("info.txt", "w") as file:
for i in range(1000):
name = random.choice(hanguls) + random.choice(hanguls)
weight = random.randrange(40, 100)
height = random.randrange(140, 200)
file.write("{}, {}, {}\n".format(name, weight, height))
반복문으로 파일 한 줄씩 읽기
with open("info.txt", "r") as file:
for line in file:
(name, weight, height) = line.strip().split(", ")
# 데이터가 문제없는지 확인한다: 문제가 있으면 지나감
if (not name) or (not weight) or (not height):
continue
# 결과를 계산한다
bmi = int(weight) / ((int(height) / 100) ** 2)
result = ""
if 25 <= bmi:
result = "과체중"
elif 18.5 <= bmi:
result = "정상 체중"
else:
result = "저체중"
#출력합니다
print('\n'.join([
"이름: {}",
"몸무게: {}",
"키: {}",
"BMI: {}",
"결과: {}"
]).format(name, weight, height, bmi, result))
print()
교육도서 : 혼자 공부하는 파이썬 https://book.naver.com/bookdb/book_detail.nhn?bid=15028688
광고 수익은 기부 활동에 사용됩니다
정보를 얻으신 분들은 광고 클릭 부탁드려요 :)
'Programming > Python' 카테고리의 다른 글
[혼공챌린지]python scraping (0) | 2021.08.09 |
---|---|
[혼공챌린지]python 오류(Error) (0) | 2021.08.02 |
[혼공챌린지]python 자료형 (0) | 2021.07.19 |
[혼공챌린지]python 조건문 (0) | 2021.07.10 |
[혼공챌린지] Hello~Python :) (0) | 2021.07.10 |