혼공파

혼공파 4주차~😁

오쟝 2023. 7. 25. 18:58

 

<함수>

한마디로 '코드의 집합'

함수 생성

*** def 함수 이름(  ):

           실행할 코

함수 호출

*** 함수 이름()

 

함수에 매개변수 만들기

*** def 함수이름(매개변수, 매개변수1, 매개변수2 •••)

           실행할 코드

 

** 함수에 매개변수를 부족하게 넣거나, 넘치게 넣게 되면 TypeError가 납니다~! 

 

<가변 매개변수>

가변 매개변수는 매개변수 개수가 변할 수 있다는 의미입니다~!

** 일반 매개변수는 가변 매개변수 뒤에 올 수 없고, 한 함수당 하나만 사용될 수 있습니다~

가변 매개변수로 문자열을 3개 넣었습니다~~

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)

** 이런 형식이 바로 키워드 매개변수입니다~~

 

<리턴>

리텉은 함수의 결과를 받아서 사용할 수 있는 것입니다~~ 즉, 함수를 실행하고 남은 결과 값을 사용할 수 있습니다

return 값에는 아무것도 들어있지 않고, 처음 함수를 실행했던 곳으로 돌아가는 것을 볼 수 있습니다~~
return값이 None이라고 뜹니다~~
return값이 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이 나옵니당~~

 

재귀 함수의 문제

파보나치 수열은 '토끼가 어떠한 속도로 번식하는가'와 같은 연구에 사용되는 수열입니다.

-> 처음에는 토끼가 한 쌍만 존재, 두 달 이상 된 토끼는 번식이 가능, 번식한 토끼는 매달 새끼를 한 쌍씩 낳음, 토끼는 죽지 않음

여기서 발견할 수 있는 규칙은 파보나치 수열은 (n-1)번째 수열 + (n-2)번째 수열~!!

이 규칙을 가지고 코드를 짜면~

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