-
Python 기초 공부 - 3Programming/Python 2021. 3. 5. 16:32반응형
# 함수 (function)
# - 함수이름은 중복이 되면 안됨 (오버로딩은 default 매개변수로 해결)
# - Required auguments(매개변수를 순서적으로 입력)
# - keyword auguments(키이 매개변수의 순서 변경이 가능)
# - default auguments(오버로딩해결)
# - Variable-length auguments(변동매개변수 : * -> list, ** -> dict)a=10 b=20 result = a+b print(result) c=30 d=40 result = c+d print(result) def addvalue(a,b): # ab=10, bd=20 주소값만 전달 call by reference return a+b print(addvalue(10,20)) # 호출시 데이터는 힙에 저장 => 주소값만 전달 print(addvalue(30,40)) #
30 70 30 70
def reg(a,b,x): return a*x + b print(reg(10,30,100)) def reg2(x): a = 10 b = 30 return a*x+b print(reg2(100))
1030 1030
# 두수를 더한 값이 10보다 큰지 확인하시오 a=10 b=20 result=a+b if result >= 10: result = "10보다 크다" else: result = "10보다 작다" print(result)
10보다 크다
def sum_1(a,b): result=a+b if result >= 10: result = "10보다 크다" else: result = "10보다 작다" return result sum_1(10,20)
'10보다 크다'
a=10 b=20 print(a,b) def re(c): a=30 b=40 return a,b print(re(c))
10 20 (30, 40)
a=10 b=20 def swap(x,y): # 함수는 여러개의 값을 리턴할 수 있음. return y,x a,b = swap(a,b) print(ab) x = swap(a,b) # 함수가 리턴하는 값은 튜플임. print(x) type(x)
(20, 10) (10, 20)
[54]:
tuple
# 두 수를 입력받아 +,-,* 하는 함수 3개를 작성하시오. # add, subtract, multiply def add(x,y): return x+y print(add(10,20)) def subtract(x,y): return x-y print(subtract(10,20)) def multiply(x,y): return x*y print(multiply(10,20)) # 함수는 일급함수 : 함수가 매개변수로 전달가능, 리턴값으로 가능 def changefun(g,a,b): return g(a,b) print('결과 : ', changefun(add,10,20)) #sort (key함수 전달 ) print('결과 : ', changefun(subtract,10,20)) print('결과 : ', changefun(multiply,10,20))
30 -10 200 결과 : 30 결과 : -10 결과 : 200
def changeme(mylist): # mylist = mylist주소 mylist.append([1,2,3,4]); # 대입이 벌어지면 call by value print("함수내부에서 출력 : ", mylist) return mylist = [10,20,30] # heap에 저장, 이유 : 주소값이 넘어갔기 때문에 call by reference changeme(mylist) print("함수 외부에서 출력 : ", mylist)
함수내부에서 출력 : [10, 20, 30, [1, 2, 3, 4]]
함수 외부에서 출력 : [10, 20, 30, [1, 2, 3, 4]]
# 변동 매개변수 : def func1(*args): # list가 옴. for i in args: print(i, end=',') print() print('시작') func1(1,2,3) func1(1,2,3,4,5,6,7,8,9,10)
시작
1,2,3,
1,2,3,4,5,6,7,8,9,10,
def say_hello_then_call(f, *args, **kwargs): print('args is ', args) print('kwargs is ', kwargs) print("Hello Now I'm going to call %s" % f) # 함수가 위치한 주소값 return f(*args, **kwargs) def g(x,y,z=1): # 디폴트 매개변수 print(x) print(y) print(z) return (x+y) /z say_hello_then_call(g,1,2,z=5.)
def func_test2(a,b=0): print(a,b) func_test2(1) # a=1,b=0 func_test2(1,2) # a=1, b=2 func_test2(b=2,a=1) # 키이 매개변수
1 0
1 2
1 2
def func_test4(): # None 객체 pass # 몸통을 미지정 # == 숫자나 문자, # 객체를 비교할 때는 is 함수 result = func_test4() result is None
True
result.__class__ # 멤버변수, 시스템에서 생성한 변수
NoneType
func_test4.__class__
function
def func_test3(a,b): return a+b, a-b, a*b a,b,c = func_test3(10,5) print(a,b,c); print(type(func_test3)) # 함수도 객체다.
15 5 50
<class 'function'>
# 커링 def all_number(x,y): return x+y add_five=lambda y: all_number(5, y) # 무명함수 -> 유명함수 print(add_five(10))
15
# 문제 : 두 점 사이의 거리값을 구하는 함수를 작성하시오. import math #math.sqrt() def pp(x1,y1,x2,y2): x = x2-x1 y = y2-y1 di = math.sqrt(x**2 + y**2) # 피라고리스 정리 return di pp(10,10,27,20)
19.72308292331602
# 문제 : 두 점 사이의 거리값을 구하는 함수를 작성하시오. import math #math.sqrt() def point(x1,y1,x2,y2): # 두점사이의 거리계산 dx = x1 - x2 dy = y1 - y2 dist = math.sqrt(dx**2 + dy**2) return dist print(point(1,1,2,2)) ?point
1.4142135623730951
# 수학에서 factorial 5! = 5*4*3*2*1 def factorial(n): sum = 1 # 항등원 : 덧셈의 항등원 0, 곱셈의 항등원 1, 행렬의 항등원 : 단위행렬 for i in range(n,1,-1): sum *= i return sum factorial(5)
120
# 재귀함수 : 함수가 자기자신 함수를 호출 def fact(n,stop=1): if n <= stop or n <= 0: # 종료조건, 입력제한 return 1 return n*fact(n-1,stop) fact(6)
720
# power 함수를 구현하시오 (2^10) # pow(2,10) def power(r,n): value = 1 for i in range(1, n+1): value = value * r return value print(power(2,10))
1024
def power2(r,n): if n == 1: # 종료조건, 입력제한 return r else: return r * power2(r,n-1) print(power(2,10))
1024
# 내부함수 def outer(): def inner(): print('inner') inner() def inner(): print("global inner") outer() inner()
inner
global inner
# generator # for in : Collections(list, tuple, dict, set), iterator(range), generator, eneumerate import random def gaus_dist(n): while n > 0: yield random.random() # 비동기 호출함수 0~1 n-=1 gd = gaus_dist(5) for i in gd: print(i)
0.996320710737567
0.29323385097747523
0.980975913258051
0.9682891091015398
0.42218917445056303
# 함수가 값을 저장할 수 있을까? # clouser ( 자바스크립트에서 사용하던 방식 ) : 값을 저장하는 방법 def cook(name): def recipe(no): print("%s's recipe no.%d" % (name,no)) return recipe python_recipe = cook('python') perl_recipe = cook('perl') python_recipe(1) perl_recipe(2) id(python_recipe), id(perl_recipe)
python's recipe no.1
perl's recipe no.2
(2953133134472, 2953133134616)
# clouser 클로저의 응용(장식자 : decorator) def format_and_pad(template, space): def formatter(x): return (template % x).rjust(space) return formatter fmt=format_and_pad('%.4f', 15) print(fmt(1.756)) print(fmt(2.222)) fmt2=format_and_pad('%d', 15) print(fmt2(1.756))
1.7560
2.2220
1
# 데이터를 입력받아 # 삼각형의 넓이 (밑변 * 높이 / 2) # 사각형의 넓이 (밑변 , 높이) # 원의 넓이를 계산하는 함수를 작성해라 (반지름) def sam(x,y): return (x*y)/2 samgack = float(input(" 삼각형의 밑변을 입력하시오 : ")) samgack2 = float(input(" 삼각형의 높이를 입력하시오 : ")) print(sam(samgack,samgack2))
삼각형의 밑변을 입력하시오 : 5
삼각형의 높이를 입력하시오 : 10
25.0
# 사각형의 넓이 def sagac(x,y): return x*y samgac = float(input(" 사각형의 밑변을 입력하시오 : ")) samgac2 = float(input(" 사각형의 높이를 입력하시오 : ")) print(sagac(samgac,samgac2))
사각형의 밑변을 입력하시오 : 5
사각형의 높이를 입력하시오 : 8
40.0
import math def cal_tri(mylist): return mylist[0] * mylist[1]/2 def cal_rec(mylist): return mylist[0] * mylist[1] def cal_cir(mylist): return math.pi * (mylist[0] ** 2) mylist = [] width = eval(input("밑변이나 반지름으로 사용할 값을 입력하시오 ")) height = eval(input(" 삼각형이나 사각형의 높이를 입력하시오")) mylist.append(width) mylist.append(height) print("삼각형의 넓이는", cal_tri(mylist)) print("사각형의 넓이는", cal_rec(mylist)) print("원의 넓이는 ", cal_cir(mylist))
밑변이나 반지름으로 사용할 값을 입력하시오 5
삼각형이나 사각형의 높이를 입력하시오 6
삼각형의 넓이는 15.0
사각형의 넓이는 30
원의 넓이는 78.53981633974483
# 시간과 시간당 급여를 입력받아 주급을 계산하는 프로그램을 작성하시오. # - 조건 : 40시간이 넘으면 1.5배를 지급 # - 매개변수(시간,시간당 급여) def sigup(x,y): return x*y def sigupover(x,y): z = x*1.5 return (y*z) sig = eval(input("시급을 입력하시오.")) work = eval(input("일하는시간을 입력하시오.")) if work >=40: print("당신의 주급은 40시간 초과로 1.5배입니다.", sigupover(sig,work)) else: print("당신의 주급입니다.", sigup(sig,work))
시급을 입력하시오.8500
일하는시간을 입력하시오.45
당신의 주급은 40시간 초과로 1.5배입니다. 573750.0
basictime = 40 def pay(wage, hours): if hours <= basictime: amount = wage * hours else: amount = (wage * basictime) + ((1.5)* wage * (hours - basictime)) return amount wage = eval(input("시간당 급여는 : ")) work = eval(input("주간 총 근무시간 : ")) earnings = pay(wage,work) print("주간 수입은 : {0:,.2f}원". format(earnings))
시간당 급여는 : 15
주간 총 근무시간 : 15
주간 수입은 : 225.00원
# 이자율이 주어졌을 때 기간거치후의 총액과 이자수익을 출력하시오 # 복리계산 = 원가 * (1 * 0.04) = 복리) ** 거치년수 # 원가1 + 이율 0.04 ** 거치년수 # 매개변수 :원금,거치기간 # 단서 조건 : 입력 함수, 계산함수 , 출력함수로 분리해서 작성하시오. rate = 0.04 def getinput(): #입력 principal = eval(input("예금액 :")) numberOfYears = eval(input("기간: ")) return (principal,numberOfYears) def balance(prin,num): #처리 balan = prin * ((1+rate) ** num) # 원금포암 이자 계산액 inter = balan - prin return (balan,inter) def display(bal, intE): # 출력 print("예금총액 : \{0:,.2f} 이자총액 : \{1:,.2f}". format(bal,intE)) def mainaa(): principal, num = getinput() bal, intE = balance(principal, num) display(bal, intE) mainaa() # display(*(balance(*(getinput()))))
예금액 :500
기간: 50
예금총액 : \3,553.34
이자총액 : \3,053.34
# 함수화 프로그래밍 for + 함수를 적용 # lambda 함수를 이용한 처리가 많음. (lambda x: x*x )(10) incr = lambda x, incr=1: x+incr # 무명함수 -> 유명함수 print(incr(10)) incr(10,)
11
11
strings=['foo','cars','bar','aaaa','abab'] # 정렬기준을 key에 함수로 전달 () strings.sort(key=lambda x: len(set(list(x)))) # 중복되지 않는 데이터 개수에 따라 print(strings) # key는 defalt 매개변수였음.
['aaaa', 'foo', 'abab', 'bar', 'cars']
# 디폴트가 없기 때문에. m = map(lambda x: x*x, [3,4]) # 고유한 포멧으로 출력 무조건 처음에 함수가 와야함 print(m) print(list(m)) # 리스트로 캐스팅해야 출력
<map object at 0x000002AF9640B508>
[9, 16]
list(map(lambda x: x*x, range(5)))
[0, 1, 4, 9, 16]
sqr = lambda x: x*x list(map(sqr, range(5)))
[0, 1, 4, 9, 16]
# 문제 : 다음 출근 시간 데이터에 대하여 기본금 10000원, 시간당 7500원의 급여를 계산 # lambda와 map 함수를 이용하여 구하시오. total_time = [160,150,120,180,300,400] calc = lambda x: 10000 + 7500 *x pay = list(map(calc, total_time)) print(pay) pay2 = list(map(lambda x: 10000+7500 *x, total_time)) print(pay2)
[1210000, 1135000, 910000, 1360000, 2260000, 3010000]
[1210000, 1135000, 910000, 1360000, 2260000, 3010000]
def odd(p): return [i for i in p if i%2] odd(range(10))
[1, 3, 5, 7, 9]
# 필터의 함수는 True/False 를 리턴하는 함수여야함. def add(k): return k%2 print(list(filter(add, range(10))), end = '')
[1, 3, 5, 7, 9]
# 문제 : 1부터 99사이의 데이터중 3으로 나누어 떨어지는 데이터를 filter를 이용해 # 구하시오. def add(k): return k%3 == 0 print(list(filter(add, range(1,100))), end = '')
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
# reduce (분산처리시 값을 합계) from functools import reduce reduce(lambda x,y: x+y, range(11)) # 이전에 계산된값이 x로
55
reduce(lambda x,y: x*y, range(1,10)) # 이전에 계산된값이 x로
362880
reduce(lambda x,y: y+x, 'abcde')
'edcba'
# 함수 배열 func_choice = [lambda x,y: x**y, lambda x,y: x/y] func_choice[0](10,2) func_choice[1](10,2)
5.0
# 문제 1) 다음 데이터에서 4보다 큰 수 만 출력하도록 filtering해 보시오 data = [1,2,3,4,5,6,7,8,3,4,2,1] fil = list(filter(lambda x: x>4,data)) print(fil)
[5, 6, 7, 8]
# 문제2) 숫자를 입력 받아서 홀수 인 경우는 " 나는 행복 합니다." 라고 출력하고 # 짝수인 경우는 "나는 귀중한 사람이다" 라고 출력하는 함수 선택을 구현해 보시오. # hang = ["나는 행복합니다. ", "나는 귀중한 사람이다."] # ha = int(input("숫자입력.")) # def hang2(k): # return k%2 == 0 # print(hang2(ha)) func = [lambda:print("나는 귀중한 사람입니다."),lambda:print("나는 행복합니다. ")] con = eval(input(" 숫자 입력 ")) con %=2 func[con]()
# 성적 프로그램을 입력, 처리, 출력 함수를 이용해서 구현하시오 # 이름, 국어, 영어, 수학, 총점, 평균 sungjuk=[] # 전역함수 def input1(): name = str(input("이름을 입력하시오 : ")) kor = int(input("국어점수를 입력하시오 : ")) eng = int(input("영어점수를 입력하시오 : ")) math = int(input("수학점수를 입력하시오 : ")) return name,kor,eng,math def hap(kor,eng,math): total = kor+eng+math aver = total/3 return total,aver def main(): name, kor, eng, math = input1() total, aver = hap(kor,eng,math) return print("이름 : ", name,"\n","국어점수 : ",kor, "영어점수 : ",eng, "수학점수 : ", math, "총점 : ", total, "평균 : ", round(aver,2)) main()
이름을 입력하시오 : 임준영
국어점수를 입력하시오 : 85
영어점수를 입력하시오 : 85
수학점수를 입력하시오 : 85
이름 : 임준영 국어점수 : 85
영어점수 : 85 수학점수 : 85
총점 : 255 평균 : 85.0
반응형'Programming > Python' 카테고리의 다른 글
Python 기초 공부 - 5 (mariaDB 연동) (0) 2021.03.07 Python 기초 공부 - 4 (0) 2021.03.06 Python 기초 공부 - 2 (0) 2021.03.04 Python 기초 공부 - 1 (0) 2021.03.04 Python PEP8 요약 (0) 2021.02.06