Python演習ドリル200 基礎練習31〜40, 41〜50

Pythonプログラムを学び始めた方向けの演習ドリルです。

今回は、基礎練習の31〜40です。

jupyterとjupyter notebook

本演習ではjupyter notebookを使用します。 インストールされているか確認してください。 インストールされていない場合、jupyterjupyter 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 e
      

      enumerate("文字列", 開始インデックス)というように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]ab、およびcは省略可能で、省略した場合、それぞれ文字列の先頭(cが負の場合は末尾)文字列の末尾(cが負の場合は先頭)1と解釈されます。 abを省略した場合は、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  -1
      

      cc-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を学んでいきましょう。