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로 전역변수를 사용할 수 있음
'코딩의 기록' 카테고리의 다른 글
따라하며 배우는 파이썬과 데이터 과학 -7.데이터를 리스트와 튜플로 묶어보자- (0) | 2025.01.18 |
---|---|
따라하며 배우는 파이썬과 데이터 과학 6장 심화문제 (0) | 2025.01.16 |
따라하며 배우는 파이썬과 데이터과학 5장 심화문제 (0) | 2025.01.09 |
따라하며 배우는 파이썬과 데이터과학 - 5.여러 번 반복하는 일을 하자 (0) | 2025.01.06 |
따라하며 배우는 파이썬과 데이터 과학 3장 심화문제 (0) | 2024.12.02 |