파이썬 숫자

김동현·2021년 10월 28일
0

python

목록 보기
1/3
  • ※ assert 비교식 [,문자열] : 비교식이 True면 그냥 통과, False면 AssertionError를 발생시키고 문자열 출력한다. ()없이 사용한다는 점이 특이하다.

1.1 정수

  • 파이썬에서 정수는 불변형(immutable)이다.
  • (정수).bit_length() => 부호와 선행 0을 제외하고, 이진수로 정수를 나타내는 데 필요한 비트 수를 돌려준다

1.2 부동소수점

  • 파이썬에서 부동소수점은 float로 나타내며 불변형(immutable)이다.
  • 부동소수점을 표현하는 방식으로는 단정도 방식과 배정도 방식이 있다.
    • 단정도 방식 : 1비트(부호) + 8비트(지수) + 23비트(가수)
    • 배정도 방식 : 1비트(부호) + 11비트(지수) + 52비트(가수)

1.2.1 부동소수점끼리 비교

  • 0.1 과 같은 숫자는 2진법으로 나타내기가 어렵다.
    0.1(10진법) => 0.00110011001100...(2진법)

    >>>0.2 * 3 == 0.6
    False

  • 그러므로 Equality Test는 사전에 정의된 정밀도 범위 내에서 수행되어야 한다. 한가지 예시로는 unittest모듈의 assertAlmostEqual()메서드를 사용하면 된다.

  • 또는 메모리에서 비트 패턴으로 비교할 수 있다. 먼저, 부호 비교를 별도로 처리한다. 두 숫자가 음수면 부호를 뒤집고, 숫자를 반전하여 비교한다. 지수패턴이 같으면 가수를 비교한다.

1.2.2 정수와 부동소수점 메서드

  • as_integer_ratio() 메서드는 부동소수점을 분수로 표현한다.

    >>>1.25.as_integer_ratio()
    (5, 4)

1.3 복소수

  • 파이썬에서 복소수는 z = 3 + 4j 와 같이 생긴 부동소수점 한 쌍을 갖는 불변형(immutable)이다.
  • z.real, z.imag, z.conjugate()로 실수부, 허수부, 켤레복소수를 구할 수 있다.
  • 복소수를 사용해야 할땐 cmath모듈을 임포트해야 하는데 이 모듈은 math모듈에 있는 대부분의 함수의 복소수 버전을 제공한다.

1.4 fraction 모듈

  • 파이썬에서 분수를 다루려면 이 모듈을 사용한다.

1.5 decimal 모듈

  • 정확한 10진법의 부동소수점 숫자가 필요한 경우, 불변형(immutable)인 decimal.Decimal을 사용할 수 있다.

  • Decimal() 메서드는 정수 또는 문자열을 인수로 취한다.

    >>>sum(0.1 for i in range(10)) == 1.0
    False
    >>> from decimal import Decimal
    >>> sum(Decimal("0.1") for i in range(10)) == Decimal("1.0")
    True

  • math와 cmath 모듈처럼 Decimal에도 Decimal.exp(x)와 같은 내장 함수가 있다. 차이점으로는 decimal 모듈을 사용하는게 더 정확도가 높다.

1.6 2진수, 8진수, 16진수

  • 2진수 반환 : bin(정수)
  • 8진수 반환 : oct(정수)
  • 16진수 반환 : hex(정수)

1.7 연습문제

1.7.1 진법 변환

  • 다른 진법의 숫자를 10진수로 전환한다.(2 <= base <= 10)
def convert_to_decimal(number, base):
    multiplier, result = 1, 0
    
    while number > 0:
        result += number % 10 * multiplier
        multiplier *= base
        number = number // 10
    
    return result

def test_convert_to_decimal():
    number, base = 1001, 2
    assert convert_to_decimal(1001, 2) == 9, "다른 결과가 나옴"
    print("테스트 통과")
    
if __name__ == "__main__":
    test_convert_to_decimal()

테스트 통과

  • 10진수를 다른 진법의 숫자로 변환하는 함수도 만들어 보자.(2 <= base <= 10)
def convert_from_decimal(number, base):
    multiplier, result = 1, 0
    while number > 0:
        result += number % base * multiplier
        multiplier *= 10
        number = number // base
    return result

def test_convert_from_decimal():
    number, base = 9, 2
    assert convert_from_decimal(number, base) == 1001, "다른 결과가 나옴"
    print("테스트 통과")

if __name__ == "__main__":
    test_convert_from_decimal()

테스트 통과

  • 10진법 숫자를 20 이하의 진법으로 변환해보자.
  • 재귀 함수(recursive function)을 사용해서 10진법 숫자를 다른 진법으로 변환해보자.

1.7.2 최대공약수(GCD)

1.7.3 random 모듈

  • random.choice(리스트)
  • random.sample(리스트, 뽑을 개수)
  • random.shuffle(리스트) => 프로시저
  • random.randint(0,10) => 0<=N<=10

1.7.4 피보나치 수열

  • 세 가지 방법
    • 재귀 호출을 사용하는 find_fibonacci_seq_rec()
      • 시간복잡도는 O(2^n)
    • 반복문을 사용하는 find_fibonacci_seq_iter()
      • 시간복잡도는 O(n)
    • 수식을 사용하는 find_fibonacci_seq_form()
      • 시간복잡도는 O(1)
      • 단, 70번째 이상의 결과는 정확하지 않다.
  • 제너레이터를 이용한 방법

1.7.5 소수

  • 세 가지 방법
    • 무차별 대입
    • n이 소수가 아니라면 루트n 까지 대입했을 때, 나누어 떨어짐
    • 페르마의 소정리 사용

1.8 넘파이 패키지

  • 넘파이 배열은 파이썬 리스트보다 훨씬 더 효율적이다.
profile
프론트에_가까운_풀스택_개발자

0개의 댓글