Language/Python

함수와 모듈

westcold 2024. 12. 5. 20:55

함수 = 자판기!

무엇인가 매개변수를 넣으면 반환값을 돌려준다


code09-01.py

coffee = 0

coffee = int(input("어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))

print()
print("#1. 뜨거운 물을 준비한다.")
print("#2. 종이컵을 준비한다.")

if coffee == 1:
    print("#3. 보통커피를 탄다.")
elif coffee == 2:
    print("#3. 설탕커피를 탄다.")
elif coffee == 3:
    print("#3. 블랙커피를 탄다.")
else :
    print("#3. 아무거나 탄다.\n")

print("#4. 물을 붓는다.")
print("#5. 스푼으로 젓는다.")
print()
print("손님~ 커피 여기 있습니다.")

 
code09-02.py

##전역 변수 선언 부분
coffee = 0

## 함수 선언 부분##
def coffee_machine(button):
    print()
    print("#1. (자동으로) 뜨거운 물을 준비한다.")
    print("#2. (자동으로) 종이컵을 준비한다.")

    if coffee == 1:
        print("#3. (자동으로) 보통커피를 탄다.")
    elif coffee == 2:
        print("#3. (자동으로) 설탕커피를 탄다.")
    elif coffee == 3:
        print("#3. (자동으로) 블랙커피를 탄다.")
    else :
        print("#3. (자동으로) 아무거나 탄다.\n")

    print("#4. (자동으로) 물을 붓는다.")
    print("#5. (자동으로) 스푼으로 젓는다.")
    print()

##메인 코드 부분##
coffee = int(input("어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))
coffee_machine(coffee)
print("손님~ 커피 여기 있습니다.")

 
code09-03.py

##전역 변수 선언 부분
coffee = 0

## 함수 선언 부분##
def coffee_machine(button):
    print()
    print("#1. (자동으로) 뜨거운 물을 준비한다.")
    print("#2. (자동으로) 종이컵을 준비한다.")

    if coffee == 1:
        print("#3. (자동으로) 보통커피를 탄다.")
    elif coffee == 2:
        print("#3. (자동으로) 설탕커피를 탄다.")
    elif coffee == 3:
        print("#3. (자동으로) 블랙커피를 탄다.")
    else :
        print("#3. (자동으로) 아무거나 탄다.\n")

    print("#4. (자동으로) 물을 붓는다.")
    print("#5. (자동으로) 스푼으로 젓는다.")
    print()

##메인 코드 부분##
coffee = int(input("A손님, 어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))
coffee_machine(coffee)
print("A손님~ 커피 여기 있습니다.")

coffee = int(input("B손님, 어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))
coffee_machine(coffee)
print("B손님~ 커피 여기 있습니다.")

coffee = int(input("C손님, 어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))
coffee_machine(coffee)
print("C손님~ 커피 여기 있습니다.")

 
selfstudy9-1.py

##전역 변수 선언 부분
coffee = 0

## 함수 선언 부분##
def coffee_machine(button):
    print()
    print("#1. (자동으로) 뜨거운 물을 준비한다.")
    print("#2. (자동으로) 종이컵을 준비한다.")

    if coffee == 1:
        print("#3. (자동으로) 아메리카노를 탄다.")
    elif coffee == 2:
        print("#3. (자동으로) 카페라떼를 탄다.")
    elif coffee == 3:
        print("#3. (자동으로) 카푸치노를 탄다.")
    elif coffee == 4:
        print("#3. (자동으로) 에스프레소를 탄다.")
    else :
        print("#3. (자동으로) 아무거나 탄다.\n")

    print("#4. (자동으로) 물을 붓는다.")
    print("#5. (자동으로) 스푼으로 젓는다.")
    print()

##메인 코드 부분##
coffee = int(input("로제씨, 어떤 커피 드릴까요?(1:아메리카노, 2:카페라떼, 3:카푸치노, 4:에스프레소)"))
coffee_machine(coffee)
print("로제씨~ 커피 여기 있습니다.")

coffee = int(input("리사, 어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))
coffee_machine(coffee)
print("리사씨~ 커피 여기 있습니다.")

coffee = int(input("지수씨, 어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))
coffee_machine(coffee)
print("지수씨~ 커피 여기 있습니다.")

coffee = int(input("제니씨, 어떤 커피 드릴까요?(1:보통, 2:설탕, 3:블랙)"))
coffee_machine(coffee)
print("제니씨~ 커피 여기 있습니다.")



함수의 형식과 활용
반복적으로 코딩해야 할 내용을 함수로 만들면 필요할때마다 사용 가능하고 동일한 동작을 계속 사용하므로 내부 내용이 바뀔 일이 없다.
 
code09-04.py

## 함수 선언 부분 ##
def plus(v1, v2):
    result = 0
    result =v1 + v2
    return result

## 전역 변수 선언 부분 ##
hap = 0

##메인 코드 부분 ##
hap = plus(100, 200)
print("100과 200의 plus() 함수 결과는 %d" %hap)

*def 함수 선언 부분은 바로 실행되지 않는다 

code09-05.py

## 함수 선언 부분 ##
def cal(v1, v2, op):
    result = 0
    
    if op =="+" :
        result = v1 + v2
    elif op == "-" :
        result = v1 - v2
    elif op == "*" :
        result = v1 * v2
    elif op == "/" :
        result = v1 / v2
        
    return result

## 전역 변수 선언 부분 ##
res = 0
var1, var2, oper =0, 0, ""

##메인 코드 부분 ##
oper = input("계산을 입력하세요(+,-,*,/) : ")
var1 = int(input("첫 번째 수를 입력하세요 : "))
var2 = int(input("두 번째 수를 입력하세요 : "))

res = cal(var1, var2, oper)

print("## 계산기 : %d %s %d = %d" %(var1, oper, var2, res))

 
selfstudy9-2.py

## 함수 선언 부분 ##
def cal(v1, v2, op):
    result = 0
    
    if op =="+" :
        result = v1 + v2
    elif op == "-" :
        result = v1 - v2
    elif op == "*" :
        result = v1 * v2
    elif op == "/" :
        result = v1 / v2
    elif op == "**" :
        result = v1 ** v2
        
    return result

## 전역 변수 선언 부분 ##
res = 0
var1, var2, oper =0, 0, ""

##메인 코드 부분 ##
var1 = int(input("첫 번째 수를 입력하세요 : "))
oper = input("계산을 입력하세요(+,-,*,/,**) : ")
var2 = int(input("두 번째 수를 입력하세요 : "))

if var2 == 0:
    print("0으로는 나누면 안 됩니다.ㅠㅠ")

else:
    res = cal(var1, var2, oper)

    print("## 계산기 : %d %s %d = %d" %(var1, oper, var2, res))

 
지역 변수, 전역 변수

지역변수는 함수 내에서만 사용되는 변수
전역 변수는 프로그램 전체에서 사용되는 변수이다
(변수명이 같다면 지역변수가 우선)

code09-06.py

##함수 선언 부분##
def func1():
    a = 10 #지역변수
    print("func1()에서 a값 %d" % a)

def func2():
    print("func2()에서 a값 %d" % a)

##전역변수 선언 부분 
a = 20 #전역변수

##메인코드
func1()
func2()



 
code09-07.py

##함수 선언 부분##
def func1():
    global a # 이 함수 안에서 a는 전역 변수
    a = 10 #지역변수
    print("func1()에서 a값 %d" % a)

def func2():
    print("func2()에서 a값 %d" % a)

##전역변수 선언 부분 
a = 20 #전역변수

##메인코드
func1()
func2()

global 예약어가 사용이 되면 전역변수가 된다.

 

함수의 반환값과 매개변수

함수는 크게 반환값이 있는 함수(ex. return a)vs 반환값이 없는 함수로 나눈다.(return or 없음)

code09-08.py

def func1():
    result = 100
    return result

def func2():
    print("반환값이 없는 함수 실행")

##전역변수 선언 부분 
hap = 0

##메인코드
hap=func1()
print("func1()에서 돌려준 값 ==> %d" %hap)
func2()

*반환값이 없는 함수
-return문이 생략이 되거나 return만 입력
 

code09-09.py

##함수 선언 부분##
def multi(v1, v2):
    retList = []
    res1 = v1 + v2
    res2 = v1 - v2
    retList.append(res1)
    retList.append(res2)
    return retList

##전역변수 선언 부분 
myList = []
hap, sub = 0, 0

##메인코드
myList = multi(100, 200)
hap = myList[0]
sub = myList[1]
print("multi()에서 돌려준 값 ==> %d, %d" % (hap, sub))

*반환값이 여러개인 함수
-2개 이상이 반환값이 될 수 없지만 리스트에 넣은 후 반환하면 ok 

+추가로
def func()
      pass
pass 예약어는 함수를 구현할 대 일단 이름만 만들어 놓고 그 내용은 pass 예약어로 비울 수 있다.




code09-10.py

##함수 선언 부분##
def para2_func(v1, v2):
    result = 0
    result = v1 + v2
    return result

def para3_func(v1, v2, v3):
    result = 0
    result = v1 + v2 + v3
    return result

##전역변수 선언 부분 
hap = 0

##메인코드
hap = para2_func(10, 20)
print("매개변수가 2개인 함수를 호출한 결과 ==> %d" %hap)
hap = para3_func(10, 20, 30)
print("매개변수가 3개인 함수를 호출한 결과 ==> %d" %hap)

 매개변수의 개수를 지정해 전달하는 방법

 
code09-11.py

##함수 선언 부분##
def para_func(v1, v2, v3=0):
    result = 0
    result = v1 + v2 + v3
    return result

##전역변수 선언 부분 
hap = 0

##메인코드
hap = para_func(10, 20)
print("매개변수가 2개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30)
print("매개변수가 3개인 함수를 호출한 결과 ==> %d" %hap)

매개변수에 기본값을 설정해 놓고 전달하는 방법
 

selfstudy9-3.py

##함수 선언 부분##
def para_func(v1, v2, v3=0,v4=0,v5=0,v6=0,v7=0,v8=0,v9=0,v10=0):
    result = 0
    result = v1 + v2 + v3+ v4 + v5 + v6+ v7 + v8 + v9 + v10
    return result

##전역변수 선언 부분 
hap = 0

##메인코드
hap = para_func(10, 20)
print("매개변수가 2개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30)
print("매개변수가 3개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30, 40)
print("매개변수가 4개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30, 40, 50)
print("매개변수가 5개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30, 40, 50, 60)
print("매개변수가 6개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30, 40, 50, 60, 70)
print("매개변수가 7개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30, 40, 50, 60, 70, 80)
print("매개변수가 8개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30, 40, 50, 60, 70, 80, 90)
print("매개변수가 9개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
print("매개변수가 10개인 함수를 호출한 결과 ==> %d" %hap)

 
code09-12.py

#함수 선언 부분
def para_func(*para): #*갯수가 정해져있지 않은 매개변수가 튜플 형식으로 넘어와 튜플을 처리하는 방식으로 함수 안에서 사용 가능
    result = 0
    for num in para :
        result = result + num

    return result

##전역변수 선언 부분 
hap = 0

##메인코드
hap = para_func(10, 20)
print("매개변수가 2개인 함수를 호출한 결과 ==> %d" %hap)
hap = para_func(10, 20, 30)
print("매개변수가 3개인 함수를 호출한 결과 ==> %d" %hap)





#딕셔너리
def dic_func(**para): 
    for k in para.keys() :
        print("%s -- > %d명입니다." %(k, para[k]))


dic_func(트와이스 = 9, 소녀시대 = 7, 걸스데이 = 4, 블랙핑크 =4)

 매개변수의 개수를 지정하지 않고 전달하는 방법
-매개변수 앞에*를 붙이면 매개벼누가 튜플 형식으로 넘어와 튜플을 처리하는 방식으로 함수 안에서 사용할 수 있다.
-**를 사용하면 딕셔너리 형식으로 전달->(키=값)형식으로 넣어줘야 함

 
code09-13.py

import random

##함수 선언 부분##
def getNumber():
    return random.randrange(1, 46)

##전역 변수 선언 부분##
lotto = []
num = 0

##메인 코드 부분##
print("** 로또 추첨을 시작합니다. ** \n")

while True:
    num = getNumber()

    if lotto.count(num) == 0:
        lotto.append(num)

    if len(lotto) >=6 :
        break

print("추첨된 로또 번호 ==> ", end = "")
lotto.sort()
for i in range(0,6) :
    print("%d " %lotto[i], end="")

 

모듈

모듈은 함수의 집합
모듈은 표준 모듈, 사용자 모듈, 서드파티모듈이 있다.

표준모듈: 파이썬에서 제공하는모듈
사용자 모듈: 사용자가 만듬
써드 파티 모듈:외부 회사나 단체에서 제공하는 모듈->다양해서 파이썬의 장점

module1.py

##함수 선언 부분##
def func1() :
    print("Module1.py의 func1()이 호출됨.")

def func2() :
    print("Module1.py의 func2()이 호출됨.")

def func3() :
    print("Module1.py의 func3()이 호출됨.")

 
a.py

import Module1

##메인 코드 부분##
Module1.func1()
Module1.func2()
Module1.func3()

 
b.py

from Module1 import func1, func2, func3 #또는 from Module1 import *

#메인 코드 부분##
func1()
func2()
func3()


# def outFunc(v1,v2):
#     def inFunc(num1, num2) :
#         return num1 + num2
#     return inFunc(v1, v2)
# print(outFunc(10, 20))

# hap2 = lambda num1, num2 : num1 + num2
# print(hap2(10, 20))

# hap3 = lambda num1 = 10, num2 = 20 : num1 + num2
# print(hap3())
# print(hap3(100, 200))

# myList = [1,2,3,4,5]
# add10 = lambda num: num + 10
# myList = list(map(add10, myList))
# print(myList)

# myList = list(map(lambda num : num + 10, myList))
# print(myList)

# list1=[1,2,3,4]
# list2=[10, 20, 30, 40]
# hapList = list(map(lambda n1, n2 : n1+n2, list1, list2))
# print(hapList)


# def factorial(num) :
#     if num <=1 :
#         return num
#     else:
#         return num*factorial(num-1)
# print(factorial(4))
# print(factorial(10))

 
myTurtle.py

import random
from tkinter.simpledialog import *

def getString() :
    retStr = ""
    retStr = askstring("문자열 입력", "거북이 쓸 문자열을 입력")
    return retStr

def getRGB():
    r,g,b =0,0,0
    r = random.random()
    g = random.random()
    b = random.random()
    return (r,g,b)

def getXYAS(sw, sh):
    x, y, angle, size = 0,0,0,0
    x = random.randrange( int(-sw/2), int(sw/2))
    y = random.randrange( int(-sh/2), int(sh/2))
    angle = random.randrange(0,360)
    size = random.randrange(10, 50)
    return [x,y,angle, size]

 
 
code09-14.py

from myTurtle import *
import turtle

##전역변수선언부분##
instr = ""
swidth, sheight = 300, 300
tX, tY, tAngle, tSize = [0]*4

#메인코드부분#
turtle.title("거북이 글짜쓰기(모듈버전)")
turtle.shape("Turtle")
turtle.setup(width=swidth + 50, height = sheight + 50)
turtle.screensize(swidth, sheight)
turtle.penup()
turtle.speed(5)

inStr = getString()

for ch in inStr :

    tX, tY, tAngle, tSize = getXYAS(swidth, sheight)
    r,g,b = getRGB()

    turtle.goto(tX, tY)
    turtle.left(tAngle)

    turtle.pencolor((r,g,b))
    turtle.write(ch, font = ("맑은고딕", txtSize, "bold"))

turtle.done

 
패키지

패키지는 여러 모듈을 모아 놓을 것으로 폴더의 형태
from 패키지명.모듈명 import 함수명





내부함수
내부함수는 함수 안에 함수가 있는 형태
def outfunc(v1, v2) :
       def infunc(num1, num2) :
              return num1 + num2
         return infunc(v1,v2)
print(outfunc(10, 20))
결과값 -> 30

람다함수
한줄로 간단하게 함수를 만들어 줌
hap = lambda num1, num2 : num1 + num2
print(hap(10, 20))
결과값->30

map함수
리스트에 함수 수식을 모두 한꺼번에 적용
mpa(함수, 시퀸스(문자열,리스트,딕셔너리))

재귀함수
자신이 자신을 호출
중지하려면
-ctrl + c
-카운트

yield문
return은 결과를 반환하고 함수를 종결하지만 yield문은 함수를 종결하지 않으면서 값을 반환한다.