<함수>
한마디로 '코드의 집합'
함수 생성
*** def 함수 이름( ):
실행할 코
함수 호출
*** 함수 이름()
함수에 매개변수 만들기
*** def 함수이름(매개변수, 매개변수1, 매개변수2 •••)
실행할 코드
** 함수에 매개변수를 부족하게 넣거나, 넘치게 넣게 되면 TypeError가 납니다~!
<가변 매개변수>
가변 매개변수는 매개변수 개수가 변할 수 있다는 의미입니다~!
** 일반 매개변수는 가변 매개변수 뒤에 올 수 없고, 한 함수당 하나만 사용될 수 있습니다~
def print_n_times(n=2, *values):
for i in range(n):
for value in values:
print(value)
print()
print_n_times("안녕하세요","즐거운","파이썬 프로그래밍")
** 기본 매개변수가 가변 매개변수보다 앞에 올 때 -> n에 "안녕하세요"가 들어가게 되면서 오류 발생~!
def print_n_times(*values, n=2):
for i in range(n):
for value in values:
print(value)
print()
print_n_times("안녕하세요","즐거운","파이썬 프로그래밍", 3)
** 이 경우 n=3 또는 3까지 values로 인식할 수 있습니다~ 하지만 가변 매개변수가 더 우선순위기 때문에 3까지 2번 출력됩니다~~
- 키워드 매개변수
키워드 매개변수는 매개변수 이름을 지정해서 입력하는 매개변수입니다~~
def print_n_times(*values, n=2):
for i in range(n):
for value in values:
print(value)
print()
print_n_times("안녕하세요","즐거운","파이썬 프로그래밍", n=3)
** 이런 형식이 바로 키워드 매개변수입니다~~
<리턴>
리텉은 함수의 결과를 받아서 사용할 수 있는 것입니다~~ 즉, 함수를 실행하고 남은 결과 값을 사용할 수 있습니다
기본 문제
chapter 5-1 확인 문제
1. 다음과 같이 방정식을 파이썬 함수로 만들어 보세요.
def f(x):
return 2*x+1
print(f((10)))
#ver1
def f(x):
return x**2+x*2+1
print(f(10))
#ver2
def f(x):
return (x+1)**2
print(f(10))
2. 다음 빈칸을 채워 매개변술 전달된 값들을 모두 곱해서 리턴하는 가변 매개변수 함수를 만들어 보세요.
def mul(*values):
output = 1
for value in values:
output *= value
return output
print(mul(5, 7, 9, 10))
3. 다음 중 오류가 발생하는 코드를 고르세요.
① -> 가변 매개변수로 다 들어가기 때문에, 일반 매개변수가 부족하다~
<함수의 활용>
- 팩토리얼
팩토리얼은 n부터 (n-1) * (n-2)... 1까지 계속 곱하는 연산입니다 이를 함수로 표현하면
def factorial(n):
output = 1
for i in range(1, n+1):
output *= i
return ouput
print(factorial(2))
재귀 함수로 호출하는 법
재귀함수란 자기 자신을 호출하는 것을 의미합니다~~
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
만약 n 값으로 3을 넣어준다면
return 3 * factorial(2)
return 3 * 2 * factorial(1)
return 3 * 2 * 1 * factorial(0) -> n의 값이 0일시 1을 return하기 때문에 결과는 3 * 2 * 1 * 1이 나옵니당~~
재귀 함수의 문제
파보나치 수열은 '토끼가 어떠한 속도로 번식하는가'와 같은 연구에 사용되는 수열입니다.
-> 처음에는 토끼가 한 쌍만 존재, 두 달 이상 된 토끼는 번식이 가능, 번식한 토끼는 매달 새끼를 한 쌍씩 낳음, 토끼는 죽지 않음
이 규칙을 가지고 코드를 짜면~
def fivonacci(n):
if n == 1:
return 1
if n == 2:
return 1
else:
return fivonacci(n - 1) + fivonacci(n - 2)
만약 n값에 4를 넣게 된다면~
fivonacci(3) + fivonacci(2)
fivonacci(2) + fivonacci(1) + fivonacci(2) -> fivonacci(1)과 fivonacci(2)는 1이기 때문에 3이 return됩니다~!
이를 프로그래밍해서 짜게 된다면~
counter = 0
def fabonacci(n):
print("fabonacci({})를 구합니다.".format(n))
global counter
counter += 1
if n == 1:
return 1
if n == 2:
return 1
else:
return fabonacci(n - 1) + fabonacci(n - 2)
fabonacci(4)
print("---")
print("fivonacci(4) 계산에 활용된 덧셈 횟수는 {}번 입니다.".format(counter))
*** 함수는 함수 내부에서 함수 외부에 있는 변수를 참조하지 못하기 때문에 변수에 접근할 수 있게 하기 위해서는 global 변수 이름 을 사용해야합니다~~!
<메모화>
메모화는 딕셔너리를 사용해서 한 번 계산한 값을 저장하는 것을 말합니다!
dictionary= {
1 : 1.
2 : 1
}
def fivonacci(n):
if n in dictionary:
return dictionary[n]
else:
output = fivonacci(n - 1) + fivonacci(n - 2)
dictionary[n] = output
return dictionary[n]
만약 n 값으로 3을 넣게 된다면
fivonacci(2) + fivonacci(1)
하지만? dictionary에 1과 2가 있기 때문에 fivonacci(1)과 fivonacci(2)는 각각 1을 return합니당~ 그래서 결과는 2!!
- 조기 리턴
조기 리턴은 흐름 중간에 reutrn 키워드를 사용하는 것을 말합니다~~
조기 리턴을 사용하게 되면 코드를 더 쉽게 읽을 수 있는 장점이 있습니다!
- 리스트 평탄화하기
def flatten(data):
output = []
for item in data:
if type(item) == list:
output += flatten(item)
else:
output.append(item)
return output
만약 item의 type이 list면 -> output에 flatten(item)이라는 리스트를 더해줍니다~! 전에 배웠던 리스트의 특징!! => 리스트는 더하게 되면 리스트끼리 연결이 된다~!!
만약 item의 type이 list가 아니면 -> output에 item이라는 값을 추가해줍니다~~!
chapter 5-2 확인 문제
1. 패밀리 레스토랑에서 여러 개의 테이블에 나누어 앉으려고 합니다. 이때 한 사람만 앉는 테이블이 없게 그룹을 지어야 합니다. 인원 수를 나누는 패턴만 구하면 되며, 누가 어디에 앉는지 등은 고려하지 않아도 괜찮습니다. 예를 들어 6명이라면 다음과 같은 네 가지 경우를 생각할 수 있습니다.
앉힐수있는최소사람수 = 2
앉힐수있는최대사람수 = 10
전체사람의수 = 100
memo = {}
def 문제(남은사람수, 앉힌사람수):
key = str([남은사람수, 앉힌사람수])
if key in memo:
return memo[key]
if 남은사람수 < 0:
return 0
if 남은사람수 == 0:
return 1
count = 0
for i in range(앉힌사람수, 앉힐수있는최대사람수 + 1):
count += 문제(남은사람수 - i, i)
memo[key] = count
return count
print(문제(전체사람의수, 앉힐수있는최소사람수))
* 답지 봤습니당~ 답지 보고 난 후 제가 이해한 내용~~ *
<튜플>
튜플은 리스트와 비슷한 형태이지만! 한번 결정된 요소를 변경할 수 없다는 특징이 있습니다!!!
*** 튜플명 = (요소1, 요소2, 요소3)
** 튜플은 괄호 생략이 가능합니다~!
** 튜플을 사용하면 여러가지 값 리턴이 가능합니당~~!
- map( )
map( ) 함수는 리스트의 요소를 함수에 넣고 리턴된 값으로 새로운 리스트를 구성
*** map(함수, 리스트)
- filter( )
filter( ) 함수는 리스트의 요소를 함수에 넣고 리턴된 값이 True인 것으로 새로운 리스트를 구성
*** filter(함수, 리스트)
- 람다
람다는 간단한 함수를 쉽게 선언하는 방법입니당~~ 위의 함수를 람다로 바꾸게 되면
** 람다는 따로 선언하지 않고 print(list(map(lambda x : x*x, list_input)))과 같이 바로 사용할 수도 있습니다~
<파일 열고 닫기>
*** 파일 객체 = open(문자열: 파일경로, 문자열: 읽기모드) -> w :새로 쓰기 모드, a : 뒤에 이어서 쓰기 모드, r : 읽기 모드
파일을 열고 닫을 때는 꼭 open()과 close()가 함께하지 않아서 생기는 실수를 방지하기 위해 with 키워드라는 기능이 있습니다~
// 처음 방식
file = open("test.txt", "w")
file.write("hello~~")
file.close()
// 실수 방지
with open("text.txt", "w") as file:
file.write("hello~~")
파일을 읽을 때는 read() 함수를 호출하기만 하면 사용할 수 있습니다~~
with open("test.txt", "r") as file:
result = file.read()
print(result)
**** 예제 ****
1. BMI 읽기
with open("bmi.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 bmi >= 25:
result = "과체중"
elif bmi >= 18.5:
result = "정상"
else:
result = "저체중"
print(f"이름 : {name}, 몸무게 : {weight}, 키 : {height}, bmi : {bmi}, 결과 : {result}")
chapter 5-3 확인 문제
1. str(numbers)
2.
numbers = list(range(1, 10 + 1))
print("# 홀수만 추출하기")
print(list(filter(lambda x : x%2==1, numbers)))
print()
print("# 3 이상, 7 미만 추출하기")
print(list(filter(lambda x : x>=3 and x<7, numbers)))
print()
print("# 제곱해서 50 미만 추출하기")
print(list(filter(lambda x : x**2 < 50, numbers)))
이번주 도전문제는..ㅎㅅㅎ 차근차근 풀어보겠습니당~~ 이번주도 성공 (´▽`ʃ♡ƪ)
'혼공파' 카테고리의 다른 글
혼공파 6주차..! (0) | 2023.08.16 |
---|---|
혼공파 5주차!!! 😋 (0) | 2023.08.06 |
혼공파 3주~~🫡🫡 (0) | 2023.07.17 |
혼공파 2주차~😊 (0) | 2023.07.11 |
혼공파 1주차~🤓 (0) | 2023.07.10 |