0~3カ月目エンジニアが最初に覚えるべきPythonコーディング3選
はじめに。
今回の記事では、Pythonについて簡単な学習を行いたい、業務に向けて少しでもコードを読めるようにしておきたい。そのような方に向けた、初心者向けだけど、業務に役立つPythonコーディングについて、解説していきたいと思います。
初心者が躓くfor文の記述
業務において、また試験の学習においても良く出題されるfor文ですが、実は様々な使い方があります。
まずは、通常のfor文から見ていきましょう。
for i in range(5):
print(f"{i + 1}回目の繰り返し。")この場合の出力結果は下記のようになりますね?
1回目の繰り返し。
2回目の繰り返し。
3回目の繰り返し。
4回目の繰り返し。
5回目の繰り返し。range(5)は「0,1,2,3,4」という5つの値を生成します。
for文はそれらの値を順番に変数「i」に代入することでその回数分print関数、計5回が実行されます。
と、このような使い方が一般的で参考書でもよく記載されている形ですが、実は下記のような使い方があります。
リストの要素をすべて取り出す方法
リスト内包表記 / ジェネレータ
上記は実務、または少し応用編の参考書でよく見かける形かもしれません。
では、どのようなfor文なのかを実際に見ていきましょう。
hogehoge = ["hoge", "huga", "piyo", "payo"]
for hoge in hogehoge:
print(hoge)これは、まずhogehogeというリストがありますね。
それをfor文でhogehogeの内容を、順番にhogeに取り出すことで、
hogehogeの要素数分のprint関数が実行されます。
# 出力結果
hoge
huga
piyo
payoこのため、上記のようにリストの要素数分、計4回print関数が実行されるわけです。
ここで、皆さんなんとなくで、for i in range(5):を使っていますが、rangeはどのような値を扱っているのか確認しましょう。
print(range(5))
# 出力結果
range(0, 5)これは「0から5未満、0~4の範囲」を表すrangeオブジェクトを生成しています。そのため、for文はこのrangeオブジェクトから値を順番に取り出すことにより、下記の例と同じプログラムとなり、
for i in range(0, 5):for文が0から4までの数を順番に「 i 」に渡していくことで、for文が5回繰り返されるわけです。
次にリスト内包表記とジェネレータを見ていきましょう。
# リスト内包表記
hoge = [i + 1 for i in range(5)]
for h in hoge:
print(f"{h}回目の繰り返し。")
# ジェネレータ
huga = (i + 1 for i in range(5))
for h in huga:
print(f"{h}回目の繰り返し。")まず、記法に関しての違いは「 [ ] 」と「 ( ) 」となりますね。
[ ] で作成している方に関しては、リスト内包表記といいます。具体的にどのような値を生成しているか、print関数で見てみます。
print(hoge)
[1, 2, 3, 4, 5]このように、リスト内包表記は値をその場でまとめて生成することができるため、print関数で値を確認すると、上記の結果を得ることができます。
次にジェネレータです。ジェネレータの中身を見てみましょう。
print(huga)
<generator object <genexpr> at 0x.....>あれ?中身を確認すると、リスト内包表記のように値を取得できませんでした。
これが、リスト内包表記とジェネレータの違いになります。
リスト内包表記は、値が直ちに作成されます。
したがってprint関数でhogeを確認したときに、値を確認することができましたね?
ですが、ジェネレータは実際に呼ばれるまで、その値を生成しません。つまりリスト内包表記と異なり、直ちに生成されないわけですね。
そのため、for文では値を読み込むことができましたが、print関数では値が取得できなかったわけです。
あれ?print関数でも値を呼ばれていませんか?となりますね。
ですが、print関数があくまでオブジェクトを表示するだけです。
これではまだジェネレータは値を生成していないため、<generator object <genexpr> at 0x…..>が表示されてしまうわけです。
for文は内部でnextを呼んでいます。そのため、値が生成されるため、ジェネレータから値を取得することができる訳ですね。
つまり、リスト内包表記は即座にリストを生成して、ジェネレータは呼ばれるまで待つの違いがあります
初心者が躓くif文の記述
皆さん。if文というと、どのようなものを想像しますか?
下記のような記述ではありませんか?
hoge = "hogehoge"
if type(hoge) is str:
print("これは文字です。")
elif type(hoge) is int:
print("これは整数です。")
else:
print("文字と整数以外の値。")この場合は知っての通り、「これは文字です。」が出力されますね。
通常のif文の使い方です。
では、こちらはどうでしょうか?
hoge = 100
print("整数です。" if type(hoge) is int else "整数以外の値です。")このような、記載の方法を三項演算子といいます。
実は上記のような簡単なif文であれば、1行で簡潔に記載することが可能です。今回は、hogeの値が整数かを確認している三項演算子で出力結果は「整数です。」となります。
意外にこのような記述もできます。
def is_type_checked(item_type) -> str:
match item_type:
case str():
return "文字です。"
case int():
return "整数です。"
case float():
return "小数です。"
case _:
return "それ以外です。"
print(is_type_checked("文字"))
print(is_type_checked(100))
print(is_type_checked(0.1))Pythonにはmatch文があります。このmatch文はどのような値なのかを調べて、条件に一致したcase節の処理を実行することができます。
今回は、値の型を確認する、is_type_checked関数を作成して、その関数にそれぞれ、文字、整数、小数を渡した結果です。
# 実行結果
文字です。
整数です。
小数です。このように、match文を使用することで、if文とは異なる形で、分岐処理を記述することもできます。
最後に。
如何でしたでしょうか。皆さんは今回ご紹介したfor文、if文、match文についてご存じでしたでしょうか?
私も最初にPythonの学習をしたときに、上記3点の学習には躓いたものです。
これらの内容は、突如、試験や現場で出現してくる記法だと思いますが、
一度でも内容を確認しておけば、「あ!これはあの時に見た書き方だな。」と思いだし、対応できるようになってくるかと思います。
それでは、これからもプログラミングの学習を頑張ってください。
ありがとうございました。
