Python 3.x fa una chiara distinzione tra i tipi:
str= '...'valori letterali = una sequenza di caratteri Unicode (UTF-16 o UTF-32, a seconda di come è stato compilato Python)
bytes= b'...'valori letterali = una sequenza di ottetti (numeri interi compresi tra 0 e 255)
Se hai familiarità con Java o C #, pensa a strcome Stringe bytescome byte[]. Se hai familiarità con SQL, pensa a strcome NVARCHARe bytescome BINARYo BLOB. Se hai familiarità con il registro di Windows, pensa a strcome REG_SZe bytescome REG_BINARY. Se hai familiarità con C (++), allora dimentica tutto ciò che hai appreso chare le stringhe, perché UN PERSONAGGIO NON È UN BYTE . Quell'idea è da lungo tempo obsoleta.
Si utilizza strquando si desidera rappresentare il testo.
print('שלום עולם')
Si utilizza bytesquando si desidera rappresentare dati binari di basso livello come le strutture.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
È possibile codificare a strin un bytesoggetto.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
E puoi decodificare a bytesin a str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Ma non puoi mescolare liberamente i due tipi.
>>> b'\xEF\xBB\xBF' + 'Text with a UTF-8 BOM'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat bytes to str
La b'...'notazione è alquanto confusa in quanto consente di specificare i byte 0x01-0x7F con caratteri ASCII anziché numeri esadecimali.
>>> b'A' == b'\x41'
True
Ma devo sottolineare, un personaggio non è un byte .
>>> 'A' == b'A'
False
In Python 2.x
Le versioni pre-3.0 di Python mancavano di questo tipo di distinzione tra testo e dati binari. Invece, c'era:
unicode= u'...'valori letterali = sequenza di caratteri Unicode = 3.xstr
str = '...' valori letterali = sequenze di byte / caratteri confusi
- Di solito testo, codificato in una codifica non specificata.
- Ma usato anche per rappresentare dati binari come l'
struct.packoutput.
Per facilitare la transizione da 2.x-a-3.x, la b'...'sintassi letterale è stata importata in Python 2.6, al fine di consentire di distinguere le stringhe binarie (che dovrebbero essere bytesin 3.x) dalle stringhe di testo (che dovrebbero essere strin 3 .X). Il bprefisso non fa nulla in 2.x, ma dice allo 2to3script di non convertirlo in una stringa Unicode in 3.x.
Quindi sì, i b'...'letterali in Python hanno lo stesso scopo che hanno in PHP.
Inoltre, solo per curiosità, ci sono più simboli di b e u che fanno altre cose?
Il rprefisso crea una stringa non elaborata (ad esempio, r'\t'è una barra rovesciata + tanziché una scheda) e tripla virgolette '''...'''o """..."""consente letterali stringa a più righe.