Python 3.x hace una clara distinción entre los tipos:
str= '...'literales = una secuencia de caracteres Unicode (UTF-16 o UTF-32, dependiendo de cómo se compiló Python)
bytes= b'...'literales = una secuencia de octetos (enteros entre 0 y 255)
Si está familiarizado con Java o C #, piense en stras Stringy bytesas byte[]. Si está familiarizado con SQL, piense en stras NVARCHARy bytesas BINARYor BLOB. Si está familiarizado con el registro de Windows, piense strcomo REG_SZy bytescomo REG_BINARY. Si estás familiarizado con C (++), entonces olvida todo lo que has aprendido chary las cadenas, porque UN CARÁCTER NO ES UN BYTE . Esa idea es obsoleta desde hace mucho tiempo.
Usas strcuando quieres representar texto.
print('שלום עולם')
Se usa bytescuando desea representar datos binarios de bajo nivel como estructuras.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Puede codificar a stra un bytesobjeto.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Y puedes decodificar a bytesen a str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Pero no puedes mezclar libremente los dos tipos.
>>> 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'...'notación es algo confusa ya que permite que los bytes 0x01-0x7F se especifiquen con caracteres ASCII en lugar de números hexadecimales.
>>> b'A' == b'\x41'
True
Pero debo enfatizar, un personaje no es un byte .
>>> 'A' == b'A'
False
En Python 2.x
Las versiones anteriores a 3.0 de Python carecían de este tipo de distinción entre texto y datos binarios. En cambio, había:
unicode= u'...'literales = secuencia de caracteres Unicode = 3.xstr
str= '...'literales = secuencias de bytes / caracteres confundidos
- Por lo general, texto codificado en alguna codificación no especificada.
- Pero también se usa para representar datos binarios como
struct.packsalida.
Para facilitar la transición de 2.x a 3.x, la b'...'sintaxis literal se hizo retroceder a Python 2.6, para permitir distinguir cadenas binarias (que deberían estar bytesen 3.x) de cadenas de texto (que deberían estar stren 3 .X). El bprefijo no hace nada en 2.x, pero le dice al 2to3script que no lo convierta a una cadena Unicode en 3.x.
Entonces sí, los b'...'literales en Python tienen el mismo propósito que en PHP.
Además, solo por curiosidad, ¿hay más símbolos que el byu que hacen otras cosas?
El rprefijo crea una cadena sin formato (p. Ej., r'\t'Es una barra invertida + en tlugar de una pestaña), y las comillas triples '''...'''o """..."""permiten literales de cadena de varias líneas.