파이썬을 이용한 수식 계산

이번 장에서는 파이썬을 이용해서 간단한 수식 계산을 하는 방법을 배우게 됩니다. 다음과 같은 개념들에 대해서 익히게 됩니다.

  • 수학 연산

  • 변수

  • 객체

  • 텍스트와 출력

특별한 언급이 없으면 모든 코드는 주피터 노트북에서 실행됩니다.

간단한 수식 계산

사칙연산은 다음과 같이 합니다.

In [1]: 2 + 3
Out[1]: 5
In [2]: 2 - 3
Out[2]: -1

곱하기는 별표 *를 이용합니다.

In [3]: 2 * 3
Out[3]: 6

나누기는 슬래시 /를 이용합니다.

In [4]: 2 / 3
Out[4]: 0.6666666666666666

결과에서 보는 바와 같이 실수값이 나옵니다. 정수 나눗셈의 몫을 구하고 싶으면 //를 사용합니다.

In [5]: 2 // 3
Out[5]: 0

또한 정수의 나머지를 구하려면 % 기호를 사용합니다.

In [6]: 2 % 3
Out[6]: 2

거듭제곱은 별표 2개 **를 사용합니다. 즉 \(2^3\)은 다음과 같이 합니다.

In [7]: 2 ** 3
Out[7]: 8

제곱근은 1/2 제곱을 사용할 수도 있고 math 패키지의 sqrt() 함수를 사용할 수도 있습니다.

In [8]: 2 ** 0.5
Out[8]: 1.4142135623730951

직접하기

  1. \(\sqrt[3]{2}\)을 코드로 나타내 보세요.

수식 연산 순위

여러 연산자를 함께 사용할 때 연산 우선 순위는 수학에서 사용하는 것과 같은 순서를 따릅니다. 소괄호 > 거듭제곱 > 곱셈/나눗셈 > 덧셈/뺄셈 순서로 연산이 됩니다.

다음은 연산 우선 순위에 대한 결과입니다. 곱셈이 덧셈보다 우선합니다.

In [9]: 2 + 3 * 5
Out[9]: 17

괄호는 모든 연산자보다 우선합니다.

In [10]: (2 + 3) * 5
Out[10]: 25

직접하기

  1. \(\dfrac{5}{9} + \dfrac{2a^4}{3}\)의 연산 순위를 차례로 써보고, 파이썬으로 작성하고, a = 3 일 때 결과를 구해보세요.

변수

숫자를 직접 입력하여 계산하는 것보다는 숫자 대신에 문자나 기호를 사용하는 경우를 흔하게 볼 수 있습니다.

직사각형의 넓이를 구할 때 다음과 같이 표현하는 것을 알 수 있습니다.

\[A = w \times h\]

여기서 \(A\) 는 넓이, \(w\) 는 가로, \(h\) 는 세로를 의미합니다. 수학에서도 수를 대신하는 문자들을 변수 variable라고 하듯이 프로그래밍 언어에서도 변수라고 부릅니다.

할당문

수학에서는 변수에 보통 숫자가 대입되지만 프로그래밍 언어에서는 변수에 다양한 것들이 대입될 수 있습니다. 파이썬에서 변수는 뭔가를 넣을 수 있는 상자라고 생각할 수 있습니다.

가로가 10이고 세로가 20인 직사각형의 면적을 구하기 위해서는 \(w = 10\), \(h = 20\)라고 입력하고 다음과 같이 사용할 수 있습니다.

In [11]: w = 10
   ....: h = 20
   ....: A = w * h
   ....: print(A)
   ....: 
200
  • 등호 =는 수학에서 같다를 의미하지만, 파이썬에서는 = 오른쪽에 있는 값을 왼쪽에 대입하라는 뜻입니다. 이것을 대입 또는 할당 연산자라고 부릅니다. 등호 오른쪽 식이 먼저 평가되어 값을 구한 후, 왼쪽 변수에 값을 할당합니다.

    In [12]: myvar = 10
       ....: myvar = 3 * myvar
       ....: myvar
       ....: 
    Out[12]: 30
    
  • print()는 괄호 안에 있는 변수들의 값을 출력하는 파이썬 함수입니다. 함수에 대해서는 함수에서 자세히 설명합니다.

앞에서 사용했던 동일한 변수에 다른 값을 대입할 수도 있습니다. 그러면 가장 마지막에 대입된 값을 변수가 가지게 됩니다.

In [13]: print(w) # 이전값 w = 10 출력
   ....: w = 2
   ....: print(w)
   ....: 
10
2

더 자세한 것은 파이썬 한입: 변수를 확인하세요.

직접하기

  1. w = 5, h = 4로 바꾸고 면적을 계산해보세요.

변수 이름 규칙

변수 이름 및 함수, 클래스 이름 등 파이썬에서 구별하는 데 사용하는 이름을 식별자 identifier라고 합니다. 식별자 이름은 다음과 같은 규칙을 지켜야합니다.

  • 영문자(A - Z, a - z), 유니코드(한글 포함) 및 밑줄 _과 숫자를 사용할 수 있습니다.

  • 숫자는 식별자 맨 처음에 올 수 없습니다.

  • 대/소문자를 다르게 인식합니다. (예를 들면, aA는 다른 변수입니다.)

  • 파이썬 예약어를 사용할 수 없습니다.

  • 특수문자들 !, @, #, $, % 및 공백문자 등을 사용할 수 없습니다.

  • 식별자의 길이는 무제한 입니다.

올바른 변수 이름 예제

변수 이름

설명

name1

숫자는 첫글자가 아니면 사용가능합니다.

my_name

밑줄 _ 문자 가능합니다.

myName

소문자 대문자 함께 사용 가능합니다.

Class

첫문자가 대문자라서 예약어 class와 다르므로 사용가능합니다.

변수1

한글도 변수 이름으로 가능합니다.

잘못된 변수 이름 예제

변수 이름

설명

1name

숫자는 첫글자로 사용될 수 없습니다.

my name

공백 문자는 사용할 수 없습니다.

x$

특수문자 $는 사용할 수 없습니다.

class

파이썬 예약어는 사용할 수 없습니다.

강제는 아니지만 다음과 같이 이해할 수 있는 변수 이름을 사용하는 것이 좋습니다.

initial_velocity = 5
accel_of_gravity = 9.81
TIME = 0.6
VerticalPositionOfBall = initial_velocity*TIME - \
                         0.5*accel_of_gravity*TIME**2
print VerticalPositionOfBall
  • 위에서 줄의 맨 끝에 있는 백슬래시 \는 다음 줄과 이어지는 것을 나타낼 때 사용합니다.

직접하기

  1. 다음은 자유 낙하하는 물체의 높이 공식입니다.

    \[\begin{split}v_0=5,\quad g=9.81,\quad t=0.6 \\ \quad y = v_0t -\frac{1}{2}gt^2\end{split}\]

    위의 식을 파이썬을 이용해서 y 값을 구해보세요.

파이썬 예약어

파이썬이 미리 예약해둔 문자열은 변수로 사용할 수 없습니다. 다음은 파이썬 예약어 1들입니다.

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

수식 연산 단축 표현

주어진 변수에 다른 연산을 하여 값을 변경하는 것을 다음과 같이 사용할 수도 있습니다.

In [14]: a = 10
   ....: a = a + 20
   ....: print(a)
   ....: 
30

위와 같은 연산을 줄여서 다음과 같이 사용할 수 있습니다.

In [15]: a = 10
   ....: a += 20
   ....: print(a)
   ....: 
30

덧셈 뿐 아니라 다른 여러 연산자들도 마찬가지로 사용할 수 있습니다.

수식 단축 연산자

연산자

예제

설명

+=

x += y

x = x + y

-=

x -= y

x = x - y

*=

x *= y

x = x * y

/=

x /= y

x = x / y

%=

x %= y

x = x % y

**=

x **= y

x = x ** y

//=

x //= y

x = x // y

직접하기

a = 2 일 때 다음을 단축 연산자를 이용하여 코딩하고 a를 출력하세요.

  1. a = a - 5

  2. a = a * 3

  3. a = a / 3

  4. a = a ** 3

  5. a = a % 3

  6. a = a // 3

주석

여러 줄에 걸쳐서 코딩을 하다보면 어떤 내용인지를 설명해야할 필요가 생깁니다. 이 때 # 기호를 이용하면 파이썬이 # 다음의 내용은 무시하고 컴파일을 합니다. 즉, 프로그램에 아무 영향도 미치지 않습니다.

다음은 주석 comment이 들어간 프로그램입니다.

In [16]: # 수직 낙하하는 공의 위치 계산
   ....: v0 = 5    # 초기 속도
   ....: g = 9.81  # 중력 가속도
   ....: t = 0.6   # 시간
   ....: y = v0*t - 0.5*g*t**2  # 높이
   ....: print(y)
   ....: 
1.2342

거의 모든 것은 객체

파이썬 실행에 사용되는 거의 모든 것들은 객체입니다. 객체는 프로그래밍 언어마다 다르게 정의하지만, 일반적으로 객체속성 attribute메소드 method를 포함하고 있습니다. 속성은 데이터를 담는 데, 사용되고 메소드 또는 함수는 데이터를 이용하여 원하는 작업을 하는데 사용됩니다.

모든 객체들은 타입 type 이 존재합니다. 앞에서 사용된 숫자들도 정수형, 실수형, 복소수형 complex 등으로 구분됩니다.

객체를 타입으로 구분하는 이유는 타입에 따라서 사용되는 기능들이 다르기 때문입니다. 기본 타입들에 대해서 알아봅니다.

정수 타입

정수 타입을 만드는 방법은 보이는 그대로(리터럴 literal) 정수형 숫자를 사용하는 방법과 int라는 함수를 이용하는 방법이 있습니다.

다음은 정수 리터럴입니다.

3
-3

2진법, 8진법, 16진법 숫자로 리터럴 정수를 나타낼 수 있습니다. 2진번은 0b 또는 0B, 8진법은 0o 또는 0O, 16진법은 0x 또는 0X를 숫자 앞에 사용합니다.

0b101 # 10진법 5
0O17  # 10진법 15
0xa7  # 10진법 167

참고로 int(str, base) 함수를 이용해서 주어진 진법 base에 대해서도 정수형으로 변환해서 사용할 수 있습니다.

실수 타입

실수 타입 float부동소수점형이라고 불리며, 정수형과 마찬가지로 리터럴과 float() 함수를 이용해서 실수형을 만들 수 있습니다.

1.123
float('1.234')

정수 + 정수 = 정수이지만 정수 / 정수 = 실수입니다.

정수는 수학에서 사용하는 정수이고 파이썬에서 실수를 표현할 때는 소수점을 사용하면 됩니다.

3   # 정수
3.0 # 실수
3.  # 실수

변수는 객체를 가리키는 역할을 합니다.

In [17]: a = 5       # a 는 정수 (int) 객체
   ....: b = 9       # b 는 정수 (int) 객체
   ....: c = 9.0     # c 는 실수 (float) 객체
   ....: d = b/a     # d 는 정수/정수 => 실수 객체
   ....: e = c/a     # e 는 실수/정수 => 실수 객체
   ....: s = 'b/a={:g}'.format(b / a)  # s 는 문자열 객체
   ....: print(d, e, s)
   ....: 
1.8 1.8 b/a=1.8

복소수

복소수 \(2 + 3i\) 는 파이썬에서는 2 + 3j로 표현합니다. 허수를 표시하는 단위인 \(i\)는 파이썬에서 j를 사용합니다.

In [18]: w = 2 + 3j
   ....: w
   ....: 
Out[18]: (2+3j)

complex() 함수를 이용할 수도 있습니다.

In [19]: a = -2
   ....: b = 0.5
   ....: s = complex(a, b)  # complex() 이용
   ....: s
   ....: 
Out[19]: (-2+0.5j)

복소수 곱

In [20]: s * w # complex*complex
Out[20]: (-5.5-5j)

복소수 나눗셈

In [21]: s / w # complex/complex
Out[21]: (-0.1923076923076923+0.5384615384615385j)

복소수의 실수, 허수 성분은 real, imag 속성을 이용합니다.

In [22]: s.real
   ....: s.imag
   ....: 
Out[22]: 0.5

문자열

출력이나 입력으로 텍스트를 다루기 위해서 많이 사용되는 것이 문자열입니다. 파이썬 문자열은 리터럴 문자열과 str() 함수를 사용하여 만들 수 있습니다. 리터럴 문자열은 작은따옴표 ', 큰따옴표 ", 또는 세겹 따옴표 """를 이용해서 만듭니다.

'abcd'
"문자열입니다"
"""
  문자열
  입니다.
"""

문자열에 작은 따옴표를 표시하기를 원하거나 큰따옴표를 표시하기 원할 때는 각각 큰따옴표와 작은따옴표를 사용하면 됩니다.

In [23]: print("Jiwon's Blog")
   ....: print('"역동적"인 움직임')
   ....: 
Jiwon's Blog
"역동적"인 움직임

세겹 따옴표 문자열

세겹 따옴표 """을 이용하면 여러 줄에 걸친 출력을 할 수 있습니다.

In [24]: print("""
   ....: 파이썬 코딩은
   ....: 배우기 쉽습니다.
   ....: """)
   ....: 

파이썬 코딩은
배우기 쉽습니다.

작은따옴표와 큰따옴표를 이용해 여러 줄에 출력하려고 하면 다음과 같이 에러가 발생합니다.

In [25]: print("에러
   ....: 발생")
   ....: 
  File "<ipython-input-25-2585e27e9d88>", line 1
    print("에러
             ^
SyntaxError: EOL while scanning string literal

여러 줄에 출력하기를 원하면 탈출문자 escape character를 사용하면 됩니다.

탈출 문자

탈출 문자 escape character란 역슬래시 back slash \ 와 그 다음에 오는 문자로 이루어지며 특별한 의미를 갖습니다. \n은 엔터 Enter를 치는 효과를 갖고 \t는 탭 Tab을 누르는 효과를 갖습니다.

In [26]: print("안녕!\n만나서 반가워요.")
안녕!
만나서 반가워요.
In [27]: print("이름\t전화번호\t주소")
이름	전화번호	주소

따옴표로 둘러싸인 문자열 안에서 따옴표를 표시하고 싶을 때는 다음과 같이 역슬래시를 사용할 수 있습니다.

In [28]: print("\"안녕\"이라고 말씀하세요.")
"안녕"이라고 말씀하세요.

형식 문자열

파이썬에서 형식 문자열을 이용하면 계산된 숫자의 출력을 원하는 모양으로 변경할 수 있습니다.

형식 문자열 format string이란 문자열이 f 또는 F로 시작하는 문자열을 의미하며, 문자열 안에 중괄호 {}를 포함할 수도 있습니다. 중괄호 안에는 표현식이 들어갈 수 있습니다.

형식 문자열 리터럴

형식 문자열 리터럴을 사용하여 문자열에 표현식 값을 삽입할 수 있습니다. 형식 문자열 리터럴은 문자열 시작할 때 f 또는 F를 붙여서 만듭니다.

In [29]: fmt_str = f'1 + 2 = {1 + 2}'
   ....: print(fmt_str)
   ....: 
1 + 2 = 3
In [30]: fruit = "사과"
   ....: count = 5
   ....: print(f"{fruit}{count}개 있습니다.")
   ....: 
사과가 5개 있습니다.

형식 문자열 format 메소드

형식 문자열과 format() 메소드를 이용해서 중괄호에 들어가는 것을 편리하게 원하는 형식으로 변경할 수 있습니다.

In [31]: fmt_str = '이름은 {} 이고 나이는 {}세 입니다.'
   ....: print(fmt_str.format('지원', 20))
   ....: 
이름은 지원 이고 나이는 20세 입니다.

fmt_str.format('지원', 20)도 문자열입니다.

형식 문자

중괄호 안에 콜론 : 에 이어, 형식 문자를 입력하여 출력 형식을 지정할 수 있습니다.

In [32]: t = 0.6;  y = 1.2342
   ....: print(f't={t:g} 초일 때, y는 {y:.2f} 미터입니다.')
   ....: 
t=0.6 초일 때, y는 1.23 미터입니다.

{:.2f}는 소수점 아래 2자리까지 표시하라는 뜻입니다.

형식 문자열에 사용되는 형식 문자는 다음과 같습니다.

형식 문자

문자

설명

g

간결한 실수형

f

실수형 (-34.674)

10.3f

길이 10이고 소수점 아래 3자리

.3f

소수점 아래 3자리

e or E

과학 표현식 (1.42e-02 또는 1.42E-02)

9.2e

길이 9이고 소수점 아래 2자리

d

정수

5d

길이 5인 정수 표현

s

문자열

-20s

길이가 20인 왼쪽 정렬 문자열

자세한 것은 파이썬 문서 - 형식 문자를 참조하세요.

직접하기

  1. 숫자 1.23456를 형식 문자를 이용해서 1.23 만 출력하세요.

  2. 숫자 12345000을 형식 문자를 이용해서 1.234E+07로 출력하세요.

타입 변환

객체 사이에 타입(형) 변환이 가능합니다. 각 타입에 주어진 함수들을 이용할 수 있습니다.

In [33]: a = 3              # a 는 int
   ....: b = float(a)       # b 는 float
   ....: c = 3.9            # c 는 float
   ....: d = int(c)         # d 는 int 3
   ....: d = round(c)       # d 는 float 4.0
   ....: d = int(round(c))  # d 는 int 4
   ....: d = str(c)         # d 는 str '3.9'
   ....: e = '-4.2'         # e 는 str
   ....: f = float(e)       # f 는 float -4.2
   ....: 

정수와 실수형 연산을 하면 정수는 실수형으로 자동으로 변환되어 계산이 됩니다.

In [34]: x = 100 + 11.0
   ....: type(x)
   ....: 
Out[34]: float

객체의 타입을 알아보기 위해서 type() 함수를 이용합니다.

In [35]: type(1)
Out[35]: int
In [36]: type(1.0)
Out[36]: float
In [37]: type("abcd")
Out[37]: str

파이썬 기본 문법

프로그램은 문장으로 구성

프로그램 실행의 단위가 문장 statement 또는 입니다.

a = 1      # 첫번째 문장 (할당 문장)
b = 2      # 두번째 문장 (할당 문장)
c = a + b  # 세번째 문장 (할당 문장)
print(c)   # 네번째 문장 (출력 문장)

파이썬에서는 일반적으로 한 줄에 한 문장을 사용합니다. 여러 문장을 한 줄에 사용하려면 세미콜론을 사용하여 구분합니다.

a = 1;  b = 2;  c = a + b;  print(c)

공백

파이썬 프로그램에서 공백은 상황에 따라 다르게 적용이 됩니다.

다음과 같은 경우는 공백은 문제가 되지 않습니다. 다음 문장은 모두 같은 것을 의미합니다.

v0=3
v0  =  3
v0=   3
v0 = 3

하지만 코드를 읽기 편하게 등호 앞뒤로 공백을 주는게 좋습니다.

다음과 같은 경우는 공백이 문제가 됩니다. while, for, if, def 문들은 들여쓰기를 이용해서 자신만의 구역이라는 것을 구분합니다.

counter = 1
while counter <= 4:
  counter = counter + 1   # 옳은 문법

다음은 잘못된 문법입니다.

In [38]: while counter <= 4:
   ....: counter = counter + 1  # 공백(들여쓰기 필요)
   ....: 
  File "<ipython-input-38-0d4155da4772>", line 2
    counter = counter + 1  # 공백(들여쓰기 필요)
    ^
IndentationError: expected an indented block

입력 및 출력

입력

사용자로부터 값을 입력받을 때는 input() 함수를 이용할 수 있습니다. input() 함수는 문자열을 반환합니다.

다음과 같이 숫자 100을 입력했지만 문자열 str 이라는 것을 알 수 있습니다.

In [39]: x = input('입력하세요:');
   ....: type(x)
   ....: 
입력하세요:100
Out[39]: str

입력한 값이 숫자이더라도 문자로 인식하기 때문에 숫자로 사용하기 위해서는 타입 변환을 해야 합니다.

In [40]: int(x) + 10
Out[40]: 110

출력

출력은 print() 함수를 이용합니다. print() 함수에는 여러 가지 인수를 입력할 수 있습니다.

그 중 sep=은 구분하는 문자열을 지정할 수 있고, end= 인수는 마지막 문자열을 지정할 수 있습니다.

In [41]: print('x', 'y', sep='는', end='입니다.\n')
x는y입니다.

print() 문은 형식 문자열과 함께 사용하면 원하는 형식으로 출력할 수 있습니다.

오류 발생

모든 프로그램밍은 정확한 문법을 지켜야합니다.

다음은 2개의 오류를 가지고 있습니다. 첫번째는 print 문을 잘못 입력했고, 두번째는 myvar 이름을 잘못 사용한 것입니다.

In [42]: myvar = 5.2
   ....: prinnt(Myvar)
   ....: 
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-42-42f6d3aefda7> in <module>
      1 myvar = 5.2
----> 2 prinnt(Myvar)

NameError: name 'prinnt' is not defined

2개의 오류가 있지만 첫번째 오류만 보고가 되며 멈춥니다. 이러한 오류를 처리하지 않으면 프로그램이 멈추어 더 이상 진행하지 않습니다. 오류가 발생했을 때 프로그램을 멈추지 않고 처리하는 방법을 예외 처리에서 다루게 됩니다.

기본 수학 함수 모듈

math 모듈

  • \(\sin x\), \(\cos x\), \(\ln x\) 계산?

  • 파이썬 math 모듈

  • 파이썬 필요한 유용한 기능들은 모듈을 이용할 수 있습니다. 반드시 import를 해야 합니다.

\(\sqrt{2}\)math 모듈의 sqrt 함수를 이용해서 구합니다.

In [43]: import math
   ....: r = math.sqrt(2)
   ....: # or
   ....: from math import sqrt
   ....: r = sqrt(2)
   ....: # or
   ....: from math import *   # import everything in math
   ....: r = sqrt(2)
   ....: 

math 모듈을 사용한 다른 예제

\(x=1.2\) 일 때 다음을 계산합니다.

\[Q = \sin x\cos x + 4\ln x\]
In [44]: import math
   ....: x = 1.2
   ....: Q = math.sin(x) * math.cos(x) + 4 * math.log(x)   # log 는 자연로그 ln (밑이 e)
   ....: print(Q)
   ....: 
1.0670178174513938

오차

0.1을 이진법으로 나타내면 다음과 같이 순환하는 무한소수가 됩니다.

\[0.1 = 0.0001100110011 \ldots ~_{(2)}\]

컴퓨터는 일반적으로 무한 값을 다룰 수 없으므로 적당히 잘라서 사용합니다. 이때 오차가 발생하게 됩니다.

따라서 다음과 같은 계산 결과가 나오는 것을 알 수 있습니다.

In [45]: 0.1 + 0.1 == 0.2
Out[45]: True
In [46]: 0.1 + 0.1 + 0.1 == 0.3
Out[46]: False

주의:

  • 컴퓨터에서 대부분의 실수는 근사값입니다.(소수점 아래 17 자리)

  • 1/49, 1/51 정확한 값을 갖지 않습니다. 일반적으로 오차는 \(10^{-16}\) 입니다.

  • 이러한 오차는 다른 계산할 때 전파될 수 있습니다.

근사값 계산 예제

다음 코드를 실행하면 무엇이 출력되나요?

a = 1; b = 2;
computed = a + b
expected = 3
correct = computed == expected
print('Correct:', correct)

만일 a = 0.1, b = 0.2로 변경하면 무엇일 출력될 것 같은가요? 출력 결과에 대해서 이야기해 보세요.

풀이

In [47]: a = 0.1
   ....: b = 0.2
   ....: expected = 0.3
   ....: a + b == expected
   ....: 
Out[47]: False
In [48]: print('{:.17f}\n{:.17f}\n{:.17f}\n{:.17f}'.format(0.1, 0.2, 0.1 + 0.2, 0.3))
0.10000000000000001
0.20000000000000001
0.30000000000000004
0.29999999999999999

다른 수학 함수 예제

\(\sinh x\) 함수는 다음과 같이 정의됩니다.

\[\sinh (x) = \frac{1}{2}\left(e^{x} - e^{-x}\right)\]

3가지 방법으로 계산이 가능합니다.

  1. math.sinh

  2. math.exp을 조합

  3. math.e을 이용

In [49]: import math
   ....: 
   ....: x = 2 * pi
   ....: r1 = math.sinh(x)
   ....: r2 = 0.5 * (math.exp(x) - math.exp(-x))
   ....: r3 = 0.5 * (math.e ** x - math.e ** (-x))
   ....: print('r1 = {:.16f},\nr2 = {:.16f},\nr3 = {:.16f}'.format(r1, r2, r3))
   ....: 
r1 = 267.7448940410164369,
r2 = 267.7448940410164369,
r3 = 267.7448940410163232

결과: r1: \(267.744894041016\underline{4369}\) r2: \(267.744894041016\underline{4369}\) r3: \(267.744894041016\underline{3232}\)

심볼릭 계산

  • 수치 계산: 수를 가지고 계산

  • 심볼릭 계산: 문자 공식 계산

In [50]: import sympy
   ....: 
   ....: t, v0, g = sympy.symbols('t v0 g')
   ....: y = v0*t - sympy.Rational(1, 2) * g * t ** 2
   ....: dydt = sympy.diff(y, t)                     # 한 번 미분
   ....: dydt
   ....: 
Out[50]: -g*t + v0
In [51]: print('가속도:', sympy.diff(y, t, t))  # 2번 미분
가속도: -g
In [52]: y2 = sympy.integrate(dydt, t)
   ....: y2
   ....: 
Out[52]: -g*t**2/2 + t*v0

더 많은 수학 심볼릭 계산

방정식을 풀 수 있습니다.

In [53]: y = v0*t - sympy.Rational(1, 2) * g * t ** 2
   ....: roots = sympy.solve(y, t)    # 방정식 y = 0를 t에 대해서 풉니다.
   ....: roots
   ....: 
Out[53]: [0, 2*v0/g]

공식을 이용하여 간단히 합니다.

In [54]: x, y = sympy.symbols('x y')
   ....: f = -sympy.sin(x) * sympy.sin(y) + sympy.cos(x) * sympy.cos(y)
   ....: sympy.simplify(f)
   ....: 
Out[54]: cos(x + y)

전개를 합니다.

In [55]: sympy.expand(sympy.sin(x + y), trig=True)  # trigonometric hint
Out[55]: sin(x)*cos(y) + sin(y)*cos(x)

테일러 전개

In [56]: f = sympy.exp(t)
   ....: print(f.series(t, 0, 3))
   ....: f = sympy.exp(sympy.sin(t))
   ....: print(f.series(t, 0, 8))
   ....: 
1 + t + t**2/2 + O(t**3)
1 + t + t**2/2 - t**4/8 - t**5/15 - t**6/240 + t**7/90 + O(t**8)

연습문제

  1. 1 + 3을 계산하세요.

  2. 안녕하세요. 파이썬!을 출력하는 프로그램을 작성하세요.

  3. 백만(\(10^6\))초는 몇 년, 몇 일인지 계산하는 프로그램을 작성하세요.

  4. 미터를 인치, 피트로 변경하는 프로그램을 작성하세요. 작성한 프로그램을 이용해서 640미터를 인치와 피트로 변경하세요. 1인치는 2.54cm로 1피트는 12인치로 계산하세요.

  5. 이자율이 \(p\)이고 원금 \(A\) 일 때 \(n\) 년후의 받을 돈은 다음과 같습니다.

    \[A\left( 1 + p\right)^n\]

    이자율 \(p=0.02\)일 때, 1,000만원을 10년 동안 예금했을 때 받는 돈을 구하세요.

  6. 다음 프로그램에서 에러가 발생한 곳을 찾고, 올바르게 고쳐보세요.

    x = 1
    print('sin({:g}) = {:g}'.format(x, sin(x)))
    
  7. 다음 프로그램 코드를 파일 areas.py로 저장하고 실행해보세요.

    import math
    
    h = 5.0 # 높이
    b = 2.0 # 밑변
    r = 1.5 # 반지름
    
    area_parallelogram = h * b
    print('평행사변형의 넓이는 {:.3f}'.format(area_parallelogram))
    
    area_square = b ** 2
    print('정사각형의 넓이는 {:g}'.format(area_square))
    
    area_circle = math.pi * r ** 2
    print('원의 넓이는 {:.3f}'.format(area_circle))
    
    volume_cone = 1.0 / 3 * math.pi * r ** 2 * h
    print('원뿔의 부피는 {:.3f}'.format(volume_cone))
    
  8. 다음을 실행해보고 에러가 발생하면 에러가 발생한 이유를 말하고, 올바르게 고쳐서 작동하게 만드세요.

    1. \(x= \pi/4\) 일 때, \(\sin^2(x) + \cos^2(x) = 1\) 성립하는지 보이는 프로그램입니다.

      import math
      x = pi / 4
      1_val = sin^2(x) + cos^2(x)
      print(1_VAL)
      
    2. 등가속도 운동의 거리를 구하는 식입니다.

      v0 = 3 m/s
      t = 1 s
      a = 2 m/s**2
      s = v0*t + 1/2 a * t ** 2
      print(s)
      
    3. \(a = 3.3\), \(b = 5.3\) 일 때, 다음 항등식이 성립하는지 보이는 프로그램입니다.

      \[\begin{split}(a + b)^2 = a^2 + 2ab + b^2 \\ (a − b)^2 = a^2 − 2ab + b^2\end{split}\]
      a = 3,3 b = 5,3
      a2 = a**2
      b2 = b**2
      eq1_sum = a2 + 2ab + b2
      eq2_sum = a2 - 2ab + b2
      eq1_pow = (a + b)**2
      eq2_pow = (a - b)**2
      print('First equation: {:g} = {:g}'.format(eq1_sum, eq1_pow))
      print('Second equation: {:g} = {:g}'.format(eq2_pow, eq2_pow))
      
  9. 다음과 같은 가우스 함수에서 \(\mu = 0, \sigma = 2\), \(x = 1\)일 때 함수값을 구하는 프로그램을 작성하세요.

    \[f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-(x - \mu)^2 / (2 \sigma^2)}\]
  10. 다음 프로그램이 작동하지 않는 이유를 설명하세요.

    C = A + B
    A = 3
    B = 2
    print(C)
    
  11. 다음 문장들을 순서대로 실행해보고 에러가 나면 이유를 말하고, 에러를 고쳐보세요.

    1. 1a = 2

    2. a1 = b

    3. x = 2

    4. y = X + 4 # is it 6?

    5. from Math import tan

    6. print(tan(pi))

    7. pi = "3.14159’

    8. print(tan(pi))

    9. c = 4**3**2**3

    10. _ = ((c-78564)/c + 32))

    11. discount = 12%

    12. AMOUNT = 120.-

    13. amount = 120$

    14. address = hpl@simula.no

    15. and = duck

    16. class = 'INF1100, gr 2"

    17. continue_ = x > 0

    18. rev = fox = True

    19. Norwegian = ['a human language']

    20. true = fox is rev in Norwegian

  12. 다음은 2차 방정식

    \[ax^2 + bx + c =0\]

    의 해

    \[x_1 = \frac{-b + \sqrt{b^2 - 4ac}}{2a}, \quad x_2 = \frac{-b - \sqrt{b^2 - 4ac}}{2a}\]

    \(a=2, b=1, c=2\) 일 때, 구하는 프로그램입니다. 잘못된 곳을 모두 찾으세요.

    a = 2; b = 1; c = 2
    from math import sqrt
    q = b*b - 4*a*c
    q_sr = sqrt(q)
    x1 = (-b + q_sr)/2*a
    x2 = (-b - q_sr)/2*a
    print(x1, x2)
    

연습문제 풀이

참조 사이트

1

https://docs.python.org/3/reference/lexical_analysis.html#keywords