Python 3.x membuat perbedaan yang jelas antara jenis:
str= '...'literal = urutan karakter Unicode (UTF-16 atau UTF-32, tergantung pada bagaimana Python dikompilasi)
bytes= b'...'literal = urutan oktet (bilangan bulat antara 0 dan 255)
Jika Anda terbiasa dengan Java atau C #, pikirkan strsebagai Stringdan bytessebagai byte[]. Jika Anda terbiasa dengan SQL, pikirkan stras NVARCHARdan bytesas BINARYatau BLOB. Jika Anda terbiasa dengan registri Windows, pikirkan strsebagai REG_SZdan bytessebagai REG_BINARY. Jika Anda terbiasa dengan C (++), lupakan semua yang telah Anda pelajari chardan string, karena KARAKTER BUKAN BYTE . Gagasan itu sudah lama usang.
Anda gunakan strsaat Anda ingin merepresentasikan teks.
print('שלום עולם')
Anda gunakan bytessaat Anda ingin merepresentasikan data biner tingkat rendah seperti struct.
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
Anda dapat mengkodekan suatu strke bytesobjek.
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
Dan Anda dapat memecahkan kode bytesmenjadi str.
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
Tetapi Anda tidak dapat dengan bebas mencampurkan kedua jenis itu.
>>> 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
The b'...'notasi agak membingungkan dalam yang memungkinkan byte 0x01-0x7F akan ditentukan dengan karakter ASCII bukan nomor hex.
>>> b'A' == b'\x41'
True
Tapi saya harus menekankan, karakter bukan byte .
>>> 'A' == b'A'
False
Dalam Python 2.x
Versi Pra-3.0 Python tidak memiliki perbedaan antara teks dan data biner. Sebaliknya, ada:
unicode= u'...'literal = urutan karakter Unicode = 3.xstr
str= '...'literal = urutan byte / karakter yang dikacaukan
- Biasanya teks, dikodekan dalam beberapa pengkodean yang tidak ditentukan.
- Tetapi juga digunakan untuk merepresentasikan data biner seperti
struct.packkeluaran.
Untuk memudahkan transisi 2.x ke 3.x, b'...'sintaks literal di-backport ke Python 2.6, untuk memungkinkan pembeda string biner (yang harus bytesdalam 3.x) dari string teks (yang harus strdalam 3 .x). The bprefix tidak apa-apa di 2.x, tapi menceritakan 2to3naskah untuk tidak mengubahnya ke string Unicode di 3.x.
Jadi ya, b'...'literal dalam Python memiliki tujuan yang sama dengan yang mereka lakukan dalam PHP.
Juga, hanya karena penasaran, apakah ada lebih banyak simbol daripada b dan kamu yang melakukan hal lain?
The rprefix menciptakan string mentah (misalnya, r'\t'adalah backslash + tbukan tab), dan kutipan tiga '''...'''atau """..."""memungkinkan multi-line string literal.