course
Każda wartość w Pythonie ma typ danych. Typy danych to klasyfikacja danych, która informuje kompilator lub interpreter, jak chcesz używać danych. Typ definiuje operacje możliwe na danych oraz strukturę, w której dane mają być przechowywane. W data science często będziesz musieć zmieniać typ swoich danych, aby łatwiej było ich używać i na nich pracować.
Python ma wiele typów danych. Z pewnością już widziałaś/łeś i pracowałaś/eś z niektórymi z nich. Masz liczby całkowite i zmiennoprzecinkowe do pracy z wartościami numerycznymi, typ logiczny (bool) do wartości prawda/fałsz oraz napisy do pracy ze znakami alfanumerycznymi. Możesz używać list, krotek (tupli), słowników i zbiorów, czyli struktur danych, w których przechowasz kolekcję wartości. Aby dowiedzieć się więcej, zajrzyj do kursu DataCamp Data Types in Python.
Aby łatwo uruchomić samodzielnie cały kod z przykładów w tym tutorialu, możesz bezpłatnie utworzyć zeszyt w DataLab z preinstalowanym Pythonem i wszystkimi próbkami kodu.
Sprawdzanie typów danych w Pythonie
Przed konwersją typów danych warto je sprawdzić. Python udostępnia dwie główne funkcje:
type(): Zwraca typ zmiennej.isinstance(): Sprawdza, czy zmienna należy do określonego typu.
a = 5.5
print(type(a)) # Output: <class 'float'>
print(isinstance(a, int)) # Output: False
print(isinstance(a, float)) # Output: True
Niejawna i jawna konwersja typów danych w Pythonie
Konwersja danych w Pythonie może zachodzić na dwa sposoby: albo jawnie wskazujesz kompilatorowi konwersję jednego typu danych na inny, albo kompilator rozumie to sam i robi to za ciebie. W pierwszym przypadku wykonujesz jawną konwersję typu danych, w drugim — niejawną.
Niejawna konwersja typów danych w Pythonie
Niejawna konwersja (coercion) to sytuacja, gdy konwersja typu danych odbywa się w trakcie kompilacji lub wykonania i jest obsługiwana bezpośrednio przez Pythona. Zobaczmy przykład:
a_int = 1
b_float = 1.0
c_sum = a_int + b_float
print(c_sum)
print(type(c_sum))
2.0
<class 'float'>
Wskazówka: możesz użyć funkcji type() w Pythonie, aby sprawdzić typ danych obiektu.
W przykładzie do wartości całkowitej a_int dodano wartość zmiennoprzecinkową b_float, a wynik automatycznie przekonwertowano na wartość zmiennoprzecinkową c_sum bez konieczności informowania o tym kompilatora. To właśnie niejawna konwersja danych.
Dlaczego zamiast tego wartość zmiennoprzecinkowa nie została przekonwertowana na liczbę całkowitą?
Wynika to z szerszej koncepcji promocji typów w informatyce. Mówiąc prościej, to mechanizm obronny kompilatora, który umożliwia wykonanie operacji wszędzie tam, gdzie to możliwe, poprzez konwersję danych do innego supertypu bez utraty informacji.
Oznacza to, że konwersja z typu float na integer nie jest wykonywana, ponieważ kompilator musiałby usunąć część ułamkową, co prowadziłoby do utraty informacji.
Jawna konwersja typów danych w Pythonie
Jawna konwersja typów danych, często nazywana rzutowaniem (type casting), zachodzi wtedy, gdy celowo konwertujesz wartość z jednego typu danych na inny. Takie podejście daje ci bezpośrednią kontrolę nad konwersją, ponieważ jawnie określasz docelowy typ danych w kodzie. Stosuje się je zwykle wtedy, gdy automatyczna (niejawna) konwersja oferowana przez Pythona nie spełnia twoich wymagań.
Składnia jawnej konwersji to:
target_data_type(expression)
Na przykład, aby przekonwertować liczbę zmiennoprzecinkową na całkowitą, napiszesz:
int(3.14) # Converts 3.14 to 3
Uwaga: choć jawne konwersje są bardzo użyteczne, mogą prowadzić do utraty informacji. Na przykład konwersja liczby zmiennoprzecinkowej na całkowitą odrzuci część ułamkową. Warto rozumieć te konsekwencje, aby uniknąć niezamierzonych rezultatów w programach.
Przyjrzyjmy się kilku często stosowanym jawnym konwersjom typów danych.
Prymitywne a nieprymitywne struktury danych w Pythonie
Prymitywne struktury danych są budulcem do manipulacji danymi i zawierają czyste, proste wartości. Python ma cztery prymitywne typy zmiennych:
- Liczby całkowite (integers)
- Liczby zmiennoprzecinkowe (float)
- Napisy (strings)
- Wartości logiczne (boolean)
Nieprymitywne struktury danych nie przechowują pojedynczej wartości, lecz kolekcję wartości w różnych formatach. W Pythonie masz następujące nieprymitywne struktury danych:
- Listy
- Krotki (tuples)
- Słowniki
- Zbiory
Możesz dowiedzieć się o nich więcej w tutorialu Data Structures in Python.
Konwersje prymitywnych struktur danych
Konwersje liczb całkowitych i zmiennoprzecinkowych w Pythonie
Typy integer i float służą do pracy z liczbami.
Aby przekonwertować liczbę całkowitą na zmiennoprzecinkową, użyj w Pythonie funkcji float(). Analogicznie, jeśli chcesz przekonwertować liczbę zmiennoprzecinkową na całkowitą, możesz użyć funkcji int().
a_int = 3
b_int = 2
# Explicit type conversion from int to float
c_float_sum = float(a_int + b_int)
print(c_float_sum)
5.0
a_float = 3.3
b_float = 2.0
# Explicit type conversion from float to int
c_int_sum = int(a_float + b_float)
print(c_int_sum)
c_float_sum = a_float + b_float
print(c_float_sum)
5
5.3
Problemy z precyzją typu float i moduł Decimal
Arytmetyka zmiennoprzecinkowa w Pythonie może prowadzić do problemów z precyzją:
print(0.1 + 0.2) # Output: 0.30000000000000004
Aby tego uniknąć, użyj modułu Decimal:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2')) # Output: 0.3
Konwersja z liczb rzeczywistych na zespolone w Pythonie
Możesz konwertować liczby całkowite na zespolone, używając complex(real,imag). Wymaga to dwóch liczb (części rzeczywistej i urojonej) i konwertuje liczby rzeczywiste na liczby zespolone.
real = 2
imag = 5
print(complex(real, imag))
(2+5j)
Konwersja typów danych z użyciem napisów w Pythonie
Napis to kolekcja jednego lub więcej znaków (liter, cyfr, symboli). Dość często możesz potrzebować konwertować napisy na liczby lub liczby na napisy.
price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + total + "$")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-54bd76b9b4bd> in <module>()
2 price_cookie = 6
3 total = price_cake + price_cookie
----> 4 print("The total is: " + total + "$")
TypeError: Can't convert 'int' object to str implicitly
Powyższy przykład daje TypeError, informując, że kompilator nie może niejawnie przekonwertować wartości całkowitej na napis.
To, co program powinien tu zrobić, może wydawać ci się intuicyjne. Jednak kompilator nie zawsze może być tego pewien, więc udostępnia mechanizm jawnego rzutowania, abyś mógł/mogła jasno określić, czego chcesz. Tak możesz przekonwertować liczbę całkowitą na napis w Pythonie za pomocą funkcji str():
price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + str(total) + "$")
The total is: 21$
Tak samo działa konwersja z float na napis.
W Pythonie możesz też konwertować napisy na wartości całkowite i zmiennoprzecinkowe, o ile to możliwe. Zobacz, co to oznacza:
price_cake = '15'
price_cookie = '6'
# String concatenation
total = price_cake + price_cookie
print("The total is: " + total + "$")
# Explicit type conversion to integer
total = int(price_cake) + int(price_cookie)
print("The total is: " + str(total) + "$")
The total is: 156$
The total is: 21$
Rozbijmy ten kod.
price_cake i price_cookie są początkowo napisami. Aby obliczyć sumę, muszą zostać najpierw przekonwertowane na odpowiadające im wartości całkowite. W przeciwnym razie kompilator założy, że chcesz wykonać konkatenację napisów, a nie dodawanie liczbowe. Następnie musisz umieścić tę wartość w końcowym napisie do wyświetlenia, więc trzeba przekonwertować sumę na napis, aby skonkatenować ją z resztą komunikatu.
Mamy nadzieję, że ten przykład pokazuje ci znaczenie konwersji typów danych. Mimo że to bardzo mały przykład, już widać, jak użyteczna może być taka konwersja.
Uwaga: zauważyłaś/eś „o ile to możliwe” przy konwersji napisu na liczby całkowite lub zmiennoprzecinkowe? To dlatego, że nie zawsze da się przekonwertować napisy na liczby i wykonać na nich operacje numeryczne. Kompilator jest tego świadomy i zwróci błąd, gdy spróbujesz to zrobić. Zobacz przykład poniżej:
price_cake = 'fifteen'
price_cookie = 'six'
total = int(price_cake) + int(price_cookie)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-25-80591b8accda> in <module>()
1 price_cake = 'fifteen'
2 price_cookie = 'six'
----> 3 total = int(price_cake) + int(price_cookie)
ValueError: invalid literal for int() with base 10: 'fifteen'
Podsumowanie: konwersje prymitywnych typów danych w Pythonie
| Konwersja | Funkcja | Przykład | Wynik |
|---|---|---|---|
| Integer na Float | float() |
float(3) |
3.0 |
| Float na Integer | int() |
int(3.9) |
3 |
| String na Integer | int() |
int('123') |
123 |
| Integer na String | str() |
str(123) |
'123' |
Konwersje nieprymitywnych struktur danych
Konwersja typów na krotki i listy w Pythonie
Podobnie jak w przypadku liczb całkowitych i zmiennoprzecinkowych, możesz konwertować listy na krotki i krotki na listy.
Pamiętasz, czym są krotki i listy? Listy i krotki w Pythonie służą do przechowywania kolekcji jednorodnych elementów. Różnica polega na tym, że krotki są niemutowalne, czyli po zdefiniowaniu nie możesz usuwać, dodawać ani edytować znajdujących się w nich wartości.
Po co konwertować listy na krotki?
Ponieważ krotki są niemutowalne i pozwalają na znaczną optymalizację tworzonych programów.
A po co konwertować krotki na listy?
Być może chcesz wprowadzić zmiany w pierwotnej krotce. Możesz więc przekonwertować ją na listę, wprowadzić zmiany, a następnie z powrotem zamienić na krotkę.
W Pythonie możesz użyć funkcji tuple(), aby zwrócić krotkę z przekazanej wartości, oraz analogicznie funkcji list(), aby przekonwertować krotkę na listę:
a_tuple = ('a', 1) ,('f', 2), ('g', 3)
b_list = [1,2,3,4,5]
print(tuple(b_list))
print(list(a_tuple))
(1, 2, 3, 4, 5)
[('a', 1), ('f', 2), ('g', 3)]
Podobnie tak przekonwertujesz napis na listę lub krotkę w Pythonie:
dessert = 'Cake'
# Convert the characters in a string to individual items in a tuple
print(tuple(dessert))
# Convert a string into a list
dessert_list = list(dessert)
dessert_list.append('s')
print(dessert_list)
('C', 'a', 'k', 'e')
['C', 'a', 'k', 'e', 's']
Konwersja typów na słowniki i zbiory w Pythonie
Możesz użyć funkcji dict(), aby przekonwertować krotkę na słownik, oraz set(), aby przekonwertować listę na zbiór.
print(dict(a_tuple))
print(set(b_list))
{'a': 1, 'f': 2, 'g': 3}
{1, 2, 3, 4, 5}
Podobnie jak w przypadku innych funkcji konwersji, wystarczy podać nazwę funkcji, aby przekonwertować dowolny typ danych na słowniki i zbiory.
Używanie dataclasses do danych strukturalnych (Python 3.7+)
Zamiast używać słowników lub krotek, dataclasses zapewniają lepszy sposób obsługi danych strukturalnych.
from dataclasses import dataclass
@dataclass
class Product:
name: str
price: float
in_stock: bool
item = Product("Laptop", 799.99, True)
print(item) # Output: Product(name='Laptop', price=799.99, in_stock=True)
Podsumowanie: konwersje nieprymitywnych struktur danych w Pythonie
| Konwersja | Funkcja | Przykład | Wynik |
|---|---|---|---|
| Lista na krotkę | tuple() |
tuple([1, 2, 3]) |
(1, 2, 3) |
| Krotka na listę | list() |
list(('a', 1)) |
['a', 1] |
| Napis na listę | list() |
list('Cake') |
['C', 'a', 'k', 'e'] |
| Napis na krotkę | tuple() |
tuple('Cake') |
('C', 'a', 'k', 'e') |
| Krotka na słownik | dict() |
dict((('a', 1), ('b', 2))) |
{'a': 1, 'b': 2} |
| Lista na zbiór | set() |
set([1, 2, 3, 4, 5]) |
{1, 2, 3, 4, 5} |
Unicode, liczby binarne, ósemkowe i szesnastkowe w Pythonie
Systemy liczbowe odnoszą się do liczby symboli lub znaków reprezentujących dowolną wartość liczbową. System liczbowy, którego używasz na co dzień, nazywa się dziesiętnym. W systemie dziesiętnym używasz dziesięciu różnych symboli: 0, 1, 2, 3, 4, 5, 6, 7, 8 i 9. Za pomocą tych dziesięciu symboli możesz przedstawić dowolną ilość. Unicode, binarny, szesnastkowy i ósemkowy to różne systemy liczbowe.
Gdy zabraknie symboli, przechodzisz do kolejnego miejsca cyfry. W systemie dziesiętnym, aby przedstawić liczbę o jeden większą niż 9, używasz 10, co oznacza jedną jednostkę dziesiątek i zero jedności. W innych systemach jest inaczej. Na przykład w systemie binarnym, który używa tylko dwóch symboli, 0 i 1, musisz przejść do kolejnego miejsca cyfry, gdy zabraknie symboli. Tak więc liczenie w systemie binarnym wygląda tak: 0, 1, 10, 11, 100, 101 itd.
W kolejnych sekcjach przyjrzymy się bliżej niektórym systemom liczbowym.
Konwersja z binarnego na dziesiętny w Pythonie
Liczby binarne są reprezentowane w systemie o podstawie dwa. Oznacza to, że w binarnym systemie liczbowym do reprezentowania liczb używa się tylko dwóch symboli: 0 i 1. Licząc od zera w systemie binarnym, szybko zabraknie symboli: 0, 1, ???
Dalej nie ma już symboli. Nie przechodzisz do cyfry 2, ponieważ 2 w binarnym nie istnieje. Zamiast tego używasz specjalnych kombinacji jedynek i zer. W systemie binarnym 1000 to 8 w systemie dziesiętnym. W binarnym używasz potęg dwójki, co oznacza, że 8 to w istocie: (1(2^3)) + (0(2^2)) + (0(2^1)) + (0(2^0)) = 8. Położenie 1 i 0 określa potęgę, do jakiej należy podnieść 2.
Zobaczmy to na bardziej złożonym przykładzie, aby było jasne:
Binary Number = 1001111
Decimal value = (1*(2^6)) + (0*(2^5)) + (0*(2^4)) + (1*(2^3)) + (1*(2^2)) + (1*(2^1)) + (1*(2^0))
= 79
W Pythonie możesz po prostu użyć funkcji bin(), aby przekonwertować wartość dziesiętną na odpowiadającą jej wartość binarną.
Analogicznie, funkcji int(), aby przekonwertować liczbę binarną na jej wartość dziesiętną. Funkcja int() jako drugi argument przyjmuje podstawę liczby do konwersji, czyli 2 w przypadku liczb binarnych.
a = 79
# Base 2(binary)
bin_a = bin(a)
print(bin_a)
print(int(bin_a, 2)) #Base 2(binary)
0b1001111
79
Konwersja z ósemkowego na dziesiętny w Pythonie
Ósemkowy to kolejny system liczbowy z mniejszą liczbą symboli niż konwencjonalny system dziesiętny. Ma podstawę osiem, co oznacza, że do reprezentacji wszystkich ilości używa się ośmiu symboli: 0, 1, 2, 3, 4, 5, 6 i 7. Po 7 następuje 10, ponieważ 8 nie istnieje.
Podobnie jak w binarnym używałeś potęg dwójki do określenia wartości liczby, tutaj użyjesz potęg 8, ponieważ to podstawa osiem.
W systemie ósemkowym 10 to 8 w dziesiętnym. Rozbijmy to: (1(8^1)) + (0(8^0)) = 8.
Bardziej złożony przykład:
Octal Number = 117
Decimal value = (1*(8^2)) + (1*(8^1)) + (7*(8^0))
= 79
W Pythonie możesz użyć funkcji oct(), aby przekonwertować wartość dziesiętną na odpowiadającą jej wartość ósemkową. Alternatywnie możesz użyć funkcji int() z właściwą podstawą, czyli 8 dla systemu ósemkowego.
a = 79
# Base 8(octal)
oct_a = oct(a)
print(oct_a)
print(int(oct_a, 8))
0o117
79
Konwersja z szesnastkowego na dziesiętny w Pythonie
Szesnastkowy to system o podstawie 16. W przeciwieństwie do binarnego i ósemkowego używa sześciu dodatkowych symboli poza cyframi występującymi w systemie dziesiętnym.
A co po 9?
Gdy potrzebne są dodatkowe symbole poza zwykłymi cyframi, używa się liter. W szesnastkowym pełna lista symboli to 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E i F.
Korzystając z wcześniejszego przykładu:
Hexadecimal Number = 4F
Decimal value = (4*(16^1)) + (F*(16^0))
= 79
W Pythonie możesz użyć funkcji hex(), aby przekonwertować wartość dziesiętną na odpowiadającą jej wartość szesnastkową, lub funkcji int() z podstawą 16 dla systemu szesnastkowego.
a = 79
# Base 16(hexadecimal)
hex_a = hex(a)
print(hex_a)
print(int(hex_a, 16))
0x4f
79
Konwersja Unicode na znak
Python chr() konwertuje liczby całkowite Unicode na napis. Unicode to powszechnie akceptowane kodowanie znaków do wyświetlania tekstów pisanych w różnych językach.
Przekazaliśmy różne liczby całkowite Unicode do funkcji chr(), aby wyświetlić „DATACAMP”. Możesz też użyć ord(), aby przekonwertować pojedynczy znak na liczbę całkowitą Unicode.
print(
chr(68),
chr(65),
chr(84),
chr(65),
chr(67),
chr(65),
chr(77),
chr(80),
)
D A T A C A M P
Podsumowanie: konwersje systemów liczbowych w Pythonie
| Konwersja | Funkcja | Przykład | Wynik |
|---|---|---|---|
| Dziesiętny na binarny | bin() |
bin(79) |
0b1001111 |
| Binarny na dziesiętny | int() |
int('1001111', 2) |
79 |
| Dziesiętny na ósemkowy | oct() |
oct(79) |
0o117 |
| Ósemkowy na dziesiętny | int() |
int('117', 8) |
79 |
| Dziesiętny na szesnastkowy | hex() |
hex(79) |
0x4f |
| Szesnastkowy na dziesiętny | int() |
int('4F', 16) |
79 |
| Unicode na znak | chr() |
chr(68) |
'D' |
| Znak na Unicode | ord() |
ord('D') |
68 |
Udało się!
Gratulacje! Poznałaś/łeś konwersje typów danych w Pythonie, głównie z użyciem wbudowanych metod. To zdecydowanie pomoże ci sprawniej pracować z różnymi typami danych i da większą elastyczność przy pisaniu programów.
Mamy świetny kurs Intermediate Python for Data Science, w którym nauczysz się rysować wykresy za pomocą matplotlib, pracować ze słownikami i słynną ramką danych pandas. Zobaczysz też, jak sterować przepływem programu za pomocą pętli. Na końcu kursu znajdziesz studium przypadku, w którym zastosujesz wszystko, czego się nauczyłaś/eś, i sprawdzisz swoją wiedzę w praktyce!
FAQs
Jak przekonwertować listę liczb całkowitych na pojedynczy napis w Pythonie?
Możesz użyć metody join() w połączeniu z map(), aby przekonwertować każdy integer na napis i je skleić.
int_list = [1, 2, 3, 4]
result = ''.join(map(str, int_list))
print(result) # Output: '1234'
Co się stanie, jeśli spróbujesz przekonwertować nienumeryczny napis na liczbę całkowitą w Pythonie?
Zostanie zgłoszony ValueError wskazujący, że napis nie jest prawidłową liczbą całkowitą.
int('abc') # Raises ValueError: invalid literal for int() with base 10: 'abc'
Czy można przekonwertować zbiór na listę w Pythonie? Jak?
Tak, możesz przekonwertować zbiór na listę za pomocą funkcji list().
a_set = {1, 2, 3}
a_list = list(a_set)
print(a_list) # Output: [1, 2, 3]
Jak przekonwertować napis z liczbami oddzielonymi spacjami na listę liczb całkowitych?
Użyj metody split(), aby podzielić napis, oraz map(), aby przekonwertować każdą część na liczbę całkowitą.
numbers = "1 2 3 4"
int_list = list(map(int, numbers.split()))
print(int_list) # Output: [1, 2, 3, 4]
Jakiej funkcji możesz użyć, aby sprawdzić typ danych zmiennej w Pythonie?
Możesz użyć funkcji type(), aby sprawdzić typ danych zmiennej.
x = 5
print(type(x)) # Output: <class 'int'>