【PyQで勉強】「Pythonはじめの一歩」のメモ書き

Python

 

前回、PyQのコースの”プログラミングはじめの一歩”をコンプリートし、次のステップとして”Pythonはじめの一歩”というコースに挑戦です。

 

本日”Pythonはじめの一歩”を終えたのですが、前回の”プログラミングはじめの一歩”に比べて、急にレベルが上がりました。

覚えることが増え、さらに複雑になったため、何度か繰り返し勉強することでようやく自力でコンプリートできるレベルになりました。

 

コンプリートするのに一週間ほどかかりました。(一日4時間ほど)

道のりはまだまだ長く、まだまだ基礎中の基礎しかできませんが、着実にできることが増えているという実感を持っています。

できることが増えていくことを実感できるのは、やっていて本当に楽しく、充実感がありました。

 

ぜひともPython初心者には、”Pythonはじめの一歩”をコンプリートして欲しいです。

今回はコンプリートするまでに、学んだ内容(のメモ書き)を紹介したいと思います。

 

これを読めば、PyQの”Pythonはじめの一歩”で学べる内容を網羅できます。

もちろんメモ書きなので、詳しく学びたいのであればPyQで学習することをおすすめします。

 


辞書を使ったプログラム

Pythonには”辞書”というとても重要な機能があります。

辞書とは、キーと、キーに対応する値をもつ要素の集まりで、要素の集まりという意味では”プログラミングはじめの一歩”で学んだ”リスト”と同じ機能を持っています。

 

辞書名 = {キー1:値1, キー2:値2, キー3:値3, ・・・}

 

リストは複数の要素を持っており、インデックス番号で要素を判断していますが、辞書の場合は、キーを使って判断し、値を呼び出すことができますが、インデックス番号だと、どの番号に何が紐づいているのかを覚えるのが困難というデメリットがあります。

一方、辞書であれば、関連するキーの名前と値を結び付けられるので、利用しやすく、とても有効的な機能です。

要素(キーと値)の追加方法・取り出し方法

辞書にキーと値を追加する方法はとても簡単です。

辞書名[キー名] = 値

これでOKです。

 

追加されているキーと値を参照したい場合は、

print(辞書名)

を入力して実行するだけで、キーと値をすべて抽出することができます。

 

また、辞書名[キー名]で、値を取り出すことができる。

→佐藤

辞書の値の更新・削除

辞書に値を追加するとき、

辞書名[キー名] = 値

で追加可能といいましたが、既にこのキー名が辞書内に登録されている状態であれば、辞書名[キー名] = 値で、値を更新することができます。

 

また、要素(キーと値)を削除したいときは、

del 辞書名[キー名]

で削除したいキーと値を削除することができます。

 

また削除するもう一つの方法としてpopメゾッドがあります。

popメゾッドは、リストのインデックスを削除する方法でも紹介したとおり、要素を削除し、かつその要素の値を取得することができます。

変数 = 辞書名.pop(‘キー名’)

 

キーが存在するか否かの確認

if ‘キー名’ in 辞書名:

辞書にこのキーが入っていれば:true

辞書にこのキーが入っていなければ:false

を返すことができます。

 

辞書名.get(キー, キーがない場合の値)

キーがあればそのキーの値を取り出し、キーがない場合は二つ目の引数を表示させます。

※sep=”を入力することで、文字列の間のスペースを削除することができる。

 

キーや値のリストを表示する

.keysメゾッドでキーを表示、.valuesメゾッドで値を表示できます。

また.itemsメゾッドで、キーと値の組み合わせを表示できます。

 

itemsメゾッドを使わずとも、print(辞書名)でキーと値の組み合わせを表示することもできます。

 

for文を使ったキー・値の表示方法

for文を使ったキーと値の表示方法は2つあります。

 

一つ目が、for 変数 in 辞書名:です。

変数にはキーが代入されて、全キーが繰り返されます。

 

上記コードの場合、まずはxにパンダが代入されるので、

x = パンダ

animals[x] = 1-1

となり、print(x, animals[x])は、”パンダ 1-1″という出力結果となります。

 

次に象、猿のキーでも同様のことが繰り返され、最終的な出力結果は以下になります。

パンダ 1-1
象 2-1
猿 2-2

 

キー・値を表示するもうひとつの方法が、itemsメゾッドを使用した方法です。

for キー変数, 値変数 in animals.items():

 

キー変数と値変数をそれぞれ設定し、そこにキーと値が繰り返し代入されます。

具体的には以下のように使用できます。

出力結果は、さきほどと同じで以下のようになります。

パンダ 1-1
象 2-1
猿 2-2

リスト、辞書、for文、if文を使って集計してみる

for文とif文を使って、リストに書かれている内容を集計することができます。

 

例えばランチの注文リストが以下のようにあるとします。

lunch = [‘カレー’, ‘唐揚げ’, ‘うどん’, ‘カレー’, ‘カレー’, ‘唐揚げ’, ‘カレー’, ‘唐揚げ’, ‘カレー’, ‘うどん’, ‘唐揚げ’, ‘うどん’]

 

この注文数を集計する場合、以下のようにプログラムを組むことで集計が可能です。

出力結果は、以下のようになります。

カレー:5
唐揚げ:4
うどん:3

 

このプログラミングの構造について解説します。

 

まずは集計用辞書としてcount = {}を用意します。

これは次に続く集計作業において使用する辞書です。

 

そして、これが実際に集計を行うプログラミングです。

for menu in lunch:

これはつまり、リストlunchの要素が変数menuに代入され、lunch内の全要素がmenuに代入されるまでfor文内を繰り返すということです。

 

lunchの一つ目の要素は”カレー”なので、まずはmenuにカレーが代入されます。

そして次に続くif文が、”if menu in count:”です。

これを日本語訳すると、”count辞書内にカレーがあったらtrue、なければfalse”となります。

countは、さきほど集計用辞書として用意した空の辞書です。

 

まず最初のカレーの時点では、count辞書は空なので、if文の答えはfalseです。

falseなので、”count[menu] = 1″が実行されます。

このプログラミングは、さきほど説明したとおり、count辞書内にキー:カレー、値:1を追加する役割を果たします。

 

もし既にcount辞書内にキーが含まれている場合は、trueの場合のプログラミングである”count[menu] += 1″が実行されます。

これは日本語訳すると、”count辞書内のmenu(カレーor唐揚げorうどん)の値を1増やす”ということです。

つまり、リスト内の要素が読まれる度に、該当するキーが辞書に追加されたり、値が1増えていくということです。

 

リスト内の全要素でプログラミングが実行されれば、集計は完了です。

count辞書内にすべてのmenuと、それぞれの値が集計されています。



本気のプログラミングスクール【ウェブカツ】

ファイルを読み込む方法

情報が多くなるほど、複数のファイルに情報を整理してまとめるということが必要になってきます。

一つのファイルに全ての情報をまとめてしまうと、データが膨大になり、どこに何が記入されているか分からなくなってしまいます。

 

そのため、データ量が増えるほど、格納するファイルを複数用意して整理しておく必要があるのですが、そんなときに必要になってくる機能が、別ファイルに記載されている情報を読み込む機能です。

 

別ファイルの内容を読み込む方法は2つあります。

 

一つ目: with構文を使用しない場合

 

二つ目:with構文を使用する場合

 

Pythonにおけるwithとは、開始と終了を必要とする処理を行うときに使用します。

別ファイルを参照する場合は、openが開始、closeが終了の役割をしているため、with構文を使用することができます。

with構文を使用する方法の方がいろいろと使い勝手が良いようで、こちらで覚えておけばOKです。

 

また、上記コードではreadメゾッドを使用して別ファイルから情報を読み込んでいますが、for文を使って読み込む方法もあるので、そちらをまとめます。(for文を使用する方が汎用性が高く、重要です。)

 

for 変数 in ファイルオブジェクト:と書くと、ファイル1行分ずつの文字列を変数に代入します。

この方法で1行ずつ読み込むと、ファイルの各行の末尾に改行文字\nが付くため、実行すると1行ごとに空行が表示されます。

 

そこで利用するのがrstripメゾッドです。

変数.rstrip()とすることで、文字列の末尾の空白文字(半角スペース、全角スペース、タブ、改行など)を取り去ることができます。

ちなみにlstripメゾッドは文字列の先頭の空白文字を削除することができ、stripメゾッドでは先頭と末尾の空白文字を削除することができます。

 

別ファイルに書き込む方法

別ファイルから読み込むことができれば、別ファイルに書き込むこともできます。

書き込み方は、読み込み方にとても良く似ています。

 

違う点は、モード指定の’w’を使う点と、readメゾッドではなくwriteメゾッドを使う点です。

モード指定とは、open()関数の中で、ファイルを開いて何をしたいかを指定する役割を担っています。ファイルを読み込みたいのであれば指定するモードは“r”です。ただし”r”の場合は省略できるというルールがあるため、さきほど紹介したファイルの読み込み方法では”r”は使用していませんでした。

モード指定の方法は、open(‘ファイルパス’, ‘モード指定’, encoding=’ソースコード’)です。

 

ちなみに、’w’を指定すると、実行するたびに全てを上書きしてしまいます。

実行するたびに末尾に追加で書き込みたいのであれば、’a’を指定する必要があります。

 

writeメゾッドの使い方はとても単純で、変数.write(‘書き込みたい内容’)でOKです。

writeメゾッドは、print()関数のように自動で改行されません。writeメゾッドを使って改行するのであれば”\n”を追加することで、改行することができます。

 

文字列を分割する方法

たとえば文字列”a,b,c,d,e”があるとします。

a~eの文字がコンマで区切られて並んでいるときに、コンマごとに値を分割することができれば、a~eの文字をリストとして扱うことができるようになります。

 

それを実現するのがsplitメゾッドです。

splitの使い方は以下の通りです。

文字列.split(‘区切り文字’)

 

この実行結果は、

[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]となり、それぞれの文字を要素として持ったリストを作成することができます。

 

日時を扱うときに使えるdatetimeモジュール

モジュールとは、ライブラリとも呼ばれるもので、importして呼び出すだけで便利に使える処理を集めたものです。

標準で備わっている標準ライブラリと、外部から呼び出す必要がある外部ライブラリとがあります。

 

日時を扱うときには、datetimeモジュールを使いましょう。

from モジュール名 import 対象クラス名

※モジュールの中のクラスのみを使用する場合は上記のように入力。モジュール全体を利用するときは、import モジュール名でよいです。

 

ちなみにdatetimeモジュールには、主なクラスとして以下の4つがあげられます。

  • date: 年月日の日付を扱う
  • time: 時分秒、マイクロミリ秒の時刻を扱う
  • datetime: 日付時刻(日付と時刻の両方)を扱う
  • timedelta: 日付や日付時刻の間隔を扱う

 

また、上記コードでは、datetimeクラスのnowメゾッドを使用しています。

datetime.now()

このdatetime.now()はクラスメゾッド(クラス名.メゾッド名)であり、ローカルの現時刻を呼び出すことができ、日付時刻オブジェクトと呼ぶことができます。

 

日付時刻オブジェクトに、year、month、dayなどのメゾッドを使うことで、年、月、日などをそれぞれ抽出することができます。

この場合、出力結果は現在の年であり”2020″が表示されることになります。

 

日付時刻オブジェクトを指定するには、datetime(年, 月, 日, 時, 分, 秒)と入力することで指定できます。

出力結果は、”2016-01-31 00:00:00″です。

 

timedeltaクラスを利用することで、日付時刻を足し算引き算することができるようになります。

まず、timedeltaクラスを利用する場合は、from datetime import timedeltaでインポートします。

 

足し算引き算はとても単純で、

時刻日付オブジェクト ± timedelta(days=日数)

で行うことができます。

 

出力結果は、”2020-07-22″です。

 

また比較演算を使うこともできます。

上記コードに続いて print(olympic_day > before_2days)とすると、olympic_day > before_2daysは正しいのでTrueが返されます。

フォーマット済み文字列リテラル f-string

文字列の頭にfかFを付け、式を{expression}と書くことで、Pythonの式の値を文字列の中に入れ込めます。

f-stringsの機能の一つに:を入力して書式を設定できるという機能があります。

上記のコードでは:%Y/%m/%dと書式を設定しており、これにより2016/08/11という書式に変更されています。

またone_day =とすることで(イコールをいれることで)、出力結果にone_dayも表示されるようになります。

 

文字列から日付時刻オブジェクトに戻す場合に使用するのが、strptimeメゾッドです。

datetime.strptime(時刻を表す文字列, フォーマット)、というように使います。

ここでいうフォーマットは、時刻を表す文字列がどのように時刻を表記しているかを示す役割を果たします。

出力結果は、日付時刻オブジェクトの表記である”2016-12-31 00:00:00″となります。

 

文字列の精査

世界のナベアツの定番ボケである、”3の倍数と3の付く数字のときだけアホになる”というゲームをプログラミングで実現すると以下のようになります。

ここで注目すべきは、3の付く数字をどうやって判別するかということです。

3の倍数か否かの判断は%を使用することで簡単に実現できますが、3の付く数字を判別するのにどうやったらよいか少し悩みます。

 

この場合、文字列に変換することで、3が含まれているかどうか確認することができます。

上記コードの中の‘3’ in str(i)がその部分にあたります。

inを使って、文字列の中身を精査することができるということを覚えておきましょう。

 

まとめ

“Pythonはじめの一歩”では最後に演習問題がいくつか用意されており、簡単なゲーム(おみくじゲームやじゃんけんゲーム)を作成してコンプリートとなります。

 

ここで学んだ辞書、ファイルの読み込み・書き込みは、今後多用し続けるであろうPythonの重要機能であり、必ずマスターしなければなりません。

マスターといっても、完全にマスターすることなどないので(Python自体が進化を続けているので)、今回学んだ基礎をもとに、使い続ける中でもっと学んでいかなければなりません。

 

この”Pythonはじめの一歩”で得られた個人的な最も大きな成果は、Pythonを学ぶことが楽しいと思えたことです。

まるで数学の問題を解いたり、パズルを解いていくかのように、論理的思考と閃きが試されます。

もっともっと経験を積むことで、Pythonにおける思考力や発想力が豊富になっていくと思うと、今後の学習が楽しみでなりません。

 

次のコースは”Python初級”です。

いよいよ関数を学んでいくようです。

関数を学べば、対応できる範囲が爆発的に拡大すると思うので、しっかし基礎から学び、より深い理解ができるように頑張ります。

 

引き続き頑張りましょう。

コメント

  1. […] 【PyQで勉強】”Pythonはじめの一歩”のメモ書き […]

タイトルとURLをコピーしました