ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python 기초 공부 - 3
    Programming/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
Designed by Tistory.