ID:
PW:

     0 분
     8 분

프로그래밍 Tips
프로그래밍에 관한 Tip을 공유하는 곳입니다.


[python] handcalcs 함수도 랜더링 가능.
이석종  2022-08-05 16:17:24, 조회 : 43, 추천 : 2

앞 게시물에서 handcalcs의 기능 중 render에 대해서 소개했다.
이번에는 이 프로그램의 정말 강력한 특히 code자체를 랜더링 한다는 기능으로서 강력한 기능을 소개하고자 한다.

함수를 랜더링한다는 것은 어떤 것을 의미하냐면 우리가 쓰는 수식들을 하나하나 함수로 만들고 그것을 불러오기만 하면 계산과정이 수식으로 표현될 수 있다는 이야기다. 예를 들어 단경간보의 중앙점에서의 모멘트를 구하는 함수를 만들고 또 H형강의 단면계수를 구해주는 함수를 만들었다고 하면 단경간보의 모멘트를 구하는 함수를 한번 부르고, 단면계수를 구하는 함수를 한번 불러서 단면계수를 구한 다음에 모멘트에서 단면계수를 나눠주면 응력을 구할 수 있는 것이다. 물론 응력을 구하는 것도 함수로 만들 수 있다.

예전에 프로그램을 만들 때 값은 값대로 구하고 그 결과를 출력하는 기능을 따로 만들었던 기억이 있는 사람들은 이 기능이 얼마나 편한지 알 수 있을 것이다.

handcalcs에는 @handcalc()라는 데코레이터를 지원한다. 사용법은 간단하다. 자신이 랜더링하고자 하는 함수 앞에 @handcalc()라는 데코레이터만 붙여주면 된다.  아래와 같은 코드를 노트북 셀에 입력하고 실행하면 그 결과를 볼 수 있다.

이 함수는 중공사각형의 단면적(area), 최대 연단거리(e_max), 단면2차모멘트(I), 단면계수(Z)값을 구하는 함수다. def ~부터 함수를 정의하는 부분이다. python에서는 들여쓰기가 중요하다 들여쓰기 된 부분은 def 의 하위 코드라는 뜻이다.
마지막에서 두번째 줄 vals = secprop_hrec(0.5,1.0,0.3,0.8)에서 앞에서 정의된 함수를 호출했다. 호출할 때 b=0.5, h=1.0, b1=0.3, h1=0.8 값을 인자로 입력했다. 즉 두께가 0.1이고 외곽 크기가 0.5x1.0인 중공사각형의 제원을 전달한 것이다.


from handcalcs import handcalc
@handcalc(jupyter_display=True)
def secprop_hrec(b,h,b1,h1):
    b
    h
    b1
    h1
    area = b*h - b1*h1
    e_max = h/2
    I = (b*h**3 - b1*h1**3)/12
    Z = I / e_max
    return locals()

vals=secprop_hrec(0.5,1.0,0.3,0.8)
vals



코드를 살펴보자 @handcalc()데코레이터에 인수로 jupyter_display=True가 입력되어있다. 랜더링을 해달라는 뜻으로 보면 된다.

코드에서 입력한 e_max의 max는 아래첨자로 처리된 것을 확인할 수 있다.

함수 정의의 마지막에 있는 return locals()는 이 함수의 local변수값들을 모두 리턴해달라는 뜻이다. 함수를 call하고 그 결과를 vals에 넣었다. 코드의 마지막 줄에 vals를 출력하도록 했다.

노트북 output에 함수의 return값들이 dict형태로 출력된 것을 볼 수 있다. 이 기능은 함수를 호출하고 난 다음에 그 결과값들을 이용하기 위한 기능으로 보면 되겠다.

위에서 예를 든 것처럼 단면계수를 구했으니 그 결과값 면적,I값, Z값 등을 이용해서 다음 계산을 이어나가면 되는 것이다.

dictionary에 저장된 값을 이용하려면 vals['Z']와 같이 키이름을 이용해서 값을 가져올 수 있다.


  추천하기   목록보기

Copyright 1999-2022 Zeroboard / skin by zero
구조설계의 미래를 준비하는 모임 [구조설계미래포럼]