course
Fiecare valoare din Python are un tip de date. Tipurile de date sunt o clasificare a datelor care îi spune compilatorului sau interpretului cum vrei să folosești datele. Tipul definește operațiile care pot fi efectuate asupra datelor și structura în care vrei să fie stocate. În știința datelor, va trebui adesea să schimbi tipul datelor pentru a le face mai ușor de utilizat și de prelucrat.
Python are multe tipuri de date. Probabil ai văzut deja și ai lucrat cu unele dintre ele. Ai întregi și numere în virgulă mobilă (float) pentru valori numerice, boolean (bool) pentru valori adevărat/fals și șiruri de caractere pentru a lucra cu caractere alfanumerice. Poți folosi liste, tuple, dicționare și mulțimi, care sunt structuri de date în care poți stoca o colecție de valori. Pentru a afla mai multe despre ele, aruncă o privire la cursul DataCamp Data Types in Python.
Pentru a rula ușor tu însuți tot codul exemplu din acest tutorial, poți crea gratuit un caiet DataLab care are Python preinstalat și conține toate mostrele de cod.
Verificarea tipurilor de date în Python
Înainte de a converti tipuri de date, e util să le verifici. Python oferă două funcții principale:
type(): întoarce tipul unei variabile.isinstance(): verifică dacă o variabilă aparține unui anumit tip.
a = 5.5
print(type(a)) # Output: <class 'float'>
print(isinstance(a, int)) # Output: False
print(isinstance(a, float)) # Output: True
Conversia implicită și explicită a tipurilor de date în Python
Conversia datelor în Python se poate întâmpla în două moduri: fie indici explicit compilatorului să convertească un tip de date într-un alt tip, fie compilatorul înțelege singur acest lucru și o face pentru tine. În primul caz, faci o conversie explicită de tip, iar în cel de-al doilea, o conversie implicită de tip.
Conversia implicită a tipurilor de date în Python
Conversia implicită sau coerciția are loc atunci când conversia tipului de date se face fie în timpul compilării, fie la rulare și este gestionată direct de Python pentru tine. Să vedem un exemplu:
a_int = 1
b_float = 1.0
c_sum = a_int + b_float
print(c_sum)
print(type(c_sum))
2.0
<class 'float'>
Sfat: poți folosi funcția type() în Python pentru a verifica tipul de date al unui obiect.
În exemplu, o valoare întreagă a_int a fost adunată cu o valoare float b_float, iar rezultatul a fost convertit automat într-o valoare float c_sum fără să fie nevoie să îi spui compilatorului. Aceasta este conversia implicită a datelor.
De ce nu a fost convertită valoarea float într-un întreg în schimb?
Aceasta se datorează unui concept mai larg de promovare a tipurilor în informatică. Pe scurt, este un mecanism de apărare al compilatorului care îți permite să efectuezi operații ori de câte ori este posibil, convertindu-ți datele într-un supertip diferit fără a pierde informații.
Asta înseamnă că conversia din float în întreg nu se face deoarece atunci compilatorul ar trebui să elimine partea fracționară, ceea ce ar duce la pierdere de informații.
Conversia explicită a tipurilor de date în Python
Conversia explicită a tipurilor de date, adesea numită type casting, are loc atunci când convertești deliberat o valoare dintr-un tip de date în altul. Această abordare îți oferă control direct asupra conversiei, deoarece specifici explicit tipul țintă în cod. Este folosită frecvent atunci când conversia automată (implicită) oferită de Python nu îți îndeplinește cerințele.
Sintaxa pentru conversia explicită este:
target_data_type(expression)
De exemplu, dacă vrei să convertești un număr în virgulă mobilă la un întreg, ai scrie:
int(3.14) # Converts 3.14 to 3
Notă: Deși conversiile explicite sunt foarte utile, ele pot duce la pierdere de informație. De exemplu, conversia unui număr în virgulă mobilă la un întreg va elimina partea fracționară. E important să înțelegi aceste consecințe pentru a evita rezultate neintenționate în programele tale.
Să explorăm câteva conversii explicite frecvent folosite.
Structuri de date primitive versus neprimitive în Python
Structurile de date primitive sunt elementele de bază pentru manipularea datelor și conțin valori pure, simple. Python are patru tipuri de variabile primitive:
- Întregi (integers)
- Numere în virgulă mobilă (float)
- Șiruri de caractere (strings)
- Boolean
Structurile de date neprimitive nu stochează doar o valoare, ci mai degrabă o colecție de valori în diverse formate. În Python, ai următoarele structuri de date neprimitive:
- Liste
- Tuple
- Dicționare
- Mulțimi (sets)
Poți afla mai multe despre ele în tutorialul Data Structures in Python de la DataCamp.
Conversii ale structurilor de date primitive
Conversii între întregi și float în Python
Întregii și valorile float sunt tipuri de date care lucrează cu numere.
Pentru a converti un întreg la float, folosește funcția float() în Python. Similar, dacă vrei să convertești un float la întreg, poți folosi funcția 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
Probleme de precizie cu float și modulul Decimal
Aritmetica în virgulă mobilă în Python poate duce la probleme de precizie:
print(0.1 + 0.2) # Output: 0.30000000000000004
Pentru a evita asta, folosește modulul Decimal:
from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2')) # Output: 0.3
Conversia numerelor reale la complexe în Python
Poți converti întregi în numere complexe folosind complex(real,imag). Are nevoie de două numere (partea reală și cea imaginară) și convertește numere reale în numere complexe.
real = 2
imag = 5
print(complex(real, imag))
(2+5j)
Conversia tipurilor de date cu șiruri de caractere în Python
Un șir este o colecție de unul sau mai multe caractere (litere, numere, simboluri). E posibil să ai nevoie destul de des să convertești șiruri în numere sau numere în șiruri.
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
Exemplul de mai sus returnează un TypeError, informând că compilatorul nu poate converti implicit o valoare întreagă la șir.
Ceea ce ar trebui să facă programul aici ți se poate părea intuitiv. Totuși, compilatorul nu este întotdeauna sigur, așa că îți oferă un mecanism de conversie explicită, astfel încât să poți preciza clar ce vrei. Iată cum poți converti un întreg la șir în Python folosind funcția str():
price_cake = 15
price_cookie = 6
total = price_cake + price_cookie
print("The total is: " + str(total) + "$")
The total is: 21$
Funcționează la fel și când convertești float în șiruri.
În Python, poți de asemenea să convertești șiruri la întregi și valori float ori de câte ori este posibil. Să vedem ce înseamnă asta:
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$
Hai să descompunem codul.
price_cake și price_cookie sunt inițial șiruri. Apoi, trebuie să găsești totalul, ceea ce înseamnă că ele trebuie convertite mai întâi la valorile lor întregi corespunzătoare. Altfel, compilatorul va presupune că operația dorită este concatenarea de șiruri, nu adunarea numerică. Apoi trebuie să introduci această valoare în șirul final de afișare și, în consecință, trebuie să convertești totalul la șir pentru a-l concatena cu restul mesajului de afișare.
Sperăm că acest exemplu te ajută să vezi importanța conversiilor de tip. Chiar dacă acesta este un exemplu foarte mic de conversie, poți deja să vezi cât de utilă poate fi.
Notă: ai observat „ori de câte ori este posibil” când convertești un șir în întreg sau float? Asta pentru că nu este întotdeauna posibil să convertești șiruri în numere și să aplici operații numerice asupra lor. Compilatorul este conștient de asta și, prin urmare, îți va da o eroare când încerci. Vezi exemplul de mai jos:
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'
Rezumat: conversii ale tipurilor de date primitive în Python
| Conversie | Funcție | Exemplu | Rezultat |
|---|---|---|---|
| Întreg la Float | float() |
float(3) |
3.0 |
| Float la Întreg | int() |
int(3.9) |
3 |
| Șir la Întreg | int() |
int('123') |
123 |
| Întreg la Șir | str() |
str(123) |
'123' |
Conversii ale structurilor de date neprimitive
Conversia tipurilor la tuple și liste în Python
La fel ca în cazul întregilor și valorilor float, poți converti și liste în tuple și tuple în liste.
Îți amintești ce sunt tuplele și listele? Listele și tuplele în Python sunt folosite pentru a stoca o colecție de elemente omogene. Diferența dintre tuple și liste este că tuplele sunt imuabile, ceea ce înseamnă că, odată definite, nu poți șterge, adăuga sau edita valori în interiorul lor.
De ce ai converti liste în tuple?
Pentru că tuplele sunt tipuri de date imuabile și permit optimizări substanțiale ale programelor pe care le creezi.
Și de ce ai converti tuple în liste?
Poate vrei să faci modificări la tupla inițială. Astfel, le poți converti în liste, face modificarea, apoi le convertești la loc în tuple.
În Python, poți folosi funcția tuple() pentru a întoarce o versiune tuplă a valorii transmise și, similar, funcția list() pentru a converti o tuplă în 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)]
În mod similar, iată cum convertești un șir într-o listă sau o tuplă în Python:
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']
Conversia tipurilor la dicționare și mulțimi în Python
Poți folosi funcția dict() pentru a converti o tuplă într-un dicționar și set() pentru a converti o listă într-o mulțime.
print(dict(a_tuple))
print(set(b_list))
{'a': 1, 'f': 2, 'g': 3}
{1, 2, 3, 4, 5}
Similar altor funcții de conversie, trebuie doar să furnizezi numele funcției pentru a converti orice tip de date în dicționare și mulțimi.
Folosirea dataclasses pentru date structurate (Python 3.7+)
În loc să folosești dicționare sau tuple, dataclasses oferă o modalitate mai bună de a gestiona date structurate.
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)
Rezumat: conversii ale structurilor de date neprimitive în Python
| Conversie | Funcție | Exemplu | Rezultat |
|---|---|---|---|
| Listă la Tuplă | tuple() |
tuple([1, 2, 3]) |
(1, 2, 3) |
| Tuplă la Listă | list() |
list(('a', 1)) |
['a', 1] |
| Șir la Listă | list() |
list('Cake') |
['C', 'a', 'k', 'e'] |
| Șir la Tuplă | tuple() |
tuple('Cake') |
('C', 'a', 'k', 'e') |
| Tuplă la Dicționar | dict() |
dict((('a', 1), ('b', 2))) |
{'a': 1, 'b': 2} |
| Listă la Mulțime | set() |
set([1, 2, 3, 4, 5]) |
{1, 2, 3, 4, 5} |
Unicode, întregi binari, octali și hexazecimali în Python
Sistemele de numerație se referă la numărul de simboluri sau caractere care reprezintă orice valoare numerică. Sistemul de numerație pe care îl folosești de obicei în fiecare zi se numește zecimal. În sistemul zecimal, folosești zece simboluri diferite: 0, 1, 2, 3, 4, 5, 6, 7, 8 și 9. Cu aceste zece simboluri, poți reprezenta orice cantitate. Unicode, binar, hexazecimal și octal se referă la sisteme de numerație diferite.
Treci la poziția următoarei cifre când rămâi fără simboluri. În sistemul zecimal, pentru a reprezenta un număr cu unu mai mare decât 9, folosești 10, ceea ce înseamnă o unitate de zece și zero unități de unu. Totuși, este diferit în alte sisteme. De exemplu, într-un sistem binar care folosește doar două simboluri, 0 și 1, trebuie să treci la următoarea poziție când rămâi fără simboluri. Astfel vei număra în binar: 0, 1, 10, 11, 100, 101, etc.
Hai să analizăm câteva dintre sistemele de numerație mai în detaliu în secțiunile următoare.
Conversia din binar în zecimal în Python
Întregii binari sunt numerele reprezentate în baza doi. Asta înseamnă că în sistemul binar există doar două simboluri pentru a reprezenta numere: 0 și 1. Când numeri în sus de la zero în binar, rămâi mai repede fără simboluri: 0, 1, ???
Mai departe, nu mai sunt simboluri rămase. Nu treci la cifra 2 pentru că 2 nu există în binar. În schimb, folosești o combinație specială de 1 și 0. În sistemul binar, 1000 este egal cu 8 în zecimal. În binar, folosești puteri ale lui doi, ceea ce înseamnă că 8 este, de fapt: (1(2^3)) + (0(2^2)) + (0(2^1)) + (0(2^0)) = 8. Poziția lui 1 și 0 definește puterea la care se ridică 2.
Să vedem asta cu un exemplu mai complex, pentru claritate:
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
În Python, poți pur și simplu folosi funcția bin() pentru a converti dintr-o valoare zecimală la valoarea sa binară corespunzătoare.
Similar, funcția int() convertește un binar la valoarea sa zecimală. Funcția int() primește ca al doilea argument baza numărului de convertit, care este 2 în cazul numerelor binare.
a = 79
# Base 2(binary)
bin_a = bin(a)
print(bin_a)
print(int(bin_a, 2)) #Base 2(binary)
0b1001111
79
Conversia din octal în zecimal în Python
Octal este un alt sistem de numerație cu mai puține simboluri decât sistemul zecimal convențional. Este bază opt, ceea ce înseamnă că opt simboluri sunt folosite pentru a reprezenta toate cantitățile. Acestea sunt 0, 1, 2, 3, 4, 5, 6 și 7. După 7 urmează 10, deoarece 8 nu există.
La fel cum ai folosit puteri ale lui doi în binar pentru a determina valoarea unui număr, vei folosi puteri ale lui 8, din moment ce aceasta este baza opt.
Într-un sistem octal, 10 este egal cu 8 în zecimal. Să descompunem: (1(8^1)) + (0(8^0)) = 8.
Un exemplu mai complex:
Octal Number = 117
Decimal value = (1*(8^2)) + (1*(8^1)) + (7*(8^0))
= 79
În Python, poți folosi funcția oct() pentru a converti dintr-o valoare zecimală la valoarea sa octală corespunzătoare. Alternativ, poți folosi funcția int() cu baza corectă, care este 8 pentru sistemul octal.
a = 79
# Base 8(octal)
oct_a = oct(a)
print(oct_a)
print(int(oct_a, 8))
0o117
79
Conversia din hexazecimal în zecimal în Python
Hexazecimal este un sistem de numerație în baza 16. Spre deosebire de binar și octal, folosește șase simboluri suplimentare față de cifrele din sistemul zecimal.
Dar ce vine după 9?
Odată ce sunt necesare simboluri suplimentare față de valorile numerice obișnuite, se folosesc litere. Așadar, în hexazecimal, lista totală de simboluri folosite este 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E și F.
Folosind același exemplu ca mai devreme:
Hexadecimal Number = 4F
Decimal value = (4*(16^1)) + (F*(16^0))
= 79
În Python, poți folosi funcția hex() pentru a converti dintr-o valoare zecimală la valoarea sa hexazecimală corespunzătoare sau funcția int() cu baza 16 pentru sistemul hexazecimal.
a = 79
# Base 16(hexadecimal)
hex_a = hex(a)
print(hex_a)
print(int(hex_a, 16))
0x4f
79
Conversia din Unicode în caracter
Python chr() convertește întregi Unicode într-un șir. Unicode este un codaj de caractere acceptat universal pentru afișarea textelor scrise ale diverselor limbi.
Am furnizat diverse întregi Unicode funcției chr() pentru a afișa „DATACAMP”. Poți folosi și ord() pentru a converti un singur caracter într-un întreg 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
Rezumat: conversii între sisteme de numerație în Python
| Conversie | Funcție | Exemplu | Rezultat |
|---|---|---|---|
| Zecimal la Binar | bin() |
bin(79) |
0b1001111 |
| Binar la Zecimal | int() |
int('1001111', 2) |
79 |
| Zecimal la Octal | oct() |
oct(79) |
0o117 |
| Octal la Zecimal | int() |
int('117', 8) |
79 |
| Zecimal la Hex | hex() |
hex(79) |
0x4f |
| Hex la Zecimal | int() |
int('4F', 16) |
79 |
| Unicode la Caracter | chr() |
chr(68) |
'D' |
| Caracter la Unicode | ord() |
ord('D') |
68 |
Ai reușit!
Felicitări! Ai învățat despre conversiile tipurilor de date în Python, în principal folosind metode încorporate. Acest lucru te va ajuta cu siguranță să gestionezi diverse tipuri de date, oferindu-ți mai multă flexibilitate când îți scrii programele.
Avem un curs excelent, Intermediate Python for Data Science, în care poți învăța cum să îți reprezinți grafic datele cu matplotlib și să lucrezi cu dicționare și celebrul DataFrame din pandas. Vei vedea, de asemenea, cum poți controla fluxul programului tău cu bucle. Există și un studiu de caz la finalul cursului, unde poți aplica tot ce ai învățat și îți poți pune cunoștințele la treabă!
Întrebări frecvente
Poți folosi metoda join() combinată cu map() pentru a converti fiecare întreg la șir și a le concatena.
int_list = [1, 2, 3, 4]
result = ''.join(map(str, int_list))
print(result) # Output: '1234'
Va fi ridicată o excepție ValueError, indicând că șirul nu este un întreg valid.
int('abc') # Raises ValueError: invalid literal for int() with base 10: 'abc'
Da, poți converti o mulțime într-o listă folosind funcția list().
a_set = {1, 2, 3}
a_list = list(a_set)
print(a_list) # Output: [1, 2, 3]
Folosește metoda split() pentru a împărți șirul și map() pentru a converti fiecare parte la întreg.
numbers = "1 2 3 4"
int_list = list(map(int, numbers.split()))
print(int_list) # Output: [1, 2, 3, 4]
Poți folosi funcția type() pentru a verifica tipul de date al unei variabile.
x = 5
print(type(x)) # Output: <class 'int'>