レッスン125
Python演習ドリル200 基礎練習31〜40, 41〜50⌗
Pythonプログラムを学び始めた方向けの演習ドリルです。
今回は、基礎練習の31〜40です。
jupyterとjupyter notebook⌗
本演習ではjupyter notebookを使用します。 インストールされているか確認してください。 インストールされていない場合、jupyterとjupyter notebookのインストール方法については、レッスン33を参照してください。
演習前の基礎学習⌗
実際にjupyter notebookを使用して演習を行う前に、演習の中で使用するPythonの機能について学習しましょう。
-
文字列処理
-
for文による文字列の逐次処理for c in "文字列":のように、文字列をループ文で処理すると、変数cに文字列の文字が文字列数分、1文字ずつ格納され、ループ処理されます。例えば、以下のように文字列を
for文で処理し、print()関数で出力すると、(出力結果)のように出力されます。for c in "abcde": print(c)(出力結果)
a b c d e文字列には英数だけでなく、日本語(漢字、かな、カナ)も使用でき、全て1文字単位で処理されます。
-
enumerate()関数
for i, c in enumerate("文字列"):のように文字列をenumerate()関数で処理すると、変数iには0から始まり1ずつ増えるインデックスの値が格納され、変数cには文字列の文字が1文字ずつ格納され、ループ処理されます。例えば、以下のように文字列
for文で処理し、print()関数で出力すると、出力結果のように出力されます。for i, c in enumerate("abcde"): print(i, c)(出力結果)
0 a 1 b 2 c 3 d 4 eenumerate("文字列", 開始インデックス)というようにenumerate関数の2番目の引数に開始インデックス(例えば1)を指定すると、開始インデックス(例えば1)から始まり1ずつ増えたインデックスの値が変数iに格納されます。(変数cに格納される文字は開始インデックスの有無・内容によって変わりることはありません) -
文字列のスライス
"文字列"[i]のようにインデックスを指定すると、文字列のi番目(0から始まる値)の文字を取得できます。"文字列"[a:b]のように指定すると文字列のa番目からb-1番目(0から始まる値)の文字列を取得できます。"文字列"[a:b:c]のように指定すると、文字列のa番目からb-1番目(0から始まる値)までの文字をc-1文字おきの(cずつずらした)文字列を取得できます。"文字列"[a:b]および"文字列"[a:b:c]のa、b、およびcは省略可能で、省略した場合、それぞれ文字列の先頭(cが負の場合は末尾)、文字列の末尾(cが負の場合は先頭)、1と解釈されます。aとbを省略した場合は、cの符号とは関係なく全ての要素の範囲が選択されます。(もちろん、cの値によって実際に取得される文字列は異なります)"abcde"[1] # "b" "abcde"[1:4] # "bcd" "abcde"[1:5:2] # "bd" "abcde"[:] # "abcde" "abcde"[:3] # "abc" "abcde"[2:] # "cde"インデックスには負の値も使用することができます。 負の値は
-1が文字列の最後尾の位置、-1増えるごとに1つずつ前の位置を示し、文字列の先頭は-文字列の長さになります。スライスで指定する位置(インデックス)は要素と要素の間を指す、と考えると理解しやすいです。
+---+---+---+---+---+---+ | a | b | c | d | e | f | +---+---+---+---+---+---+ 0 1 2 3 4 5 6 -6 -5 -4 -3 -2 -1cのc-1文字おきの(cずつずらした)値にも負の値を指定することができ、負の場合、末尾方向から逆順に要素を取得します。"abcde"[::-1]のように指定すると、全ての文字を文末から文頭に1文字ずつ逆方向に取得する、すなわち、文字列を反転して出力することになります。cが省略されるか、正の値の場合は、正のインデックスに換算してa < b、負の場合は、正のインデックスに換算してa > bでないと何も取得されません。(空の文字列"“になる)"abcde"[-1] # "e" "abcde"[1:-1] # "bcd" "abcde"[::-1] # "edcba"なお、文字列を反転する方法としては
reverse()という関数を用いることもできます。 -
in(含まれる)"文字列1" in "文字列2"という式で、文字列1に文字列2が含まれているかを判断することができ、含まれていればTrue、そうでなければFalseを返します。 -
count(含まれる数を返す)"文字列1".count("文字列2")という関数で、文字列1に文字列2が何個含まれているかの数を返します。 -
stringモジュールの定数stringモジュールをimportすると以下のような文字列定数を使うことができます。-
string.ascii_lowercase
英小文字
abcdefghijklmnopqrstuvwxyzの文字列 -
string.ascii_uppercase
英大文字
ABCDEFGHIJKLMNOPQRSTUVWXYZの文字列 -
string.ascii_letters
前述のstring.ascii_lowercaseとstring.ascii_uppercaseを合わせた文字列
-
string.digits
数字
0123456789の文字列 -
string.hexdigits
16進数字
0123456789abcdefABCDEFの文字列 -
string.octdigits
8進数字
01234567の文字列 -
string.punctuation
区切り文字として扱われるASCII文字
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~の文字列 -
string.whitespace
空白文字(whitespace)として扱われるASCII文字の文字列
-
string.printable
上述のstring.digits、string.letters、string.punctuation及びstring.whitespaceを合わせた文字列
-
-
join関数"区切り文字".join("文字列")で、文字列の各文字を指定の区切り文字で区切った1つの文字列を出力します。"->".join("abcde") # "a->b->c->d->e" -
split関数"文字列".split("区切り文字")で、1つの文字列を指定の区切り文字で区切り、区切った各文字列を文字列の配列として出力します。"a,b,c,d,e".split(",") # ["a","b","c","d","e"]なお、
split()のように区切り文字を指定しない場合、空白文字(スペース、改行、タブなど)を区切り文字とし、連続する空白文字はまとめて1つの空白文字として処理されます。"a b c d".split() # ["a","b","c","d"] -
strip関数"文字列".strip()で文字列の先頭と末尾にある余分なスペース記号(スペースや改行など)を全て除去して出力します。" abcde \n".strip() # "abcde" -
replace関数"文字列1".replace("文字列2", "文字列3")で、文字列1中の文字列2を全て文字列3に置換えて出力します。"abcaab".replace("a", "_") # "_bc__b" -
chr関数とord関数各文字には、文字コードという文字1つ1つに付けられた値があります。 例えば
aは97、bは98というふうに、小文字のアルファベットは97から始まる文字コードが付けられています。 大文字は65から始まり、数字は48から始まります。文字コードの値を文字に変換するには
chrという関数を使用し、chr(97)のようにすると、数値の文字コード値97を文字"a"に変換できます。 同様にordという関数を使用し、ord("a")のようにすると、文字"a"を数値の文字コード値97に変換できます。 なお、ord関数に2文字以上の文字列を渡すとエラーになります。chr(97) # "a" ord("a") # 97 -
書式化
f文字列のおさらいと追加項目
桁数のNは定数値です。 また、10進数の数を示す
dは省略可能です。-
変数xの値を文字列に入れる場合
f"文字列1{x}文字列2" -
変数xの10進数の値をコンマ(,)による3桁ずつの桁区切りで表示したい場合
f"{x:,d}"f"{x:N,d}"(スペース埋めN桁表示) -
変数xの値を2, 8, 10, 16進数でスペースで埋めてN桁で表示したい場合
f"{x:Nb}",f"{x:No}",f"{x:Nd}",f"{x:Nx}" -
変数xの値を2, 8, 10, 16進数で0で埋めてN桁で表示したい場合
f"{x:0Nb}",f"{x:0No}",f"{x:0Nd}",f"{x:0Nx}" -
変数xの値を2, 8, 16進数でそれぞれ頭に
0b,0o,0xを付けてN桁で表示したい場合f"{x:#Nb}",f"{x:#Nd}",f"{x:#Nx}" -
変数sの文字列を文字cで埋めてn桁で表示したい場合(cが省略されるとスペース埋め)
-
右寄せ
f"{s:c>Ns}" -
中央寄せ
f"{x:c^Ns)" -
左寄せ
f"{s:c<Ns}"
右寄せ、中央寄せ、左寄せは、文字列だけでなく、数値に対しても使用できます。 その際は、右端の
sの部分がb,o,d,xなどになります。 -
-
-
演習⌗
それでは実際にjupyter notebookを使用して、演習を行います。
コマンドラインからgit pullを実行してmcc1フォルダに最新のファイルをダウンロードしてください。
ターミナルのコマンドラインからcd mcc1/code/jupyterを実行して、jupyterフォルダに移動し、jupyter notebookを実行してください。
すると、ブラウザが起動し、jupyterのホーム画面が表示されます。
その中からPython演習ドリル200基礎練習31〜40.ipynbをクリックしてください。
そうするとPython演習ドリル200基礎練習31〜40というタイトルの演習問題が表示されます。
課題31から課題40までありますので、課題の内容にしたがって、In[]:の部分にPythonプログラムを書いてください。 書き終わったら、画面上の ▶| Run というアイコンをクリックすると、今書いたPythonプログラムが実行されます。
出力結果が課題の(実行画面)と一致するか確認してください。
どうしても正解がわからないときは、▶プログラム例 をクリックすると、正解例のPythonプログラムが表示されます。
終わったら、ホーム画面に戻って、Python演習ドリル200基礎練習41〜50.ipynbをクリックしてください。
そうするとPython演習ドリル200基礎練習41〜50というタイトルの演習問題が表示されます。
同様に課題41から課題50までの課題の内容にしたがってPythonプログラムを書き、出力結果と一致するか確認してください。
まとめ⌗
今回はPython演習として、文字列処理と書式化を行いました。
今後も新しい演習問題を追加していきますので、演習を通じてPythonを学んでいきましょう。