PYTHON 入門 文字列 文字列リテラル プログラムの中で文字列を表す方法は幾つか有るが 基本的な方法は下記の 2 種で有る 対象と成る文字の集まりをダブルクオーテーション ( " ) で囲うか シングルクオーテーション ( ' ) で囲う " 文字列 " ' 文字列 ' 他のプログラミング言語ではダブルクオーテーションとシングルクオーテーションで囲う場合では エスケープ処理等の扱いが異なる物が多いが Python では孰れも全く同じで有る 文字列の標準出力への出力 print 関数は引数に指定されたオブジェクトを標準出力に出力する print 関数は引数の出力の後 自動的に改行 ( n) を追加して出力する 猶 引数の最後がカンマ (, ) で終わって居る場合は改行が出力されない 複数の引数を指定する場合は カンマ (, ) で区切って複数の引数を記述する 此の場合 2 個目の引数からは頭に空白が 1 個付加されて出力される 従って カンマで区切って出力する場合は 此の様に空白が 1 個含まれて了うので 空白を入れたくない場合は 出力する文字列を連結してから出力する print 関数の引数に文字列以外を指定した場合には 先ず文字列に変換してから出力が行われる エスケープシーケンス Python ではダブルクオーテーションで囲った文字列でもシングルクオーテーションで囲った文字列でもエスケープシーケンスを使用する事が出来る 使用出来るエスケープシーケンスは 下記の通りで有る エスケープシーケンス 意味 文字そのもの ' シングルクオーテーション " ダブルクオーテーション a ベル b バックスペース f 改ページ r キャリッジリターン n 改行 t 水平タブ v 垂直タブ N{name} Unicode データベース中で名前 name を持つ文字 uxxxx 16 ビットの16 進数値 xxxx を持つUnicode 文字 Uxxxxxxxx 32 ビットの16 進数値 xxxxxxxx を持つUnicode 文字 -1-
ooo 8 進数 ooo を持つASCII 文字 xhh 16 進数 hh を持つASCII 文字 0 NULL +( 改行 ) 文字列を途中で改行する ( 行継続記号 ) 長い文字列の場合に 下記の様にプログラム中で改行するとエラーと成る "The browser displays an error message" 上記の様な場合には 下記の様に改行の直前に を入力する "The browser displays an error message" の直後に改行が有る場合には 行が次の行へ続いて居る事を表すので 上記は下記の様に 1 行で記述された場合と同じ扱いに成る "The browser displays an error message" トリプルクオーテーション 文字列を作成する方法として 下記の様にシングルクオーテーション ( ' ) かダブルクオーテーション ( " ) を 3 個続けた物で文字列を囲う方法が有る 此の場合 複数行の文字列を作成する事が出来る """1 行目文字列 2 行目文字列 3 行目文字列 """ '''1 行目文字列 2 行目文字列 3 行目文字列 ''' 此の場合 プログラム中で改行されて居る箇所は 改行文字で有る n が入力されて居ると看做される 例えば下記の様に使用する print("""<html> <head> <title>test</title> </head> <body> <p>test Page</p> </body> </html>""") 猶 此の形式の場合には 文字列の中で単独のダブルクオーテーションやシングルクオーテーションを使う時にエスケープシーケンスは必要無い ( エスケープシーケンスを使用しても問題は無い ) -2-
raw 文字列 raw 文字列を使用する事でエスケープシーケンスを無効にする事が出来る raw 文字列は下記の様に通常の文字列の先頭に r 又は R を付けた物で有る r" 文字列 " r' 文字列 ' R" 文字列 " R' 文字列 ' raw 文字列は ファイルのパスの様な 記号を多く含む文字列を作成する場合に便利で有る r"c: My Document node track test.txt" 猶 raw 文字列でも ダブルクオーテーションで囲った文字列の中にダブルクオーテーションを含める場合は " とする必要が有る 亦 シングルクオーテーションの場合も同様に ' とする バイト列と文字列 バイト列は特定のエンコード方式でエンコードされて居り リテラルでは b'a' の様に表現する 一方 文字列は Unicode のコードポイントを並べた物で有り リテラルでは ' あいう ' の様に表現する b"squid" # バイト列 b'squid' # バイト列 " 烏賊 " # 文字列 ' 烏賊 ' # 文字列 Python3 のバイト列は Python2 のバイト文字列と扱いが似て居るが Python2 のバイト文字列は文字列で有るが Python3 のバイト列は文字列ではない全く別の型で有る Python3 の文字列と Python2 のユニコード文字列は同等と考えて良い リテラル表記に違いが有り u を文字列の前につけなくてはならなかった Python2 のユニコード文字列に対して Python3 の文字列は其れが不要で有る 猶 バイト列は 非 ASCII 文字を含む場合 リテラル表記が使えないので 文字列を特定のエンコード方式でエンコードする必要が有る print(b" 烏賊 ") print(" 烏賊 ") # SyntaxError # 烏賊 print(b" xe7 x83 x8f xe8 xb3 x8a".decode('utf-8')) # 烏賊 print(" 烏賊 ") # 烏賊 因みに 非 ASCII 文字の文字コードは 下記の様にして取得する事が出来る print(" 烏賊 ".encode('utf-8')) # b' xe7 x83 x8f xe8 xb3 x8a' -3-
両者を type 関数で確認すると バイト列は bytes 型で有り 文字列は str 型で有る事が解る print(type(b"a")) print(type("a")) # <class 'bytes'> # <class 'str'> 前述の様に Python3 のバイト列は文字列ではない 其の為 文字列と連結不可能で有るし サポートして居るメソッドも異なる 両者の標準出力の例を 下記に示す ( 文字列は sys.stdout に バイト列は sys.stdout.buffer に書き込む ) import sys sys.stdout.write(' あ ' + ' いう ' + ' n') sys.stdout.buffer.write((' あ ' + ' いう ' + ' n').encode('utf-8')) 文字列は文字を Unicode として扱い 日本語の様な全角文字でも アルファベットの様な ASCII 文字でも 1 文字を 1 文字として扱う バイト列がバイト単位なのに対して Unicode 文字列では文字単位で処理を行う事が出来る 其の為 通常 Python で日本語を取り扱う場合は文字列を使用する 文字列の連結 文字列の連結には 下記の様に + 演算子を使用する print("python" + "3.7") # print("python " + b"3.7".decode('utf-8')) print(" 西暦 " + "2000 年 ") 文字列とバイト列の連結は出来ない (TypeError が発生する ) バイト列を文字列と連結するには 一旦バイト列をデコードして文字列に変換する必要が有る 文字列の繰り返し 文字列の繰り返しには 下記の様に * 演算子を使用する * 演算子は * 演算子の左辺の文字列を右辺に指定した数値だけ繰り返した新しい文字列を返す print("-" * 40) print("~" * 20) 文字列の長さ 文字列の長さを取得するには 下記の様に len 関数を使用する 通常の文字列の場合はバイト数 Unicode 文字列の場合は文字数を取得する print(len("squid")) # 5 print(len(" 烏賊 ")) # 2-4-
数値を文字列に変換 文字列以外の数値等のオブジェクトを文字列に変換するには 下記の様に str 関数を使用する print("year" + str(2000)) print(" 円周率 " + str(3.14159)) インデックスを指定して要素を取得 文字列を構成する個々の要素は 先頭から順に割り当てられたインデックス番号を指定する事で 個別に取得する事が可能で有る ( 要素番号は 0 から順に番号が割り当てられるが 負の値を指定する事も可能で -1 なら一番最後の要素 -2 なら最後から二番目の要素と成る ) str = "Hello" print(str[0]) # H print(str[1]) # e print(str[2]) # l print(str[3]) # l print(str[4]) # o 非 ASCII 文字を含む文字列も同じ様にインデックスを指定して要素を取得する事が出来る 文字列では個々の要素は文字単位なので 要素も文字単位と成る str = " 烏賊の王様 " print(str[0]) # 烏 print(str[1]) # 賊 print(str[2]) # の print(str[3]) # 王 print(str[4]) # 様 部分文字列の取得 部分文字列を取得するには 下記の様にスライス機能を使用する str = "ABCDE" print(str[1:3]) print(str[1:-1]) #"BC" #"BCD" スライス機能の書式は 下記の通りで有る 文字列オブジェクト [ 開始インデックス : 終了インデックス ] 終了インデックスを省略すると最後の文字の次のインデックスが指定された事に成り 結果的に開始インデックスから最後の文字迄が抽出される 亦 開始インデックスを省略すると最初の文字の前のインデックスが指定された事に成り 結果的に先頭の文字から終了インデックスの前の文字迄が抽出される -5-