함수
이름이 있는 코드 조각. 매개변수와 변환 값이 있다. 정의하고 난 후 호출을 한다.
함수 정의
def 함수명(): # 매개변수가 없는 함수
[return 코드]
def 함수명(a,b): # 매개변수가 있는 함수
[return 코드]
함수 호출
함수명()
결과값을 받을 변수 = 함수명(입력 인수 1, ...)
매개변수와 인수
매개변수 parameter : 함수에 입력으로 전달된 값을 받는 변수를 의미
인수 arguments : 함수를 호출할 때 전달하는 입력값을 의미
인자를 지정한 함수의 호출
파이썬은 매개변수의 수 만큼 전달해줘야하는 것이 기본이지만, 가변인자도 사용 가능하다.
매개변수에 초기값을 설정할 슈 있다.
키워드 인자를 이용한 호출
호출할 때 매개변수명과 값을 지정하여 호출하는 방식.
위치 인수와 키워드 인수를 섞어서 호출할 수도 있지만 위치 인수를 먼저 적고 뒤쪽에 키워드 인수를 적는다.
함수 초기값 설정 (default parameter)
함수 정의부의 매개변수에 초기값을 설정하면 매개변수의 값이 지정되지 않았을 경우 지정된 초기값으로 세팅된다.
초기값은 오른쪽에서부터 채워야 한다.
# 위치 인수를 이용한 함수의 호출
def restaurant(food,drink,dessert):
return{'food':food,'drink':drink,'dessert':dessert}
first = restaurant('스테이크','포도주','치즈케익')
print(first)
# 키워드 인수를 이용한 함수의 호출()
# 호출 시 매개변수의 이름을 함께 지정해서 값을 전달 -> 순서에 상관없이 호출 가능.
second = restaurant(drink='막걸리',dessert='파전',food = '잔치국수')
print(second)
# default parameter : 매개변수에 초기값 지정하는 것
def restaurant(food= '연어초밥',drink='사케',dessert='아이스크림'):
return{'food':food,'drink':drink,'dessert':dessert}
print(restaurant())
print(restaurant('돈부리'))
# {'food': '스테이크', 'drink': '포도주', 'dessert': '치즈케익'}
# {'food': '잔치국수', 'drink': '막걸리', 'dessert': '파전'}
# {'food': '연어초밥', 'drink': '사케', 'dessert': '아이스크림'}
# {'food': '돈부리', 'drink': '사케', 'dessert': '아이스크림'}
def calcstep(begin,end,step=1): # def 값은 뒤쪽에 위치해야함
sum = 0
for num in (begin,end+1):
sum+=num
return sum
print("1~10까지의 합 =", calcstep(1,10))
print("1~10까지의 합 =", calcstep(end=10,begin = 1))
# 1~10까지의 합 = 12
# 1~10까지의 합 = 12
[문제] 다음과 같은 결과를 출력하는 함수를 정의하세요.
print_star(5)
*
**
***
****
*****
# 내가 적은
def print_star(end,step =1):
for i in range(1,end+1):
print('*'* i)
print_star(5)
# 교수님
def print_star(num):
for n in range(1,num+1):
print('*'* n)
print_star(5)
[문제] 함수를 이용한 계산기
이항사칙연산을 매개변수로 받아 연산의 결과를 출력하는 함수를 정의하세요.
함수형식: calculator(exp)
exp: 사용자로부터 입력받은 문자열 형태의 이항사칙 연산식
[예시]
계산식을 입력하세요: 10+20
10+20 = 30.00
계산식을 입력하세요: 10a
연산자 오류
계산식을 입력하세요: 10/0
0으로 나눌 수 없습니다.
exp = input("계산식을 입력하세요:")
op = ["+","-","*","/"]
result = 0
def calculator(exp) :
data = []
if exp.split("+"):
data.append(exp.split("+"))
result = int(data[0][0]) + int(data[0][1])
print("%s + %s = %.2f" % (data[0][0],data[0][1],result))
elif exp.split("-"):
data.append(exp.split("-"))
result = int(data[0][0]) - int(data[0][1])
print("%s - %s = %.2f" % (data[0][0],data[0][1],result))
elif exp.split("*"):
data.append(exp.split("*"))
result = int(data[0][0]) * int(data[0][1])
print("%s * %s = %.2f" % (data[0][0],data[0][1],result))
elif exp.split("/"):
data.append(exp.split("/"))
result = int(data[0][0]) / int(data[0][1])
print("%s / %s = %.2f" % (data[0][0],data[0][1],result))
calculator(exp)
def calculator(exp) :
operator= ' '
for op in ["+","-","*","/"]:
if op in exp:
operator = op
break # 무조건 반복문 안에서만 실행, 반복문만 끝냄
else: # 연산자 찾지 못 함 = 연산자가 없다
print("연산자 오류")
return # 반환값 없이 단독으로 사용
value1 = float(exp.split(operator)[0]) # 연산자 기준 split
value2 = float(exp.split(operator)[1])
result = 0.0
if operator == "+":
result = value1 + value2
if operator == "-":
result = value1 - value2
if operator == "*":
result = value1 * value2
if operator == "/":
if value2 == 0:
print("0으로 나눌 수 없습니다.")
return # 코드가 있다고 해도 실행을 아예 끝냄.
else:
result = value1 / value2
print(f"{exp} = {result:.2f}") # 변수 : 서식 지정
# return f"{exp} = {result:.2f}"
exp = input("계산식을 입력하세요")
calculator(exp)
# result = calculator(exp)
# print(result)
이 문제는 내가 확실히 아직 문법이 어색하다고 생각이 들었던 문제였다.
eval()
동적 코드를 실행
eval 함수는 문자열 형태로 된 파이썬 표현식을 평가하여 그 결과를 리턴한다.
이 함수를 이용하면 실시간으로 코드를 만들어 실행할 수 있다.
result = eval('2 + 3 * 4')
print(result) #14
city= eval("{'서울','대전','광주'}")
for c in city:
print(c,end=',')
#서울,대전,광주,
*arg 와 **kwarg 매개변수
> *args는 전달된 데이터를 튜플로 묶는다.
> **kargs는 가변인자를 딕셔너리 타입으로 받는다. (위치 인수를 넘기면 에러 발생)
위치인수와 키워드 인수를 동시에 가변으로 취할 수 있는데, 이때는 위치 인수가 먼저 오고 키워드 인수가 뒤에 온다.
def test(*args):
print("결과:",args) # 튜플 = () 로 감쌈
test()
test(1,2,3)
test(1) # 원소가 하나인 튜플은 반드시 , 로 끝나야함
# 결과: ()
# 결과: (1, 2, 3)
# 결과: (1,)
def myargs(a, b, *args):
print('a:',a)
print('b:',b)
print('args:',args)
#myargs(10) # err
myargs(10, 20)
myargs(10, 20,30)
# a: 10
# b: 20
# args: ()
# a: 10
# b: 20
# args: (30,)
def myargs2(a, **kwargs):
print(a)
print(kwargs) # 딕셔너리 형태 { }
myargs2(10)
# 10
# {}
# myargs2(10,20) err 값만 전달할 수 없다
myargs2(10,b = 20, c = 30)
# 10
# {'b': 20, 'c': 30}
def calcstep(**kwargs):
begin = kwargs['begin'] # kwargs.get('begin') -> 비권장
end = kwargs['end']
step = kwargs['step']
sum =0
for n in range(begin,end+1,step):
sum+=n
return sum
print(calcstep(begin =1, end=10, step =1))
# 55
변수 범위
정의된 위치에 따라 지역변수와 전역변수로 나눈다.
-지역 변수 local : 함수 내부에 선언되는 함수
-전역 변수 global : 함수 밖에 선언되는 함수
함수 내부에서 초기화 하는 변수는 전역변수와 이름이 같더라도 지역 변수로 간주된다.
price = 1000 # 전역 변수
def sales():
# price = 5000 # 지역변수
global price # global : 전역변수 사용
price = 5000
price = 5000 # 지역변수
#global price # global : 전역변수 사용
#price = 5000
print("함수 내 price 값:", price)
sales() # 함수 사용
print("함수 호출 후 price 값:", price)
# 함수 내 price 값: 5000
# 함수 호출 후 price 값: 5000
# 함수 내 price 값: 5000
# 함수 호출 후 price 값: 1000
'국비 교육 > 파이썬' 카테고리의 다른 글
[파이썬] File I/O , File 과 Directory (0) | 2023.11.05 |
---|---|
[파이썬] 함수 - 2 (0) | 2023.11.05 |
[파이썬] Comprehension, zip(), enumerate() (0) | 2023.11.05 |
[파이썬] 딕셔너리 Dictionary , 튜플 Tuple, 집합 Set (0) | 2023.11.05 |