もちこに勉強部屋(仮)

プログラミング初心者がPython × Streamlitでアプリ開発目指して学習過程を記録したりただ遊んでたりするだけの部屋

プログラミング初心者がChatGPTと一緒にPython独学する:④四則演算アプリの作成

今回は足し算のほかに引き算・掛け算・割り算もできるアプリを作ります。

さっそくGPTに課題の確認をしよう!

全然ちがう

課題の内容も違うしキャラも違う。

前回のおさらい

GPTは忘れているようですが、足し算のみの計算アプリを作りました。

mochiconi.hatenablog.com

できあがったアプリ自体はシンプルでしたが、コードの詳細を調べてみると色々な発見がありました。
一応サクッとまとめるとこう↓

  • st.number_input("ラベル", value=初期値, step=増減の幅)
    →設定通りの数値入力フィールドを設置

  • if st.button("ラベル"): ○○○
    →押すと○○○が起こるボタンを設置

この2つのコードは今回も使いそうですね。

四則演算アプリを作ってみる

1. pyファイルを作成する

今回のコード↓

import streamlit as st

st.title("四則演算アプリ")

# 入力欄
a = st.number_input("1つ目の数字", value=0.00, step=0.01)
b = st.number_input("2つ目の数字", value=0.00, step=0.01)

# 演算子の選択
op = st.selectbox("演算を選んでね", ["+", "-", "×", "÷"])

# ボタン
if st.button("計算する"):
    if op == "+":
        result = a + b
    elif op == "-":
        result = a - b
    elif op == "×":
        result = a * b
    elif op == "÷":
        if b == 0:
            st.error("0で割ることはできません!💥")
        else:
            result = a / b

    # 結果表示(割り算の0除算以外)
    if op != "÷" or b != 0:
        st.write("結果:", result)

なんとなく想像できるところが出てきたのがうれしい。

a、b、op、result はぜんぶ変数だとして(たぶん)、

  • st.selectbox("演算を選んでね", ["+", "-", "×", "÷"])
  • elif
  • st.error("0で割ることはできません!💥")

このへんが新しい雰囲気。
あと、== ってなに。

では、テキストドキュメントにコピペしてpyファイルに形式変換しましょう。

 

2. Anaconda Prompt でpyファイルを起動

起動!

st.number_inputで設定した通り、数値入力フィールドの初期値は0.00、±ボタンを押したときの増減の幅は0.01となっています。

そして最後の「演算を選んでね」のところがドロップダウンリストになっていて、演算子を選べるようになっています。

暗算ができないので電卓をはじきましたがちゃんと合ってました。
正常に動作している様子。

ちなみに2つ目の数字に0、演算子を÷にしたらこうなりました↓

怒られちゃった

これは「st.error("0で割ることはできません!💥")」の記述が効いてますね。

今回は「ドロップダウンリストから選んだ選択肢によっての分岐」と「特別な条件下での分岐」が深掘りポイントな予感。

 

四則演算アプリのコード詳細

1. ==の意味

まず「 if op == "+"」の、「==」という、イコールがふたつ繋がってるところ。
「=」って、等しいって意味なんだから、
「 if op = "+"」みたいに「=」ひとつじゃダメなんですかね??

GPTに聞くと↓

ダメ、役割が完全に別。

  • == は 比較(条件式に使える
  • = は 代入(条件式に使えない

ちがった。

X == 0」だと「Xって0で合ってる?ちょっと確かめてみて~」という質問で、
X = 0」だと「Xは0ってことにして!いや合ってるとか合ってないとか関係ない絶対0!!」という問答無用の命令になるそうです。

ということで、if の条件式には == しか使えないらしい。

ちなみに if の中に「=(命令)」を使うと「いや、条件もクソもないじゃん」ってエラーが吐き出されるみたいです。今度試してみます。

比較コード一覧

  • x == 0 → 等しい
  • x != 0 → 等しくない
  • x > 0    → 0より大きい
  • x < 0    → 0より小さい
  • x >= 0   → 0以上
  • x <= 0   → 0以下

 

2. st.selectbox( )

セレクトボックス=ドロップダウンリストを設置しているコードです。
今回だとこう↓

st.selectbox("演算を選んでね", ["+", "-", "×", "÷"])

なんとなく" "内はラベル[ ]内は選択肢ということがわかりますね。
他にも任意で色々な設定ができるそうですが、ここでは使用しないため例によって割愛します。

これをopという変数に代入するようになっていました。

# 演算子の選択
op = st.selectbox("演算を選んでね", ["+", "-", "×", "÷"])

# ボタン
if st.button("計算する"):
    if op == "+":
        result = a + b

この場合でいうと、セレクトボックスで "+" を選択すると
op = "+" が代入され、
op == "+" がTrueだった場合は
足し算(a + b)で計算された結果が result という変数に代入されます。

では、続けて selectbox での選択による分岐を見てみましょう。

 

3. if〜elif で演算を分岐

急に出てきた elif が謎。GPTに聞いてみよう。

elif は else + if だよ

……!?
else も初めてなんだけど、なに?

ちょっとまずは else についてちゃんと聞きましょう。

else とは?
  • else 
    →if の条件に対して False の場合の処理

前回までで、 if はその後ろに「True になる前提で True のみの結果を書く」ことを学びました。そして False の場合はとりあえず割愛したんですね。(すな)
なので突然 False が出てきてビックリしちゃいました。

つまりこんな感じだそうです。

if ●● : ○○○
else : △△△

→●●が True のとき○○○し、False のとき△△△する。(分岐

※ else は直近の if に対応する

なるほど!
これで2つの分岐はOKですね。

elif とは?

で、 elif の話にもどります。

elif = else + if なんですって。
つまり「if に対して False だった場合にさらに条件を確認する」という意味なんだそうです。

例えば↓

if 条件A : 結果A
else : if 条件B : 結果B
         else : if 条件C : 結果C
                  else : if 条件E : 結果E………

こういう無限地獄みたいなやつを、すっきりさせてくれるってことですね。
※ちなみに、このように「else :  if」という形で Falseの場合の分岐としてifに直接繋げることはPythonでは無理らしい。

じゃあ例えば、変数Xに入力する数値が

  • 1以上のとき「正の数です」
  • -1以下のとき「負の数です」
  • 0のとき「0です」

と表示させるとしたら、こう?↓

if X>0 : st.write("正の数です")
elif X<0 : st.write("負の数です")
else :  st.write("0です")

ちょっと作ってみましょう。

import streamlit as st

st.title("試しに作ってみたよ")

# 入力欄
X = st.number_input("ここに数字を入力", value=0, step=1)


# 結果
if X>0 : st.write("正の数です")
elif X<0 : st.write("負の数です")
else :  st.write("0です")

これを起動させてみます。

初期値0 = 0ですと表示された!

お!!!!!

正の数、負の数も入力した瞬間にばっちり表示されてます!
(最初まちがえて if X>1って書いてたので1ずつ結果がズレて発狂しました)

今回はすべての条件に当てはまらなかった場合(= else)を0としましたが、最初の if で0を設定しようとするなら

if X==0 : st.write("0です")

と、イコールがふたつ続く「比較」の形にしなければならない、ということですね。(たぶん)

 

if のみでの分岐と elif を使った分岐の違い 

3つ以上の分岐を作るのに elif を使うことはわかりました。
でも例えば、elif を使わなくても if をずら~~~と並べたらどうなの?

if X==0 : st.write("0です")
if X>0 : st.write("正の数です")
if X<0 : st.write("負の数です")

これなら、結果は変わらないし同じじゃない?

………と思ったら、
結論から言うと、仕組みが全く変わるらしい。

  • if/elif を使う場合
    →最初にTrueになったひとつの処理のみが実行される
  •  if のみを並べる場合
    →Trueになったすべての処理が実行される

Python は「上から順番」に処理を実行するため、elif を使うと「直近の if に対して、上から一番先にTrueになった処理」が実行されます。

if のみ並べるとそれぞれの if が独立するため、True になったすべての処理が実行されるんですね。

どちらの処理をしたいのかによって、適切な使い分けが必要ですね。

 

ここで一旦休憩

  • st.error( )
  • # 結果表示(割り算の0除算以外)の中身

このへんまでここで解きほぐしたかったんですけど、ちょっと記事内と頭がぐちゃぐちゃしてきたので一旦ここで休憩とします。

では、また次回。