見出し画像

Python の変数を体感する

 今日は Python の変数の型に深く切り込んで行きます。

※ 以下のことは、オンラインプログラミング環境 ビットアロー Bit Arrow(→ https://bitarrow.eplang.jp/ )上では確認しましたが、他の環境では必ずしも同じ結果にはならないようです。ご注意ください。


【実習】 次のプログラムを実行して、1行目の input 文で「16」を、2行目の input 文で「9」を入力すると、3行目の print 文で何を表示するでしょうか? また、4行目の print 文で何を表示するでしょうか?

a=input()
b=input()
print(a**0.5+b**0.5)
print((a+b)**0.5)

 a**0.5 は$${a^{0.5}=a^{\frac{1}{2}}=\sqrt{{a}}}$$の意味です。ですから、3行目は「$${\sqrt{{a}}+\sqrt{{b}}}$$」を、4行目は「$${\sqrt{{a+b}}}$$」をそれぞれ表示せよ、という命令になります。
 ところで、Python の input 文で入力した値は、とにもかくにも文字列型です。あなたが数を入れたつもりであっても、なにはともあれ文字列型です。
 ところが「ありがたいことに」と言うべきか、あるいは「余計なことを」と言うべきか、Python は変数の型を適宜読み替えてくれたりもするわけです。
 このことは「Python のゆるさ」故と言えるかもしれません。プログラム言語によっては初めに文字列の型を定義してからでないと使えないものもありますが、Python では定義が要らないどころか、途中で型を変えることができたり、Python の方で気を利かせて、もしくは勝手に型を変えてくれたりするわけです。良いんだか悪いんだか分かりませんが、そういう Python の特徴(あるいは癖、もしくは個性)を理解して、それに合わせて使っていきましょう。

 上のプログラムを実行して、1行目で「16」を入力すると、変数 a は文字列の "16" になります。けれどもプログラム3行目で a が文字列のまま「"16"** 0.5」では意味を持ちません。一方で a が数なら「16**0.5」は意味を持ちます。そこで Python はいわば勝手に読み替えて「$${=16^{0.5}=\sqrt{16}=…}$$ 」と処理を進めてくれるわけです。
 とは言っても、Python がいつも期待通りの読み替えをしてくれるとは限りません。上のプログラムの4行目で「$${{(16+9)}^{0.5}=\sqrt{25}=…}$$」としてくれるのかと思いきや、残念ながらそうじゃない。では、エラーになるのかというと、そうでもなくて、違う処理をしてくれちゃうわけです。
 と言うのは、変数 a と b が文字列なら「a+b」は立派に意味を持つからです。数の足し算に持ち込むまでもなく、「文字列をつなげる」という意味になるのです。そして、次のステップ、すなわち平方根を取る時点「(a+b)**0.5」で、Pyhton はようやく「数」という認識をするわけです。さて、そうなるとこの4行目で何を表示するか、ちょっと考えてみてください。そして、できることなら、プログラムを実行して確認してくださいませ。

 さて、結局のところ言いたいことは「変数の型をいつも気に掛けて、意識的に変換しよう」ということです。上のプログラムで言うと、入力した時点では変数 a , b は文字列ですから、計算を始める前に「数に変換」しておきましょう。例えば次のように、入力したらその場で数(整数型)に変換しておくのが良いでしょう。

a=int(input())       # 入力した直後に整数型に変換する
b=int(input())       #                       〃
print(a**0.5+b**0.5)
print((a+b)**0.5)

 こうすれば4行目で「$${{(16+9)}^{0.5}=\sqrt{25}=…}$$」と計算して「$${5}$$」と表示してくれます。
 ところが1行目と2行目が元のままだと「"16"+"9"」の部分で文字列をつなぎ合わせて「"169"」として、次のステップ「"169"**0.5」で Pyhton はようやく「数」という認識をして「$${={169}^{0.5}=\sqrt{169}=…}$$」と計算して「 $${13}$$」を表示します。こうなるとエラーになるより始末が悪いかもしれませんね。

〈追記1〉ついでながら、素敵な数の組み合わせを見つけました。聞いてください。$${a=77}$$と$${b=44}$$を入力した場合、その2つが整数なら$${\sqrt{77+44}=\sqrt{121}=11}$$に、文字列なら$${\sqrt{'77'+\smash[b]'44'}=\sqrt{7744}=88}$$になるんですね。これらの数字、なかなか素敵でしょ。

 ここでもう一つ、関数を紹介しましょう。変数の型を返す関数 type です。次のようなコードを書いてみてください。

a=input()
b=input()
print(type(a))
print(type(a**0.5))
print(type(a+b))
print(type((a+b)**0.5))

 その上で適当な(文字列としての)数を2つ入力すると、その時点での型が表示されます。実際に大きなプログラムを作ろうとする際には、このような確認作業しながらコードを書いていくことになるでしょう。何事も経験です。いろいろと試してくださいね。

〈追記2〉またまたこんなのを思いついちゃいました。

a=input()
b=input()
c=input()
print((a+b+c)**0.5)

 上のコードを実行して、順に「1,4,4」と入力すると $${\sqrt{1+4+4}=\sqrt{9}=3}$$となるかと思いきや・・・、また順番を入れ替えて順に「4,4,1」と入力すると $${\sqrt{4+4+1}=\sqrt{9}=3}$$となるかと思いきや・・・、それはそうと「1,4,4」の場合と「4,4,1」の場合で表示するものが同じなのか違うのか・・・、結果がどうなるかについてすでに分かっている人は分かっているでしょうし、もちろん実際にやってみれば分かることですから、この辺で終わることにしましょう。

〈追記3〉同じようなことは、足し算に限らず、掛け算でも起こりうる。

a=input()
print(a*3)

 上のプログラムの1行目の input 文で「やぁ」を入力したり、「1」を入力したりしてみよう。

◇      ◇      ◇

変数には型がある 〜 
▷ Python をじっくり観察しよう
▷ Python の変数を体感する  
▷ Pythonで斬ってつなぐ   

この記事が気に入ったらサポートをしてみませんか?