サンプル・プログラム
文字列型
Python では、ダブルクォーテーション "..." またはシングルクォーテーション '...' で囲んだデータを文字列型(str)として扱う。
文字列の中にダブルクォーテーションを含めたいときには、シングルクォーテーション '...' で囲むといい。逆に、文字列の中にシングルクォーテーションを含めたいときには、ダブルクォーテーション "..." で囲む。
文字列の中にダブルクォーテーションを含めたいときには、シングルクォーテーション '...' で囲むといい。逆に、文字列の中にシングルクォーテーションを含めたいときには、ダブルクォーテーション "..." で囲む。
# 文字列型
s = "abc"
print("s = " + str(s) + " " + str(type(s)))
s = "a" #1文字
print("s = " + str(s) + " " + str(type(s)))
s = 'ABC' #シングルクォーテーション
print("s = " + str(s) + " " + str(type(s)))
s = '文字列変換は"str関数"' #ダブルクォーテーションクォーテーション
print("s = " + str(s) + " " + str(type(s)))
エスケープシーケンス
文字列の中に円マーク ¥ があると、その次の文字を〈文字〉として扱う。
たとえば、ダブルクォーテーション "..." に囲まれた文字列の中にダブルクォーテーションを含めたいときには \" と書く。また、円マーク自身は \\ と書く。
たとえば、ダブルクォーテーション "..." に囲まれた文字列の中にダブルクォーテーションを含めたいときには \" と書く。また、円マーク自身は \\ と書く。
# エスケープ文字
s = "ab\"c\"de"
print(s)
s = "ab\\de"
print(s)
また、円マーク ¥ に続けて記号や8進数、16進数を記述することで、特定の制御機能や文字表示を行うことができる。これをエスケープシーケンスと呼ぶ。
エスケープシーケンス | 内 容 |
---|---|
\\ | 円マーク、またはバックスラッシュ |
\' | シングルクォーテーション |
\" | ダブルクォーテーション |
\t | 水平タブ |
\v | 垂直タブ |
\b | バックスペース |
\n | 改行 |
\r | キャリッジリターン |
\f | 改ページ |
\XX | 8進数の文字コードXX |
\xXX | 16進数の文字コードXX |
\uXXXX | 16ビットUnicode文字XXXX |
\uXXXXXXXX | 32ビットUnicode文字XXXXXXXX |
# エスケープシーケンス
s = "ab\tcd" # 水平タブ
print(s)
s = "ab\ncd" # 改行
print(s)
s = "a\x27bc" # 文字コード 16進数
print(s)
s = "飛\u9A28高山" # Unicode 16ビット
print(s)
プログラム "str3.py" を実行すると、各種のエスケープシーケンスが働くことをみることができる。
raw文字列
文字列をあらわすダブルクォーテーションの前にrまたはRを付ける r"..." の形を raw文字列と呼ぶ。この中ではエスケープシーケンスは機能しない。プログラム "str4.py" を実行し、プログラム "str3.py" と比べてみてほしい。
# raw文字列
s = r"ab\tcd"
print(s)
s = r"ab\ncd"
print(s)
s = r"a\x27bc"
print(s)
s = r"飛\u9A28高山"
print(s)
フォーマット文字列
Python 3.6 では、文字列をあらわすダブルクォーテーションの前にfまたはFを付ける f"..." 形式の フォーマット文字列が追加になった。この中では、変数の内容を埋め込んだり、整数にカンマ区切りを付けたり、小数点以下の桁数の指定を行うなどの書式指定ができる。プログラム "str6.py" を実行してみてほしい。
label = "Python"
s = f"ようこそ {label} の世界へ" # 変数の内容
print(s)
ブレース {...} で変数名を囲むことで、その変数の内容を文字列に埋め込むことができる。
amount = 1230000
s = f"支給額は {amount:,} 円です" # カンマ区切り
print(s)
{変数名:,} とすると、変数の値(整数)を3桁毎のカンマ区切りにして書式を整える。
pi = 3.14149268
s = f"円周率は {pi:3.2f} です" # 全体3桁,小数第2位まで
print(s)
{変数名:3.2f} とすると、変数の値(浮動小数)を全体3桁、小数点以下2桁にして書式を整える。整数部で全体の桁数、小数部で小数点以下の桁数を指定する。整数部は省略可能で、".2f" とすると、小数点以下2桁にする。指定した小数点以下の桁数で四捨五入を行う。
num = 28
s = f"{num} を16進数で表すと {num:X} です" # 16進数
print(s)
{変数名:X} とすると、変数の値を16進数(英大文字)にする。":x" を指定すると英小文字になる。
num = 0.0000000012378
s = f"指数表記 {num:.3e}" # 指数表記
print(s)
{変数名:.3e} とすると、変数の値を10進指数表記にする。小数部は、10進指数表記の小数部の桁数を指定する。10のべき乗を表す e は小文字になる。.3E" のように指定すると、E は大文字になる。
num = 0.00012378
s = f"自動指数表記 {num:g}" # 自動指数表記
print(s)
{変数名:g} とすると、10進浮動小数表記にするか、指数表記にするかを自動判断する。指数部が-4以上または精度以下の時には指数表記(e は小文字)、それ以外の場合は10進浮動小数表記になる。"G" のように指定すると、E は大文字になる。
num = 0.678
s = f"百分率表記 {num:.2%}" # 百分率表記
print(s)
{変数名:.2%} とすると、小数を小数点以下2桁までの百分率表記にして書式を整える。
year = 2024
month = 6
day = 26
s = f"{year:04d}年{month:02d}月{day:02d}日" # ゼロ・サプレス
print(s)
{変数名:04d} とすると、整数4桁表示で、左側の余った桁をゼロで埋めて桁数を整える(ゼロ・サプレス)
フォーマット文字列における書式指定は "{変数名:桁数 変換子}" という形式をとる。利用できる変換子を一覧表に掲げる。
変換子 | 変換方式 |
---|---|
d | 符号付き10進整数 |
i | 符号付き10進整数 |
o | 符号付き10進数 |
x | 符号付き16進数(英小文字) |
X | 符号付き16進数(英大文字) |
e | 指数表記(浮動小数点数,eは小文字) |
E | 指数表記(浮動小数点数,Eは大文字) |
f | 10進浮動小数点数 |
F | 10進浮動小数点数 |
g | 10進浮動小数点数;指数部が-4以上またが精度以下の時には指数表記(eは小文字),それ以外の場合は10進浮動小数表記 |
G | 10進浮動小数点数;指数部が-4以上またが精度以下の時には指数表記(Eは大文字),それ以外の場合は10進浮動小数表記 |
c | 1文字 |
s | 文字列(str関数と同じ) |
r | 文字列(repr関数と同じ) |
a | 文字列(ascii関数と同じ) |
% | パーセント記号 % そのもの |
書式演算子
Python では、古くからC言語の printf関数の書式指定子に相当する書式演算子が備わっている。文字列の中で "%桁数 変換子" のように指定し、文字列のあとにパーセント記号 %(これを書式演算子と呼ぶ)を挟んで、この演算子に対応する値や変数を丸括弧 (...) に並べて記述する。
label = "Python"
s = "ようこそ %s の世界へ" % (label) # 文字列
print(s)
%s は文字列に変換し、str関数と同じ働きをする。
pi = 3.14149268
s = "円周率は %3.2f です" % (pi) # 全体3桁,小数第2位まで
print(s)
"%3.2f" は、変数の値(浮動小数)を全体3桁、小数点以下2桁にして桁数を整える。整数部で全体の桁数、小数部で小数点以下の桁数を指定する。整数部は省略可能で、"%.2f" とすると、小数点以下2桁にする。指定した小数点以下の桁数で四捨五入を行う。
num = 28
s = "%d を16進数で表すと %X です" % (num, num) # 16進数
print(s)
"%X" とすると、変数の値を16進数(英大文字)にする。"%x" を指定すると英小文字になる。
num = 0.0000000012378
s = "指数表記 %.3e" % num # 指数表記
print(s)
"%.3e" とすると、変数の値を10進指数表記にする。小数部は、10進指数表記の小数部の桁数を指定する。10のべき乗を表す e は小文字になる。"%.3E" のように指定すると、E は大文字になる。
num = 0.00012378
s = "自動指数表記 %g" % num # 自動指数表記
print(s)
"%g" とすると、10進浮動小数表記にするか、指数表記にするかを自動判断する。指数部が-4以上または精度以下の時には指数表記(e は小文字)、それ以外の場合は10進浮動小数表記になる。"%G" のように指定すると、G は大文字になる。
"%04d" とすると、整数4桁表示で、左側の余った桁をゼロで埋める(ゼロ・サプレス)
year = 2024
month = 6
day = 25
s = "%04d年%02d月%02d日" % (year, month, day) # ゼロ・サプレス
print(s)
書式演算子の方がフォーマット文字列より指定できる変換子の種類が少ない。
文字列リテラル
Python では、連続する3つのダブルクォーテーション """ があると、再び """ が表れるまでを1つの文字列の塊とみなす。これを文字列リテラルと呼ぶ。
「2.5 コメントを書こう」では、複数行のコメントを書くのに文字列リテラルを使ったが、変数への代入にも使うことができる。
「2.5 コメントを書こう」では、複数行のコメントを書くのに文字列リテラルを使ったが、変数への代入にも使うことができる。
s = """文字列リテラル
2024/06/26
2024年6月26日
令和6年6月26日"""
print(s)
プログラム "str7.py" を実行すると、変数 s に代入される文字列リテラルは、改行も含めて文字列として扱っていることがわかる。
year = 2024
month = 6
day = 25
s = f"""\n文字列リテラル+書式文字列
{year:04d}/{month:02d}/{day:02d}
{year:04d}/年{month}月{day}日
令和6年{month}月{day}日"""
print(s)
文字列リテラルでは、エスケープシーケンスやフォーマット文字列を使うこともできる。
s = """\n文字列リテラル+書式演算子
%04d/%02d/%02d
%d年%d月%d日
令和6年%d月%d日""" % (year, month, day, year, month, day, month, day)
print(s)
文字列リテラルでは、書式演算子を使うこともできる。
練習問題
次回予告
これまでのサンプル・プログラムを通じ、Pythonでは、整数、小数、文字列の扱いが異なることがわかった。Pythonに限らず、プログラミング言語には扱うデータの種類に応じたデータ型という概念があり、異なるデータ型の間でのデータ変換処理が用意されている。
Pythonは、データ型を自動認識・変換する動的型付け言語で、内部的にはきめ細かなデータ型をもっている。これに対し、プログラマがデータ型を指定し、指定した以外のデータ型にするには変換指定をしなければならないプログラミング言語を静的型付け言語と呼ぶ。Python, JavaScript, PHP, Rubyは動的型付け言語、C/C++, C#, Java, Swift, Goは静的型付け言語だ。
次回は、初級~中級者プログラミングで登場するデータ型について学ぶ。
Pythonは、データ型を自動認識・変換する動的型付け言語で、内部的にはきめ細かなデータ型をもっている。これに対し、プログラマがデータ型を指定し、指定した以外のデータ型にするには変換指定をしなければならないプログラミング言語を静的型付け言語と呼ぶ。Python, JavaScript, PHP, Rubyは動的型付け言語、C/C++, C#, Java, Swift, Goは静的型付け言語だ。
次回は、初級~中級者プログラミングで登場するデータ型について学ぶ。
コラム:文字コード
コンピュータで扱う文字列もまた2進数である。文字の1つ1つにユニークな番号(文字コード)が割り当てられている。たとえば半角の "a" には 0b01100001(0x61) が、全角の "家" には 0x0101101110110110(0x5BB6)が割り当てられている。2進数では表記が大変なので、一般的に文字コード表記には16進数を使う。
ここで大切なのは、プログラムやシステムが変わっても文字列が読めるようにしなければならないこと――つまり、文字コードの共通化が前提になるということだ。
1960年代に入り、大型コンピュータ(メインフレーム)の導入が進んだが、アメリカ国内で60種類以上、IBMだけでも9種類の文字コードが乱立していた。
この問題を解決するため、IBMのボブ・ベマーがアルファベットを表記するための7ビットの文字コードを ANSI(American National Standards Institute;米国規格協会)に提案した。1963年(昭和38年)、ベマー案を若干修正する形で ANSI X 3.4、いわゆる「ASCIIコード」を制定した。
ここで大切なのは、プログラムやシステムが変わっても文字列が読めるようにしなければならないこと――つまり、文字コードの共通化が前提になるということだ。
1960年代に入り、大型コンピュータ(メインフレーム)の導入が進んだが、アメリカ国内で60種類以上、IBMだけでも9種類の文字コードが乱立していた。
この問題を解決するため、IBMのボブ・ベマーがアルファベットを表記するための7ビットの文字コードを ANSI(American National Standards Institute;米国規格協会)に提案した。1963年(昭和38年)、ベマー案を若干修正する形で ANSI X 3.4、いわゆる「ASCIIコード」を制定した。
一方、1964年(昭和39年)にIBMが発表した System/360 という大型コンピュータ(メインフレーム)向けに用意した、8ビット(1バイト)で英数字と制御文字を表す EBCDIC(Extended Binary Coded Decimal Interchange Code)である。国産メインフレームは、EBCDIC を拡張し、半角カタカナを追加した。しかし、メインフレームのメーカーによって文字コードが完全に一致しておらず、混乱を招いた。
ここで、7ビットで表せる文字コードは \( 2^7 = 128 \)種類、8ビットにしても \( 2^8 = 256 \)種類だ。英数字と制御文字だけなら、これで十分であるが、日本語では全く足りない。常用漢字だけで2,136文字。これにひらがな、カタカナ、句読点や括弧などの記号が加わる。
1978年(昭和53年)9月、東京芝浦電器(現・東芝)が世界初の日本語ワードプロセッサ「JW-10」を発表する。
1978年(昭和53年)9月、東京芝浦電器(現・東芝)が世界初の日本語ワードプロセッサ「JW-10」を発表する。
この年の正月、漢字など6,802文字を符号化した JIS C 6226(のちの JIS X 0208)が制定され、JW-10 はこれを文字コードとして使用できるようになっていた。
JIS C 6226 は、漢字がJIS第1水準と第2水準の2つのグループに分かれており、第1水準は音読み順、第2水準は部首・画数順に並んでいる。
JIS C 6226 は、漢字がJIS第1水準と第2水準の2つのグループに分かれており、第1水準は音読み順、第2水準は部首・画数順に並んでいる。
一方、UNIXは EUC(Extended UNIX Code Packed Format)という独自の文字コードを標準としていた。これに JIS C 6226(JIS X 0208)を組み込んだのが EUC-JP である。その後、Linuxで普及することになる。
JIS X 0208は何度か改訂があり、1987の改訂(いわゆる87JIS)では収録数が6,879の文字、記号に増えた。だが、これでは表しきれない文字、とくに人名漢字があることから、さらに6,067の文字、記号を追加した JIS X 0212(JIS補助漢字)を1990年(平成2年)に制定した。ところが、JIS X 0212 はコンピュータ向けに符号化することを想定していなかったため普及しなかった。また、2000年(平成12年)に制定された JIS X 0213(JIS第3水準、第4水準;JIS2000)も、日本語WindowsのシフトJISとして採用されなかったため、本格的な普及には至らなかった。ちなみに、JIS X 0208 と JIS X 0213 と合わせると11,233字になる。
Xeroxは1987年(昭和62年)頃から、全世界の文字を統一して扱う16ビット・コードの研究を始めていた。国際標準化機構 ISO( International Organization for Standardization)は、この流れに合流し、1991年(平成3年)10月に Unicode 1.0 として公開した。1993年(平成5年)5月、ISOは Unicode を「ISO/IEC 10646-1: 1993 Universal Multiple-Octet Coded Character Set (UCS)」として制定した。
Unicode 1.00 の収録文字数は7,161文字だった。
当時、収録すべき漢字は、日本・中国・韓国を合わせても2万文字程度で、16ビットあれば65,536文字を表現できるから、まだ3万文字以上の余裕があるとみていた。ところが、Unicodeは同じ(同じような)文字には1つの文字コードを割り当てるという考えで作られていたため、日本語と中国語で違う漢字が同じ文字コードに割り当てられたり、異体字が無視されていた。
翌1992年(平成4年)6月に発表した Unicode 1.01 では、収録文字数が28,359、1993年(平成5年)6月の Unicode 1.10 では34,233と膨れあがった。16ビットで表せる文字コードは \( 2^{16} = 65,536 \)種類であるから、不足することが目に見えてきた。
JIS X 0208は何度か改訂があり、1987の改訂(いわゆる87JIS)では収録数が6,879の文字、記号に増えた。だが、これでは表しきれない文字、とくに人名漢字があることから、さらに6,067の文字、記号を追加した JIS X 0212(JIS補助漢字)を1990年(平成2年)に制定した。ところが、JIS X 0212 はコンピュータ向けに符号化することを想定していなかったため普及しなかった。また、2000年(平成12年)に制定された JIS X 0213(JIS第3水準、第4水準;JIS2000)も、日本語WindowsのシフトJISとして採用されなかったため、本格的な普及には至らなかった。ちなみに、JIS X 0208 と JIS X 0213 と合わせると11,233字になる。
Xeroxは1987年(昭和62年)頃から、全世界の文字を統一して扱う16ビット・コードの研究を始めていた。国際標準化機構 ISO( International Organization for Standardization)は、この流れに合流し、1991年(平成3年)10月に Unicode 1.0 として公開した。1993年(平成5年)5月、ISOは Unicode を「ISO/IEC 10646-1: 1993 Universal Multiple-Octet Coded Character Set (UCS)」として制定した。
Unicode 1.00 の収録文字数は7,161文字だった。
当時、収録すべき漢字は、日本・中国・韓国を合わせても2万文字程度で、16ビットあれば65,536文字を表現できるから、まだ3万文字以上の余裕があるとみていた。ところが、Unicodeは同じ(同じような)文字には1つの文字コードを割り当てるという考えで作られていたため、日本語と中国語で違う漢字が同じ文字コードに割り当てられたり、異体字が無視されていた。
翌1992年(平成4年)6月に発表した Unicode 1.01 では、収録文字数が28,359、1993年(平成5年)6月の Unicode 1.10 では34,233と膨れあがった。16ビットで表せる文字コードは \( 2^{16} = 65,536 \)種類であるから、不足することが目に見えてきた。
そこで、サロゲートペアという概念を導入し、112万あまりの文字コードを格納できるようにした。Unicode は、絵文字やヒエログリフなど、世界中・歴史上のありとあらゆる文字を取り込み、2023年(令和5年)9月の最新版 Unicode 15.1.0 では149,813文字を収録した。
Unicode をコンピュータで扱うために編み出されたのが、UTF-8 である。Python を含む最近のプログラミング言語は UTF-8 を使うことを推奨している。
UTF-8は ASCIIコードとの互換性を保つために、文字コードが1~4バイトの可変長になっている。JIS第1~第4水準の文字は網羅しているが、並び順はJISと関係がない。文字列の長さを計算したり、文字コードで大小比較するときには注意が必要だ。
UTF-8は ASCIIコードとの互換性を保つために、文字コードが1~4バイトの可変長になっている。JIS第1~第4水準の文字は網羅しているが、並び順はJISと関係がない。文字列の長さを計算したり、文字コードで大小比較するときには注意が必要だ。
一方、IPA(独立行政法人情報処理推進機構)を中心に、人名や地名などをコンピュータで正確に表記し、漏れなくデータ交換するため、約6万文字の漢字を制定し、2017年(平成29年)12月22日に ISO/IEC 10646:2017(第5版)として標準化した。これにより、国内で使われるほぼ全ての漢字・異体字を網羅し、UTF-8 で表示できるようにした。ただし、6万文字を網羅するフォント・ファイルと対応アプリケーションが必要になる。
これを読んで文字コードに興味をもったら、「文字コードの話」をご覧いただきたい。
これを読んで文字コードに興味をもったら、「文字コードの話」をご覧いただきたい。
(この項おわり)
今回は、文字列型の基本に加え、水平タブや改行といった表示制御文字、Unicode文字などを表すことができるエスケープシーケンス、整数にカンマ区切りを付けたり小数点以下の桁数の指定を行うなどの書式指定ができるフォーマット文字列や書式演算子について学ぶ。