Python 3.xはタイプを明確に区別します。
- str=- '...'リテラル= Unicode文字のシーケンス(Pythonのコンパイル方法に応じて、UTF-16またはUTF-32)
- bytes=- b'...'リテラル=オクテットのシーケンス(0〜255の整数)
JavaまたはC#に精通している場合は、stras Stringとbytesasを考えてくださいbyte[]。SQLに精通している場合は、stras NVARCHAR、bytesas、BINARYorを考えてくださいBLOB。あなたがWindowsレジストリに精通している場合、と考えるstrようにREG_SZとbytesのようにREG_BINARY。C(++)に精通している場合は、学習したすべての内容charと文字列を忘れてください。A CHARACTERはBYTEではないためです。その考えは長い間時代遅れです。
strテキストを表現したい場合に使用します。
print('שלום עולם')
bytes構造体のような低レベルのバイナリデータを表現する場合に使用します。
NaN = struct.unpack('>d', b'\xff\xf8\x00\x00\x00\x00\x00\x00')[0]
あなたはできるエンコードstrするbytesオブジェクト。
>>> '\uFEFF'.encode('UTF-8')
b'\xef\xbb\xbf'
そして、あなたはデコードすることができますbytesにstr。
>>> b'\xE2\x82\xAC'.decode('UTF-8')
'€'
ただし、2つのタイプを自由に混在させることはできません。
>>> 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
このb'...'表記は、バイト0x01-0x7Fを16進数ではなくASCII文字で指定できるという点でやや混乱しています。
>>> b'A' == b'\x41'
True
しかし私は強調しなければなりません、文字はバイトではありません。
>>> 'A' == b'A'
False
Python 2.xの場合
3.0より前のバージョンのPythonでは、テキストデータとバイナリデータのこのような区別がありませんでした。代わりに、以下がありました:
- unicode=- u'...'リテラル= Unicode文字のシーケンス= 3.x- str
- str=- '...'リテラル=交絡したバイト/文字のシーケンス- 
- 通常はテキストであり、特定されていないエンコーディングでエンコードされています。
- しかし、struct.pack出力などのバイナリデータを表すためにも使用されます。
 
2.xから3.xへの移行を容易にするために、b'...'リテラル構文はPython 2.6にバックポートされ、バイナリ文字列(bytes3.xにある必要がある)をテキスト文字列(str3にある必要がある)から区別できるようになりました。 。バツ)。bプレフィックスは2.xの中で何もしませんが、伝え2to33.xでUnicode文字列に変換していないスクリプトを
つまりb'...'、Pythonのリテラルには、PHPと同じ目的があります。
  また、好奇心から、bやuよりも他のことをするシンボルの方が多いですか?
r接頭辞は、(例えば、生の文字列を作成し、r'\t'バックスラッシュ+であるt代わりのタブ)、三重引用符'''...'''または"""..."""複数行の文字列リテラルを許可します。