코딩의 기록

따라하며 배우는 파이썬과 데이터과학 -6. 함수로 일처리를 짜임새있게 하자

모루우 2025. 1. 13. 23:22
728x90
반응형

1. 짜임새 있는 기능을 만드는 멋진 기능: 함수

프로그램을 이해하기 쉽고 관리하기 쉽도록 작은 조각으로 나누어서 조직화할 필요가 있다

 

함수: 우리가 반복적으로 사용하는 코드를 묶은 것/ 일을 수행하는 코드의 덩어리

객체: 코드 중에서 독립적인 단위로 분리할 수 있는 조각??

모듈: 프로그램의 일부를 가지고 있는 독립적인 파일

 

함수는 레고 블록에서 기본 레고 블록에 비유할 수 있음

 

def를 통해서 함수를 정의할 수 있음

 

2. def 예약어를 이용하여 함수를 작성하고 호출하기

콜론(:)은 코드 블록이 이어서 등장한다는 것을 의미

함수호출을 하면 코드가 실행됨

def print_company_address():
    print("학교: 동의대학교")
    print("전화번호: 010-9184-5989")

print_company_address()
def print_star():
    print("********************")

print_star()
print_star()
print_star()
print_star()
print_star()

 

3. 함수를 만들고 불러서 일을 시켜보자

여러 곳에서 사용하기 위해

 

4. 함수에 하나의 값을 넘겨주고 일을 시키자

함수 외부에서 함수 안으로 값을 전달할 수 있음 >> 여기서 넘기는 정보를 인자라고 함

전달 되는 실제 값: 인자

함수 내부에서 전달받는 변수: 매개변수

print_address("홍길동") >> 인자 전달

def print_address(name): >> 매개변수 적기

def print_address(name, address):
    print("이름 :",name)
    print("주소 :", address)

print_address("홍길순", "부산광역시 남구 광안로 10번길 1-1")

 

5. 함수에 일을 시키고 그 값을 받아오도록 하자

반환 값: 함수가 일을 하고 우리에게 뭔가를 보내주는 것

 

6. 함수에 여러 개의 값을 넘겨주는 고급 기능

매개변수의 개수와 인자의 개수는 무조건 같아야 함

 

7. 여러 개의 값을 넘겨주고 여러 개의 값을 돌려받자

여러 개의 값을 반환할 수 있음

반환되는 2개 이상의 자료값들의 묶음이 튜플 자료형임 ( , )

a = 1
b = 2
c = 3

def get_square(a, b, c):
    a_sq = a ** 3
    b_sq = b ** 3
    c_sq = c ** 3

    return a_sq, b_sq, c_sq

a_sq, b_sq, c_sq = get_square(a, b, c)

print(a, "제곱 :", a_sq, b, "제곱 :", b_sq, c, "제곱 :", c_sq)
import turtle

def square(length):
    t = turtle.Turtle()
    t.shape("turtle")

    for i in range(4):
        t.forward(length)
        t.left(90)

    turtle.done()


square(100)

Turtle() 메소드 done() 메소드 따로 있음

 

8. 변수의 범위는 어디까지인가

지역변수: 함수 안에서 생성되는 변수

지역변수와 전역변수는 같은 이름이라도 별개의 메모리에 저장되어 있음

import turtle

t = turtle.Turtle()
t.shape("turtle")

def square(length):
    for i in range(4):
        t.forward(length)
        t.left(90)

square(100)
square(200)
square(300)
turtle.done()
import turtle

t = turtle.Turtle()
t.shape("turtle")

def n_polygon(n, length):

    for i in range(n):
        t.forward(length)
        t.left(360/n)

for i in range(10):
    t.left(30)
    n_polygon(12, 100)

turtle.done()

 

9. 함수 안에서 전역변수 사용하기: global 키워드

global 키워드로 선언된 변수는 전역변수를 참조함

전역변수를 많이 사용 할 경우 프로그램에서 어느 부분에서 오류가 발생했는지 추적하기 어렵기에 전역변수 사용은 최소로 하는 것이 좋음

 

10. 함수에 쉽게 일을 시키는 디폴트 인자

디폴트 인자: 함수의 매개변수가 기본값을 가지는 것

 

11. 키워드 인자로 더욱더 고급지게 함수 활용하기

키워드 인자: 인자들 앞에 키워드를 두어서 인자들을 구분함

power(2, 10) >> power(2 = base, 10 = exponent)

위치 인자: 전달할 곳을 명확히 하는 것도 가능함

power(2, 10) >> 밑이 2이고 지수가 10인 2^10

키워드 인자가 나온 뒤에는 위치 인자가 나올 수 없음

def weeklyplay(rate, hour):
    if hour > 30:
        w = 30 * rate + (hour - 30) * rate * 1.5

        return w
    else:
        w = hour * rate
        return w

rate = int(input("시급을 입력하시오:"))
hour = float(input("근무 시간을 입력하시오:"))

print("주급은", weeklyplay(rate, hour))
def getMinMax(list, method):
    minvalue = 99999999
    maxvalue = -minvalue

    if method == "min":
        for i in range(len(list)):
            if list[i] < minvalue:
                minvalue = list[i]

        return minvalue
    elif method == "max":
        for i in range(len(list)):
            if list[i] > maxvalue:
                maxvalue = list[i]

        return maxvalue

    else:
        print("illegal method")

list = [27, 90, 30, 87, 56]

while True:
    print(list)
    method = input("최댓값을 원하면 max, 최솟값을 원하면 min을 입력하시오:")
    print(getMinMax(list, method))
import turtle

def draw(length, list):
    for i in range(len(list)):
        t.begin_fill() #색을 채우기 시작해라는 메소드
        t.left(90)
        t.forward(list[i])
        t.write(str(list[i]), font = ("Times New Roman", 16, "bold"))
        t.right(90)
        t.forward(length)
        t.right(90)
        t.forward(list[i])
        t.left(90)
        t.end_fill() #여기서 색을 칠하는 것을 멈춰라는 메소드

list = [120, 56, 309, 220, 156, 23, 98]
t = turtle.Turtle()
t.shape("turtle")
t.color("blue") # 이건 텍스트 색을 말하는 거 같음
t.fillcolor("red") # 이건 진짜 채우라고 명령할 때 채워지는 색

draw(length = 25, list = list) # 그리고 나는 그냥 바로 리스트를 받았는데 그것보다 어쩌면 그냥 정말 한 bar만 그리는 함수를 작성하는게 더 나을지도 모름 근데 이건 케바케 느낌이긴 함

turtle.done()
import turtle

def draw_x2_1(x):
    t.goto(x, 0.01 * x ** 2 + 1) #근데 이건 사실상 x^2 + 1 그래프가 아니지 않나? 0.01x^2 + 1 그래프지 

t = turtle.Turtle()
t.shape("turtle")

t.goto(0, 200)
t.goto(0, 0)
t.goto(200, 0)
t.goto(0,0)

for i in range(150):
    draw_x2_1(i)

turtle.done()

 

12. 자신을 호출하는 재귀 함수

재귀함수: 함수 내부에서 자기 자신을 호출하는 함수

처리 단계를 모두 기술하기 어려운 문제를 직관적이고 간단하게 해결 가능 (예) 팩토리얼

문제의 규모가 n일 때 n보다 작은 규모의 문제로 쪼개어 호출하는 것이 일반적 (분할 정복 알고리즘 divide and conquer)

팩토리얼은 한 갈래 재귀호출이라 분할 정복 알고리즘이라고 할 수 없음

(분할 정복 알고리즘은 여러 갈래 재귀호출임)

def fibonacci(n):
    if n == 2: #여기서 n은 항이기 때문에 1번째는 0, 2번째는 1 0번째 항으로 친다면 그대로 가능
        return 1
    elif n == 1:
        return 0
    else:
        return fibonacci(n-1) + fibonacci(n-2)

ch = int(input("몇 번째 항: "))
print(fibonacci(ch))

 

피보나치 수열 계산을 재귀호출로 하는 것은 분할 정복이 아님

큰 문제를 작은 문제로 쪼개는게 아니라 한 호출을 하기 위해 2개의 호출을 불러내는 O(2^n)이기 때문에?

https://sheepseung.tistory.com/70

 

[알고리즘] 분할 정복 피보나치 - 코딩밥상

피보나치(Fibonacci) 구하는 방법 피보나치 수열이야 고등학생부터 흔하게 접했었던 수열이기에 설명을 각설하고, 이를 일반적인 방법으로 구현하고 분할 정복을 기반으로 다시 한번 구현해보겠

sheepseung.tistory.com

array = [0, 1]

def fibonacci(n):
    if n <= len(array):
        return array[n-1]
    else:
        array.append(fibonacci(n-1) + fibonacci(n-2))
        return array[n-1]
while True:
    ch = int(input("몇 번째 항: "))
    print(fibonacci(ch))

 

리스트를 사용해서 큰 수를 저장해놓으면 파이썬의 한계를 넘어서 호출 할 수 있음 파이썬은 재귀함수에 제한을 두기 때문

 

13.모듈을 이용해서 함수를 두고두고 재사용하자

모듈: 파이썬 함수나 변수 클래스들을 모아놓은 스크립트 파일

파이썬 표준 라이브러리: 파이썬 설치와 함께 제공되는 모듈

예) datetime 모듈

.은 클래스 접근

 

14. 나만의 모듈을 만들고 불러서 사용해 보자

파이썬 코드를 작성하고 저장하면 그 파일명이 모듈이 됨

별명을 사용하고 싶다면 as(alias)를 통해서 줄일 수 있음

import my_func as mf

특정한 함수를 바로 import도 가능함

import my_func import mf_print

*를 사용해서 모듈 내의 모든 함수를 import 할 수도 있음

 

요약

1. 이해하기 쉽고 관리하기 싶도록 코드들을 나눠서 조직화 할 필요가 있음(함수, 객체, 모듈 등등)

2. def를 이용해서 함수를 정의 할 수 있으며 인자를 전달 받을 수 있음 이때 매개변수를 작성해야 함 (매개변수와 인자의 개수는 같아야 함)

3. 여러개의 값을 반환할 수 있으며 반환되는 값은 튜플 자료형임 ( , )

4. 재귀함수 / 분할 정복 알고리즘

5. .은 클래스 접근, as로 별명 사용 가능, import, *

6. 전역변수와 지역변수 전역변수와 지역변수는 이름이 같아도 다른 메모리에 저장됨 global로 전역변수를 사용할 수 있음

728x90
반응형