파이썬3 바이블 - 제3장 연습문제

프리렉 - FREELEC

http://freelec.co.kr/book/catalogue_view.asp?UID=134

이강성저

1. 진법 변환 에러가 무엇인지 정리해 보자.

진법 변환 에러에 대해서는 본문 108-109 참조.

2. 원의 반지름이 주어져 있을 때 원의 면적과 원주의 길이를 계산해 보자.

In [1]:
import math

r = 3.0
print('반지름={}, 원의면적={}, 원주의 길이={}'.format(r, math.pi*r*r, 2*math.pi*r))
반지름=3.0, 원의면적=28.274333882308138, 원주의 길이=18.84955592153876

3. 수학에서 \(e\)와 \(\pi\)는 잘 알려져 있다. \(e\)의 \(\pi\)승과 \(\pi\)의 \(e\)승 중 어느 것이 더 큰가? 참고로 두 상수는 다음과 같다. math 모듈에 정의되어 있다.

\(e = 2.71828182846, pi =3.14159265359\)

In [2]:
from math import e, pi

print(e**pi, pi**e)
23.140692632779263 22.45915771836104

4. 몫을 구하는 연산 2//5과 -2//5, -(2//5)의 결과를 확인하고 각각의 결과가 왜 그렇게 나오는지 설명해 보자.

==> 문제 오류입니다. ///로 대신해야 합니다.

파이썬3에서 /를 true division //를 floor division이라고 부릅니다. //는 실제 나누기한 결과보다 크지 않은 정수를 취합니다.

In [3]:
# 문제 오류이긴 하지만 실행결과를 확인하자면 다음과 같습니다. 쉽게 예측 가능한 결과들입니다.
2/5, -2/5, -(2/5)
Out[3]:
(0.4, -0.4, -0.4)
In [4]:
2//5  # 실제 나눈 결과는 0.4이니 그 이 것보다 크지 않은 정수는 0입니다.
Out[4]:
0
In [5]:
-2//5  # 실제 나눈 결과가 -0.4이니 그 이 것보다 크지 않은 정수는 -1입니다.
Out[5]:
-1
In [6]:
-(2//5) # 이 것은 0의 결과값에 다시 -를 취하는 것이니 그대로 0입니다.
Out[6]:
0

5. 1 and 2 or 3 and 4의 결과가 얼마인지 확인하고 왜 그렇게 결과가 나오는지 설명해 보자.

In [7]:
# 우선 결과부터 확인해봅니다.
1 and 2 or 3 and 4
Out[7]:
2
In [8]:
# 우선순위로 따지자면 다음과 같습니다.
(1 and 2) or (3 and 4)
Out[8]:
2

or 연산은 첫번째 식(1 and 2)의 결과가 참 이므로, 두 번째 식(3 and 4)는 계산하지 않습니다. (1 and 2)에서 and 연산자는 두 피연산자를 진리값을 모두 판단해야 합니다. 모두가 참일 경우만 결과가 참이기 때문입니다. 1, 2 모두 True입니다.

In [9]:
bool(1), bool(2)
Out[9]:
(True, True)

따라서 최종 연산 결과는 마지막으로 평가된 2가 됩니다.

6. 다음 각 값들에 대해서 참과 거짓을 판별해 보자

가) 0.0, 0, 0.0+0.1j
나) " "
다) [ ], [''], [( )], ( ), (( )), (( ), )
라) { }
In [10]:
bool(0.0), bool(0), bool(0.0+0.1j)
Out[10]:
(False, False, True)
In [11]:
bool(" "), bool("")
Out[11]:
(True, False)
In [12]:
bool([]), bool(['']), bool([()]), bool(()), bool( (()) ), bool( ((),) )
Out[12]:
(False, True, True, False, False, True)

7. 키보드로 정수 수치를 입력받고 짝수인지 홀수인지를 판별하는 코드를 비트 연산자를 이용하여 작성해 보자. 참고로 가장 오른쪽에 있는 비트가 1이면 홀수, 0이면 짝수이다.

In [13]:
n = int(input('type an integer number : '))
if n & 0x01:
    print("홀수")
else:
    print("짝수")
type an integer number : 13
홀수

8. 임의의 정수에 대해서 양수인지 음수인지를 판단하는 함수를 비트 연산자를 사용하여 작성해 보자. 참고로 가장 왼쪽에 있는 비트가 0이면 양수이고, 1이면 음수이다.

파이썬3에서는 정수형 자료형과 롱형 자료형이 정수형으로 통합되었기 때문에 모든 경우를 만족하는 해법은 없다. 다만, 정수값이 일정 범위 이하로 되어 있을 때는 다음과 같이 테스트 하는 것이 가능하다.

In [14]:
# 지금 사용중인 시스템에서 파이썬의 C 타입 정수형이 사용되는 바이트 수 확인
import sys
sys.int_info.sizeof_digit
Out[14]:
4
In [15]:
bits = sys.int_info.sizeof_digit * 8

a = -12345678
if a & (1 << (bits-1)):
    print("음수")
else:
    print("양수")    
음수

In [16]:
a = 12345678
if a & (1 << (bits-1)):
    print("음수")
else:
    print("양수")
양수

9. 임의의 정수에 대해서 가장 오른쪽의 4개 비트만 반전시키는 코드를 작성해 보자.

In [17]:
a = 100
'{0:08b}'.format(a)
Out[17]:
'01100100'
In [18]:
b = a ^ 0x0f
'{0:08b}'.format(b)
Out[18]:
'01101011'

10.

In [19]:
import math, cmath

a, b, c = 1, 2, 3
D = b*b - 4 * a * c

if D < 0:
    sqrt_d = cmath.sqrt(D)
else:    
    sqrt_d = math.sqrt(D)

x1 = (-b + sqrt_d)/(2*a)
x2 = (-b - sqrt_d)/(2*a)

print(x1, x2)
(-1+1.4142135623730951j) (-1-1.4142135623730951j)

11.

In [20]:
def find_roots(a, b, c):
    D = b*b - 4 * a * c
    
    sqrt_d = cmath.sqrt(D) if D < 0 else math.sqrt(D)
    
    x1 = (-b + sqrt_d)/(2*a)
    x2 = (-b - sqrt_d)/(2*a)
    
    return x1, x2

x1, x2 = find_roots(1, 2, 3)
print (x1, x2)
print (find_roots(1, 2, -3))
(-1+1.4142135623730951j) (-1-1.4142135623730951j)
(1.0, -3.0)

12.

286 페이지 int2base() 함수 참조

In [20]: