1

次のように、エスケープ シーケンスを使用して Unicode 文字を取得できることはわかっていました。

>>> print "\3"
♥

利用可能なASCII文字を調べて、これを書きました:

for i in xrange(1, 99):
    print "\%o" % i

「\1」、「\2」、「\3」などを出力するため、Unicode 文字ではありません。次に、%s、%r、および %d を使用して試しましたが、いずれも機能しないようです。

利用可能な ASCII 文字を見るよりもはるかに面白かったので、文字列の書式設定について読み始めたところ、この作品が機能するようになりました。

for i in xrange(1, 99):

    print "{:c}".format(i)

問題は、なぜ最初のコードが機能しなかったのかということです。

4

3 に答える 3

2

文字列リテラルのエスケープ シーケンスは、 「実行時」ではなく「解析時」に処理されます。あなたが書くなら

"\%o"

Python パーサーは、バックスラッシュの後にパーセント記号が続くのを認識します。これは有効なエスケープ シーケンスではないため、両方の文字を保持oし、通常の文字としても追加します (この Python は、たとえば C++ プログラミング言語とは異なることに注意してください)。"%o"その言語ではパーセント記号の前のバックスラッシュはパーセント記号としてのみ解釈されるため、その文字列をその言語と同じように解釈します)。

実行時に、フォーマット演算子は、3 つの文字、バックスラッシュ、およびシーケンスで構成される文字列を左側として認識します。これは、たとえば入力値 1%oの文字列を与える右側に置き換えられる部分です。"\\1"文字列は として表示され\1ます。

于 2012-09-16T14:22:11.470 に答える
2

Python は\%o、「リテラル バックスラッシュの後に文字列フォーマット コードが続く」と解釈しています。\%Python リテラルでは何も意味しないため、バックスラッシュは文字通り含まれています。

chr()関数を探しています:

for i in xrange(1, 99):
    print chr(i)

\文字エスケープは、python リテラルでのみ機能します。コーデック\を使用して、リテラル バックスラッシュ pus コードを含む任意の文字列を python 文字列リテラルとして解釈するように python に指示できます。string_escape

>>> print repr('\\n'.decode('string_escape')
'\n'

Unicode リテラルを指定する適切な\uxxxx方法は、フォーマットを使用し、Unicode 文字列リテラルを使用することであることに注意してください。

>>> print u'\u2665'
♥

raw バイトは、\x00エスケープ シーケンスを使用して生成することもできます。

>>> print repr('\x12')
'\n'
于 2012-09-16T14:11:33.230 に答える
1

Python ソース コードの文字列リテラルは、Python コンパイラが実行するソース コード処理の最初のステップである字句解析中に解釈されます。エスケープ シーケンスが解析され、結果の文字列のみがメモリに格納されます。これが理由です。

>>> "A"
'A'
>>> "\x41"
'A'

まったく同じ文字列になります。エスケープ シーケンスは、実際に文字列を出力している間、または文字列の書式設定を実行している間は処理されません。印刷とは、基本的に文字列の内容を端末にコピーすることを意味します。%フォーマットとは、または{}プレースホルダーを目的のコンテンツで補間することを意味します。文字列の残りの部分は変更されません。

フォーマットオプションの結果

>>> "\%03o" % 65
'\\101'

は 4 文字の文字列です\101。(インタラクティブ インタープリターでは、この文字列の表現が表示されます。そのため、引用符と二重のバック スラッシュが表示されます。)"\101"一方、文字列リテラルは、単一の文字、つまり大文字のみの文字列Aです。

Martijn Pieters が指摘したように、string_escapeコーデックを使用してエスケープ シーケンスの解釈を明示的に要求できます。

>>> ("\%03o" % 65).decode("string_escape")
'A'
于 2012-09-16T14:20:45.093 に答える