Liczby w Pythonie, konwersja typów i matematyka

W tym artykule dowiesz się o różnych liczbach używanych w Pythonie, o tym, jak konwertować dane z jednego typu na drugi oraz o operacjach matematycznych obsługiwanych w Pythonie.

Liczba Typ danych w Pythonie

Python obsługuje liczby całkowite, liczby zmiennoprzecinkowe i liczby zespolone. Są one zdefiniowane int, floatoraz complexklas w Pythonie.

Liczby całkowite i zmiennoprzecinkowe są oddzielone obecnością lub brakiem przecinka dziesiętnego. Na przykład 5 to liczba całkowita, a 5,0 to liczba zmiennoprzecinkowa.

Liczby zespolone są zapisywane w postaci, x + yjgdzie x jest częścią rzeczywistą, a y jest częścią urojoną.

Możemy użyć type()funkcji, aby dowiedzieć się, do której klasy należy zmienna lub wartość, i isinstance()funkcji, aby sprawdzić, czy należy ona do określonej klasy.

Spójrzmy na przykład:

 a = 5 print(type(a)) print(type(5.0)) c = 5 + 3j print(c + 3) print(isinstance(c, complex))

Po uruchomieniu powyższego programu otrzymujemy następujący wynik:

 (8 + 3j) Prawda

Chociaż liczby całkowite mogą mieć dowolną długość, liczba zmiennoprzecinkowa jest dokładna tylko do 15 miejsc po przecinku (szesnaste miejsce jest niedokładne).

Liczby, z którymi mamy do czynienia na co dzień, są liczbami dziesiętnymi (podstawa 10). Jednak programiści komputerowi (zazwyczaj programiści wbudowani) muszą pracować z systemami liczb binarnych (podstawa 2), szesnastkowych (podstawa 16) i ósemkowych (podstawa 8).

W Pythonie możemy przedstawić te liczby, odpowiednio umieszczając przedrostek przed tą liczbą. Poniższa tabela zawiera listę tych przedrostków.

System liczbowy Prefiks
Dwójkowy „0b” lub „0B”
Ósemkowe „0o” lub „0O”
Szesnastkowy „0x” lub „0X”

Oto kilka przykładów

 # Output: 107 print(0b1101011) # Output: 253 (251 + 2) print(0xFB + 0b10) # Output: 13 print(0o15)

Po uruchomieniu programu wynik będzie następujący:

 107 253 13

Konwersja typów

Możemy zamienić jeden typ liczb na inny. Jest to również znane jako przymus.

Operacje takie jak dodawanie, odejmowanie liczby całkowitej coerce do liczby zmiennoprzecinkowej (automatycznie), jeśli jeden z operandów jest zmiennoprzecinkowy.

 >>> 1 + 2.0 3.0

Widzimy powyżej, że 1 (liczba całkowita) jest przekształcana w 1.0 (liczba zmiennoprzecinkowa) w celu dodania, a wynik jest również liczbą zmiennoprzecinkową.

Możemy również używać wbudowanych funkcji, takich jak int(), float()i complex()do jawnej konwersji między typami. Te funkcje mogą nawet konwertować z ciągów.

 >>> int(2.3) 2 >>> int(-2.8) -2 >>> float(5) 5.0 >>> complex('3+5j') (3+5j)

Podczas konwersji z liczb zmiennoprzecinkowych na liczby całkowite liczba zostaje obcięta (części dziesiętne są usuwane).

Dziesiętne w Pythonie

Wbudowana klasa float w Pythonie wykonuje obliczenia, które mogą nas zadziwić. Wszyscy wiemy, że suma wartości 1,1 i 2,2 wynosi 3,3, ale Python wydaje się nie zgadzać.

 >>> (1.1 + 2.2) == 3.3 False

Co się dzieje?

Okazuje się, że liczby zmiennoprzecinkowe są implementowane w sprzęcie komputerowym jako ułamki binarne, ponieważ komputer rozumie tylko liczbę binarną (0 i 1). Z tego powodu większość znanych nam ułamków dziesiętnych nie może być dokładnie zapisana w naszym komputerze.

Weźmy przykład. Nie możemy przedstawić ułamka 1/3 jako liczby dziesiętnej. To da 0.33333333… co jest nieskończenie długie i możemy to tylko przybliżyć.

Okazuje się, że ułamek dziesiętny 0.1 da w wyniku nieskończenie długi ułamek binarny 0,000110011001100110011… a nasz komputer przechowuje tylko skończoną liczbę.

Będzie to tylko przybliżone 0,1, ale nigdy nie będzie równe. Stąd jest to ograniczenie naszego sprzętu komputerowego, a nie błąd w Pythonie.

 >>> 1.1 + 2.2 3.3000000000000003

Aby rozwiązać ten problem, możemy użyć modułu dziesiętnego, który jest dostarczany z Pythonem. Podczas gdy liczby zmiennoprzecinkowe mają dokładność do 15 miejsc dziesiętnych, moduł dziesiętny ma precyzję ustawianą przez użytkownika.

Zobaczmy różnicę:

 import decimal print(0.1) print(decimal.Decimal(0.1))

Wynik

 0,1 0,1000000000000000055511151231257827021181583404541015625

Ten moduł jest używany, gdy chcemy przeprowadzić obliczenia dziesiętne, czego nauczyliśmy się w szkole.

Zachowuje również znaczenie. Wiemy, że 25,50 kg jest dokładniejsze niż 25,5 kg, ponieważ ma dwa znaczące miejsca po przecinku w porównaniu do jednego.

 from decimal import Decimal as D print(D('1.1') + D('2.2')) print(D('1.2') * D('2.50'))

Wynik

 3,3 3,000

Notice the trailing zeroes in the above example.

We might ask, why not implement Decimal every time, instead of float? The main reason is efficiency. Floating point operations are carried out must faster than Decimal operations.

When to use Decimal instead of float?

We generally use Decimal in the following cases.

  • When we are making financial applications that need exact decimal representation.
  • When we want to control the level of precision required.
  • When we want to implement the notion of significant decimal places.

Python Fractions

Python provides operations involving fractional numbers through its fractions module.

A fraction has a numerator and a denominator, both of which are integers. This module has support for rational number arithmetic.

We can create Fraction objects in various ways. Let's have a look at them.

 import fractions print(fractions.Fraction(1.5)) print(fractions.Fraction(5)) print(fractions.Fraction(1,3))

Output

 3/2 5 1/3

While creating Fraction from float, we might get some unusual results. This is due to the imperfect binary floating point number representation as discussed in the previous section.

Fortunately, Fraction allows us to instantiate with string as well. This is the preferred option when using decimal numbers.

 import fractions # As float # Output: 2476979795053773/2251799813685248 print(fractions.Fraction(1.1)) # As string # Output: 11/10 print(fractions.Fraction('1.1'))

Output

 2476979795053773/2251799813685248 11/10

This data type supports all basic operations. Here are a few examples.

 from fractions import Fraction as F print(F(1, 3) + F(1, 3)) print(1 / F(5, 6)) print(F(-3, 10)> 0) print(F(-3, 10) < 0)

Output

 2/3 6/5 False True

Python Mathematics

Python offers modules like math and random to carry out different mathematics like trigonometry, logarithms, probability and statistics, etc.

 import math print(math.pi) print(math.cos(math.pi)) print(math.exp(10)) print(math.log10(1000)) print(math.sinh(1)) print(math.factorial(6))

Output

 3.141592653589793 -1.0 22026.465794806718 3.0 1.1752011936438014 720

Here is the full list of functions and attributes available in the Python math module.

 import random print(random.randrange(10, 20)) x = ('a', 'b', 'c', 'd', 'e') # Get random choice print(random.choice(x)) # Shuffle x random.shuffle(x) # Print the shuffled x print(x) # Print random element print(random.random())

Po uruchomieniu powyższego programu otrzymujemy następujące dane wyjściowe (wartości mogą się różnić ze względu na losowe zachowanie)

 18 e ('c', 'e', ​​'d', 'b', 'a') 0,5682821194654443

Oto pełna lista funkcji i atrybutów dostępnych w module losowym Pythona.

Interesujące artykuły...