Pythonで感じる プログラミング
kindleで書籍化しました。
本で読んでみたい方は、ご確認ください。
1章.はじめに
プログラミングとは何か
この記事は、はじめてプログラミングをする人を対象としたものです。
世間で話題になっているプログラミングについて、興味はあるけど、どのように始めてよいか分からない人に参考になれば幸いです。
プログラミングとはデータを使って何らかの計算や処理をして、それを出力するためのコンピュータへの指示書です。
この指示書は私たちの使用する言語で書かれても、コンピュータは理解できないので、プログラミング言語で書く必要があります。
このプログラミング言語は非常に種類が多く、現在200-300種類程度あると言われています。
その中で Python というプログラミング言語を使用して、プログラミングの基本的な考え方を説明しようと思います。
この Python というプログラミング言語を選択した理由は「人気がある」からです。
ITエンジニアのコミュニティサイトの1つである「Stack Overflow」で約9万人の IT エンジニアにアンケートを取った結果、最も使われているプログラミング言語は JavaScript で、次に HTML/CSS、そして第3位としてPythonが選ばれています。(2023年)
こうみると JavaScript の方が人気があるのではないかと思われると思いますが、若干取り扱いに苦戦するクセのようなものがあります。
次に HTML/CSS はマークアップ言語と呼ばれ、Web ページの見た目を作る言語であり、プログラミング言語と分類しづらい点があります
そのため Python を選択しています。
また Python は教育分野でも広く使用されており、海外の大学などでも科学計算の授業で使用されています。
プログラミング言語において「人気」というものは非常に重要なパラメータです。
人気があると「情報量が多くなる」、「便利なツールが開発される」等のメリットが発生します。
また新たにプログラミング言語が生まれる際にも人気がある言語に影響を受けることが多いので、新言語の習得を楽にするというメリットが生まれることもあります。
Python のデメリット
プログラム言語全般に言えることですが、向いているジャンル、向いていないジャンルが存在します。
その結果として多くのプログラミング言語が存在しています。
例えばもしあなたがゲーム開発をしたいと思っているのであれば、C# や C++ と呼ばれるプログラミング言語を勉強したほうがいいかもしれません。
ですからやりたいことが決まっている方は、そのジャンルに向いた言語で学び始める方がよいでしょう。
ただ多くの方はプログラミングの雰囲気も分からないし、情報量が多い書籍やサイトを見てもやる気をなくしてしまうこともあると思います。
この記事は比較的癖も少なく分かりやすい Python を通してプログラミングはどういった感じなのか、感覚を掴むために読んでいってほしいと考えています。
また各章が問で始まっていますが、最初は解けないと思うのでそのまま読み進めて、後から振り返って再度解いてみてください。
環境構築
基本的には Python をインストールして、プログラミング言語で記載されたファイルを作成して実行が一般的な流れです。
https://www.python.org/downloads/
この記事では緩くプログラミングを始めてもらいたいと考えていますので、以下のいづれかの無料の環境を使用していただければと思います。
全てブラウザから実行できます。
1)Google Colaboratory(Google アカウントがある方)
https://colab.research.google.com/?hl=ja
2)paiza.io (タブで「Python3」を選択してください。)
上記の環境は色々な制限がありますが、本記事ではいづれの環境でも実行可能なプログラミングの文(コード)のみ記載しています。
2章.入力と出力
概要
電卓について考えてみましょう。
数字のキーを叩くことによって、電卓内のデータを記憶する場所に数字が「入力」されます。
そして「入力」した数字が画面に「出力」されます。
さらには「入力」された数字を使って計算をし、その結果を画面に「出力」します。
インターネットバンキングについて考えてみましょう。
「IDやパスワード」をWeb上の画面に「入力」することで、あなたの口座の残高や金銭のやり取りの履歴が画面に「出力」されます。
多くのプログラミングされたものは、基本的には「入力」と「出力」によって形成されています。
入力については外部からの入力をあまり想定していないプログラミングもあるので、ここでは画面に「出力」するためのプログラミングの文(コード)について説明します。
問の答えのコードと説明
print('処理開始')
print('処理終了')
1)Google Colaboratory の例
① 画面の「コード」ボタンを押してください。
➁ 出てきたセルに上記のコードサンプルを入力してください。
※ 半角、全角を意識してください。pとPは別物です
➂ 画面の「右△」ボタンを押してください。(プログラミングの実行になります。)
2)paiza.io の例
① 画面にて「Python3」を選択してください
➁ 上記のコードサンプルを入力してください。
➂ 画面の「実行」ボタンを押してください。
〇 コードの説明
-print('処理開始')
-print('処理終了')
コードを見ると 2 つの点に気が付くと思います。
1)print のカッコ内のデータが出力されている
2)「処理開始」や「処理終了」といった文字列を「'(シングルクォート)」で囲んでいる。
ちなみに「"(ダブルクォート)」で囲っても有効です。
print("Hello World!")
出力:Hello World!
押さえておきたいポイント
〇 画面に出力するときは、print関数と呼ばれるものを使用する。
<関数については第10章で説明します。>
〇 文字列を出力する場合は、その出力したい文字列を「'」や「”」で囲む。囲まないとその文字列を変数だと思ってしまいエラーが発生。
<変数については第4章で説明します。>
また Python は空白や改行にも意味があるので、空白を入れず、print ごとに改行するようにしてください。
3章.データ型
概要
プログラミングで扱うデータにはデータ型というものが存在し、データの扱われ方が決められています。
例えば数のデータであれば、他の数のデータと四則演算(足し算、引き算、かけ算、割り算)することができます。
また「123」を数字ではなく住所(番地)などの文字データとして扱う場合は、数のデータと四則演算することはできません。
問の答えのコードと説明
(問1:①~➂)
print(type(3))
print(type(3.0))
print(type('12'))
出力
<class 'int'>
<class 'float'>
<class 'str'>
〇 コードの説明
-print(type(3))
-print(type(3.0))
type はカッコ内のデータ型を調べることができ、その結果をprint で出力しています。
数のデータ型としては、整数 (負の数も含む) int と小数部をもつ float という型が存在します。
-print(type('12'))
「'」、又は「"」で囲まれたデータは文字列のデータ型 str と認識されます。
そのため 12 を「'」、又は「"」で囲む場合と囲まない場合で以下のようにデータ型が変化します。
・ 囲まない場合(12)、数のデータ型である int
・ 囲む場合('12')、文字列のデータ型である str
(問2:①~➄)
print(2+2)
print((50 - 5*6) / 4)
print(17//3)
print(17%3)
print(5**2)
出力
4
5.0
5
2
25
〇 コードの説明
-print(2+2)
-print((50 - 5*6) / 4)
四則演算はそれぞれ以下の記号で計算できます。
足し算:+
引き算:-
かけ算:*
割り算:/
かけ算と割り算の記号は算数で使用するものとは違います。
また割り算は、データ型が int 同士でも結果は小数部を持った値( float )で出力されます。
単純に整数部のみの商と余りを知りたい場合は、以下の記号を使用します。
-print(17//3)
商の整数部のみ出力:// (割り算の記号を2回入力)
-print(17%3)
割り算をした際の余り:%
この余りについては周期と関連して、プログラミングではよく使用されます。
例えば今日が月曜日でそこから29日経過した場合、何曜日か知りたいとします。
経過日数を 7 で割り、余りが 0 であれば、同じ曜日であり、余りが1であれば元の曜日を1つ進めることになります。
したがって以下の計算を行い、余りを計算して曜日を算出することができます。
29 % 7 = 1
余りが 1 なので「火曜日」となります。
最後に累乗の計算は以下の記号となります。
-print(5**2)
累乗:** (かけ算の記号を2回入力)
(問3:①~➁)
print("Hello "+"World!")
print(3*'Bye')
出力
Hello World!
ByeByeBye
〇 コードの説明
-print("Hello "+"World!")
文字列は基本的には計算できませんが、足し算やかけ算を使用することがきでます。
足し算は文字列と文字列を合わせるのに使えます。
-print(3*'Bye')
かけ算は文字列を繰り返すのに使えます。
ですが、文字のデータ型と数のデータ型で足し算をすることはできません。
以下のようにエラーが出力されます。
print('12'+12)
出力
TypeError: can only concatenate str (not "int") to str
(問4)
print(int('12')+48)
出力
60
〇 コードの説明
-print(int('12')+48)
例えば、Web の画面で何か文字を打ち込んだ時、それが数字を意図したものであっても一旦は文字列として認識されます。
それを数字に変換するという処理が行われるということは、よくあるケースです。
文字列を数のデータ型に変換するには、int または float と入力し、そのあとのカッコ内に変換対象のデータを入力することで変換することができます。
逆に数を文字列のデータ型に変換したい場合は、str と入力し、そのあとのカッコ内に変換対象のデータを入力することで変換することができます。
以下のコードを参照してください。
print('12'+str(48))
出力
1248
押さえておきたいポイント
〇 プログラミングで扱われるデータにはデータ型というものが存在する。
主なデータ型
数:整数(負の整数も含む)int, 小数 float
文字列: str
〇 データ型を調べるにはtype関数を使用する。
数のデータでは四則演算(+,-,*,/)、余りの計算(%)、累乗の計算(**)等ができる。
文字列のデータでは、足し算やかけ算ができる。
〇 データ型の変更は変更したいデータを、変換先のデータ型のカッコ内に入れることで変換することができる。
4章.変数
概要
変数は「データの箱」のようなもので、データを記憶しておくことができます。
この変数を使うメリットは主に以下の2つです。
1)一定期間記憶しているので、必要なときに利用することができる。
例えば温度センサーで温度を取得するとします。
温度を表示するのに使った後に、何らかの計算をしたいとします。
この温度を変数として記憶できない場合は、計算するときに再度温度を取得しなければならず、下手をすると温度が変わっている可能性もあります。
そのため変数に温度のデータを記憶する必要があります。
2)コードの意味が分かりやすく、変更に強くなる
この具体例については「問の答えのコードと説明」をみてください。
問の答えのコードと説明
tax=1.1
print("リンゴの税抜き価格:",100," 税込み価格:",int(100*tax))
print("みかんの税抜き価格:",70," 税込み価格:",int(70*tax))
〇 コードの説明
1)変数の名前の付け方
使用できる文字は以下の3種類です
・アルファベット(小文字推奨だが、大文字も使用できる)
・0~9の数字
・アンダースコア(_)
禁止事項は以下の通りです。
・変数の先頭を数字にしてはいけない。
・予約語と呼ばれる Python にとって意味のあるワードは使用できない
(後に出てくる if や return 等は使用できない。)
この禁止事項に違反するとエラーが発生します。
逆を言うと、禁止事項に反しない限り変数の名前は自由です。
例えば今回の問題では「tax」としましたが、「zei」や「x」等でも構いません。
ただ何を意味しているものか分かりやすい方が、後でコードを見た際に理解しやすくなります。
2)変数の作り方
-tax=1.1
(変数名)=値
これで変数を作ることができます。
「=」は代入の記号で右辺の値が変数 tax に格納されます。
tax=1.1 は tax という変数に 1.1 という float 型のデータが代入されたことを示します。
そのため 100 * tax は、100 * 1.1 と同じ処理になります。
-print("リンゴの税抜き価格:",100," 税込み価格:",int(100*tax))
3)コードの意味が分かりやすいという点について
まず以下の2つのコードを見比べてください。
① 変数を使用する前のコード
print("リンゴの税抜き価格:",100," 税込み価格:",int(100*1.1))
➁変数を使用したコード
tax=1.1
print("リンゴの税抜き価格:",100," 税込み価格:",int(100*tax))
変数を使用する前の方が1行少ないというデメリットがありますが、変数を使用した後の方が税抜き価格と消費税がかかっているということが分かります。
今回のサンプル程度であればそこまで差が無いですが、コードが100行、1000行、10000行となっていくと、この分かりやすさというものは、コードの意味の理解のしやすさ、変更のしやすさに大きな影響を与えます。
そのため数字や文字列はそのまま使用せず、変数に格納されることがほとんどです。
4)変更に強くなるという点について
消費税が10%から7%に変化したとします。
変数を使用するまえのコードであれば、以下の2行を変更する必要があります。
print("リンゴの税抜き価格:",100," 税込み価格:",int(100*1.07))
print("みかんの税抜き価格:",70," 税込み価格:",int(70*1.07))
ところが変数を使用したコードであれば、以下の1行を変更するだけです。
tax=1.07
この 消費税が使用されている行が多ければ多いほど、楽になることが分かると思います。
押さえておきたいポイント
〇 (変数名)=値 で変数を作ることができる。
変数を使うことで、必要なときに格納したデータを利用することができ、かつ変更に強くなる。
5章.分岐処理
概要
プログラミングは以下の3つの基本的な処理からなります。
・順次処理
・分岐処理
・繰り返し(反復)処理
順次処理とは、これまで書いてきたコードのように上から下へ処理を実行していく流れです。
(川が上から下へ流れていくイメージです。)
分岐処理とは、ある「条件」によって処理の内容を変更し実行していく流れです。
(川が分かれて流れていくイメージです。)
繰り返し処理とは、ある「条件」を満たしている間、処理を繰り返し実行していく流れです。
(川が渦を巻いて再度下に流れていくイメージです。)
問の内容を確認すると、「3の倍数」、「5の倍数」、「3と5の倍数」か否かという「条件」によって異なる出力をすることから、分岐処理を行う必要性があることが分かります。
〇 条件の書き方
条件の書き方は左辺と右辺を比較する比較演算子によって記述されます。
記号はプログラミング言語によって異なりますが、比較演算子には以下のようなものがあります。
・左辺と右辺が等しい (==)
・左辺と右辺が異なる (!=)
・左辺が右辺より大きい (>) 右辺が左辺より大きい (<)
・左辺が右辺以上である (>=) 右辺が左辺以上である (<=)
例えば以下のように記述できます。
3==5 (3と5が等しい)
"猫"!="犬"(猫と犬は等しくない)
この「条件」は判断の結果として以下の2つの値を出力します。
・正しい=真=True
・正しくない=偽=False
そのため 「3==5」は False , 「"猫"!="犬"」は True という値を出力します。分岐処理では判断の結果が True だった場合にその処理が実行されるという流れになります。
また条件には「3の倍数であり、かつ 5の倍数である」場合に「真(True)」を出力したい場合や、「猫であるか、または犬である」場合に「真(True)」を出力したい場合等、複数の条件を合わせて判断したいときがあります。
その場合、Pythonでは以下の記号を使用します。
・AかつB (and)
・AまたはB (or)
例えばある変数が 15 の倍数であるか判断する場合は、「3の倍数であり、かつ5の倍数」である必要があります。
「3 の倍数」とは3で割った余りが0になるということです。
そのため「3の倍数であり、かつ5の倍数」ということは以下のような条件となります。
ある変数を 3 で割った余り== 0 and ある変数を 5 で割った余り== 0
問の答えのコードと説明
test=15
if test%3==0 and test%5==0:
print("FizzBuzz")
elif test%3==0:
print("Fizz")
elif test%5==0:
print("Buzz")
else:
print(test)
print('終了')
出力
FizzBuzz
終了
〇 コードの説明
1)分岐処理の書き方
条件によって処理を分けるとき(分岐処理を行うとき)、if 文を使用します。
① if とタイプして半角の空欄を開けて、比較演算子を使用した条件を書きます。
➁ 条件の後に : (セミコロン)をタイプして、改行します。
➂ 半角空白4マス開けて(自動で挿入されている場合もあります)、その条件を満たした場合の処理を書きます。
①~➂まででも成立しますが
・さらに異なる条件がある場合は、改行し、①~➂の手順を if を elif に置き換えて書きます。
・どの条件も満たさなかった場合の処理を追記したい場合は、改行し、
else: と記載し、改行し、処理を追記します。
2)分岐処理の注意点
条件の判断は上から実行され、いづれかの処理が行われたら、もう条件の判断がされないことに注意する必要があります。
〇 コードの流れを追っていきたいと思います。
① test=15
test という変数に 15 が格納される。
➁ if test%3==0 and test%5==0:
if の条件判断が行われる。
「test%3==0 and test%5==0」ということは、「test を 3 で割った余りが 0 であり、かつ test を 5 で割った余りが 0 であるかどうか」という判断をしています。
test は 15 なので条件を満たすことになります。(True)
➂ print("FizzBuzz")
条件を満たしたので、その下の行に書かれた print("FizzBuzz") が実行される。
④ print('終了')
分岐処理のいづれかの処理が実行されたので、if から else までの処理の流れを抜け、最後の print('終了') が実行されます。
〇 test の値を 10 に変えるとどうなるか確認します。
test=10
if test%3==0 and test%5==0:
print("FizzBuzz")
elif test%3==0:
print("Fizz")
elif test%5==0:
print("Buzz")
else:
print(test)
print('終了')
出力
Buzz
終了
① test=10
test という変数に 10 が格納される。
➁ if test%3==0 and test%5==0:
if の条件判断が行われる。
「test%3==0 and test%5==0」ということは、「test を 3 で割った余りが 0 であり、かつ test を 5 で割った余りが 0 であるかどうか」という判断をしています。
test は 10 なので条件を満たしません。(False)
➂ elif test%3==0:
次の elif の条件判断が行われる。
「test%3==0」ということは、「test を 3 で割った余りが 0 であるかどうか」という判断をしています。
test は 10 なので条件を満たしません。(False)
④ elif test%5==0:
その次の elif の条件判断が行われる。
「test%5==0」ということは、「test を 5 で割った余りが 0 であるかどうか」という判断をしています。
test は 10 なので条件を満たします。(True)
➄ print("Buzz")
条件を満たしたので、その下の行に書かれた print("Buzz") が実行される。
⑥ print('終了')
分岐処理のいづれかの処理が実行されたので、if から else までの処理の流れを抜け、最後の print('終了') が実行されます。
〇 test の値を 4 に変えるとどうなるか確認します。
test=4
if test%3==0 and test%5==0:
print("FizzBuzz")
elif test%3==0:
print("Fizz")
elif test%5==0:
print("Buzz")
else:
print(test)
print('終了')
出力
4
終了
① test=4
test という変数に 4 が格納される。
➁ if test%3==0 and test%5==0:
if の条件判断が行われる。
「test%3==0 and test%5==0」ということは、「test を 3 で割った余りが 0 であり、かつ test を 5 で割った余りが 0 であるかどうか」という判断をしています。
test は 4 なので条件を満たしません。(False)
➂ elif test%3==0:
次の elif の条件判断が行われる。
「test%3==0」ということは、「test を 3 で割った余りが 0 であるかどうか」という判断をしています。
test は 4 なので条件を満たしません。(False)
④ elif test%5==0:
その次の elif の条件判断が行われる。
「test%5==0」ということは、「test を 5 で割った余りが 0 であるかどうか」という判断をしています。
test は 4 なので条件を満たしません。(False)
➄ else:
print(test)
どの条件にも該当しないので、else: 以下の行に書かれた print(test) が実行される。
⑥ print('終了')
分岐処理のいづれかの処理が実行されたので、if から else までの処理の流れを抜け、最後の print('終了') が実行される。
〇 それでは最後に条件の順番を変えてみましょう。
test の値を 15 にして確認してみます。出力は FizzBuzz を想定していましたが上手くいきません。
test=15
if test%3==0:
print("Fizz")
elif test%5==0:
print("Buzz")
elif test%3==0 and test%5==0:
print("FizzBuzz")
else:
print(test)
print('終了')
出力
Fizz
終了
-if test%3==0:
FizzBuzz と出力したくても、一番最初の if の条件である「test を 3 で割った余りが 0 であるかどうか」の判断で条件を満たしてしまいます。(True)
その結果、Fizz が出力され、if から else までの処理の流れを抜けてしまいます。
そのため条件を書く際には、該当するものが少ないものから順に書くようにしましょう。
押さえておきたいポイント
〇 比較演算子を使用して条件が書ける。
〇 if-elif-else と条件を利用して分岐処理が書ける。
また記載する条件は該当するものが少ないものから順に書く。
6章.繰り返し処理
概要
繰り返し処理とは、ある条件を満たしている間、処理を繰り返し実行していく流れです。
データを複数持つデータについて。全てを取り出し終えるまで繰り返すということを条件とした繰り返し処理もあります。
またある条件を常に満たすようにして、ずっと繰り返す「無限ループ」というものも存在します。
初心者の方が意図せず書いてしまうこともありますが、意図して「無限ループ」させているものも多く存在します。
問の答えのコードと説明
(問1)
num=2
while num<=10:
print(num)
num=num+2
出力
2
4
6
8
10
〇 コードの説明
・ while を使用した繰り返し処理の書き方
① while とタイプして半角の空欄を開けて、比較演算子を使用した条件を書きます。
➁ 条件の後に : (セミコロン)をタイプして、改行します。
➂ 半角空白4マス開けて(自動で挿入されている場合もあります)、その条件を満たした場合の処理を書きます。
while の行に記載された num <=10 (num の値が 10 以下かどうか) の判断がされ条件を満たしている(True)間は、while から半角空白4マス下がった行のコードが実行されることになります。
半角空白4マス下がった行の固まりを一つのブロックとして理解すると見通しがよくなります。
コードの流れは以下の通りです。
① num=2
変数 num に 2 が格納される。
➁ while num<=10:
print(num)
while の条件式「num <=10」が判断され、条件を満たすので print(num) が実行されます。(True)
➂ num=num+2
num=num+2 が実行されます。右辺の num には 2 が入っているので左辺の num には 4 が格納されます。
④ num に 4 が格納された状態で ➁、➂が繰り返されます。
num=4 -> num<=10 (True) -> print(4) -> num=4+2
-> num=6 -> num<=10(True) -> print(6) -> num=6+2
-> num=8 -> num<=10(True) -> print(8) -> num=8+2
-> num=10 -> num<=10(True) -> print(10) -> num=10+2
-> num=12 -> num<=10(False)
➄ num に 12 が格納されたとき、while の条件式「num <=10」が判断され条件を満たさなくなるので while のブロックを抜けます。(False)
仮に ➂ の処理が無かった場合、num はいつまでも 2 であるため条件を満たし続けます。
これを無限ループと呼びます。
(問2)
for num in range(1,11,2):
print(num)
出力
1
3
5
7
9
〇 コードの説明
・ for を使用した繰り返し処理の書き方
① for とタイプして半角の空欄を開けて、取り出された値が格納される変数を記載します。(今回は num と記載しています。)
➁ in と記載して、データを複数持つデータを記載し、 : (セミコロン)をタイプして、改行します。
➂ 半角空白4マス開けて(自動で挿入されている場合もあります)、その後の処理を書きます。
while と異なり for は 、データを複数持つデータの全てを取り出し終えるまで繰り返すということを条件とした繰り返し処理が行われます。
range(1,11) は、1 から 10 の数が格納されます。
11 は含まれないことに注意してください。
-range(1,11,2)
さらに range(1,11,2) と記載すると三番目の値が増加する数を決めることができ、 2 という値づつ増えることになるので、1 から 10 の数について、2 づつ増加した数が格納されることになります。
[1,3,5,7,9]
-for num in range(1,11,2):
in でその要素がひとつづ取り出され num に格納されます。
- print(num)
その後は print(num) が実行され、データの全てを取り出し終えるまで繰り返し、ブロックを抜けます。
押さえたいおきたいポイント
〇 ある条件がみたされるまで繰り返す場合、whileを使用する。
〇 複数のデータを取り出す処理の場合、forを使用する。
7章.リスト
概要
数や文字列のデータ型についてはすでに紹介しましたが、複数の数や文字列のデータが集まって一つのデータとして扱うデータ型も存在します。
いくつか存在しますが、代表的なリスト型についてここでは説明します。
このリスト型の大事な点は、複数のデータが格納されていることと格納されているデータに順番があることです。
例えば文章は文字列のリスト型として扱われることが良くあります。
「吾輩は猫である。名前はまだない。」
この文章を「。」で区切ると、2 つの文字列のデータとみることができます。
- 1 番目の文字列データ「吾輩は猫である。」
- 2 番目の文字列データ「名前はまだない。」
また毎月の温度データを数のリスト型として扱うケースもありえるでしょう。
問の答えのコードと説明
(問1)
odd_numbers=[1,3,5,7]
odd_numbers.append(9)
print(odd_numbers[1])
出力
3
〇 コードの説明
リスト型のデータは、カッコ[] の中にデータを入れ、カンマでそれぞれのデータを区切ることにより作成できます。
-odd_numbers=[1,3,5,7]
odd_numbers=[1,3,5,7] は4つの数のデータがはいったリストを変数 odd_numbers に格納したことを意味します。
リストは変数に格納して取り扱うことがほとんどです。
-odd_numbers.append(9)
一度作成したリストに更にデータを加えたいときは、リストを格納した変数にドット(.)を書き、append(データ) とすることでデータを追加することができます。
-print(odd_numbers[1])
リスト型のデータの何番目かの値を出力したいと考えたときは、
変数[出力したい番号] とすること値を出力することができます。
但し、リストの最初は、0番目から始まります。
そのため奇数リストの 2 番目の値を出力したいときは
odd_numbers[1] とする必要があります。
(問2)
signals=['青色','青色','黄色','赤色','青色']
for signal in signals:
print(signal)
出力
青色
青色
黄色
赤色
青色
〇 コードの説明
-signals=['青色','青色','黄色','赤色','青色']
-for signal in signals:
- print(signal)
リストに入ったデータを全て取り出す場合は、for を使った繰り返し処理が使用されます。
for を使った繰り返し処理で使用した range() をリストを格納した変数に置き換えて書けば、リスト内のデータを全て取り出すことができます。
(問3)
numbers=[1,2,3,4]
print("処理開始")
for num in numbers:
if num % 2 ==0:
print("偶数:",num)
else:
print("奇数:",num)
print("処理終了")
出力
処理開始
奇数: 1
偶数: 2
奇数: 3
偶数: 4
処理終了
〇 コードの説明
for で取り出した変数を分岐処理することは、プログラミングでしばしば登場するパターンとなります。
その場合、どこまでが for の範囲でどこから if の範囲か分かりづらくなると思いますが、Python では半角空白で先頭の文字を揃える必要があるので、そこを目安とします。
空白なしが先頭となっているのは以下の 太字の4 行です。
これが処理の大枠になります。
-numbers=[1,2,3,4] #①変数 numbers にリストを格納
-print("処理開始") #➁処理開始と出力
-for num in numbers: #➂リストを取り出した処理
- if num % 2 ==0:
- print("偶数:",num)
- else:
- print("奇数:",num)
-print("処理終了") #④処理終了と出力
そして ➂ の処理についてもう少し詳細に確認します。
半角空白 4 マスが先頭となっている処理は以下の太字 2 行で、分岐処理の判断が行われていることが分かります。
つまり numbers から取り出されたデータ num が 2 で割った余りが 0 か判断されます。
-numbers=[1,2,3,4]
-print("処理開始")
-for num in numbers:
- if num % 2 ==0:
- print("偶数:",num)
- else:
- print("奇数:",num)
-print("処理終了")
半角空白 8 マスが先頭となっている処理は以下の太字 2 行で、分岐条件に従ってそれぞれが実行されることが分かります。
-numbers=[1,2,3,4]
-print("処理開始")
-for num in numbers:
- if num % 2 ==0:
- print("偶数:",num)
- else:
- print("奇数:",num)
-print("処理終了")
コードを読むときも、作成するときも大枠を捉え、その後それぞれについて詳細を読む、または作成することを意識することをお勧めします。
押さえておきたいポイント
〇 複数の数や文字列のデータが集まって一つのデータとして扱うデータ型にリストがある。
〇 リストデータの作成、データの追加、及び何番目かを指定しデータが出力できる。
〇 リストデータは for によって取り出すことができる。
8章.break 文
概要
繰り返し処理の中で、ある条件を満たしたら、繰り返し処理を抜けたいという処理が存在します。
例えば何らかのアプリケーションを開いた場合、開いている間はずっと何らかのプログラムが稼働していますが、「閉じる」ボタンがおされたことを検知したら閉じる必要があります。
そういったときに使用されるのが、多くのプログラミング言語において「break」というキーワードになります。
問の答えのコードと説明
signals=['青色','青色','黄色','赤色','青色']
for sig in signals:
if sig == '赤色':
break
else:
print(sig)
出力
青色
青色
黄色
〇 コードの説明
-signals=['青色','青色','黄色','赤色','青色']
-for sig in signals:
7章の(問2)では全てそのまま出力していました。
今回は変数 sig の値によって分岐処理がされます。
- if sig == '赤色':
- break
- else:
- print(sig)
赤色が変数 sig に格納されたら終了することにするため、sig == '赤色' という判断がされ、その条件を満たした場合、break が実行されます。
この break が実行されると、signals の「赤色」の後に格納されている「青色」が取り出されるまえに、for による処理を抜けることになります。
while でも同様に条件を満たしたら、break するようにコードを書くと、
break が実行された際に while による処理を抜けることになります。
押さえておきたいポイント
〇 繰り返し処理は、break というキーワードを使用することで、ある条件を満たし時に抜けることができる。
9章.エラーと例外処理
概要
プログラミングには予期せぬエラーがしばしば発生します。
例えばファイルを読み込み、処理するプログラムを作成した場合、そのファイルが存在しなければエラーが発生します。
またネットワークを通じてデータベースにアクセスしようとした際に、ネットワークの状態が悪く上手くアクセスできない場合もあり得ます。
その場合もエラーが発生することになります。
エラーが想定される処理を囲って、エラーが発生した場合には、エラーが発生したことをどこかに記録するなどの処理を実行することができる try 文について説明します。
問の答えのコードと説明
x='数字'
try:
num=int(x)
print(num)
except:
print('数字に変えることはできません')
出力
数字に変えることはできません
〇 コードの説明
int(x) という処理は、x を整数に変更しようとする処理です。
ここでは x には「数字」という文字データが入っています。
そのため変換すると整数に変更できずエラーが発生します。
そこでエラーが発生する可能性がある処理と、その処理が行われたのちに実行されるコードを一塊として try 以降に記載します。
・ try 部分の記載方法
① try とタイプして : (セミコロン)をタイプして、改行します。
➁ 半角空白4マス開けて(自動で挿入されている場合もあります)、エラーが発生する可能性がある処理と、その処理が行われたのちに実行されるコードを一塊として記載します。
-x='数字'
-try:
- num=int(x)
- print(num)
エラーが発生した場合の処理については except 以降に記載します。
・ except 部分の記載
① except とタイプして : (セミコロン)をタイプして、改行します。
➁ 半角空白4マス開けて(自動で挿入されている場合もあります)、エラーが発生した場合の処理を記載します。
-except:
- print('数字に変えることはできません')
try 以降の半角空白4マス開けて記載された処理でエラーが発生しなかった場合は、except 以降の半角空白4マス開けて記載された処理は実行されません。
押さえておきたいポイント
〇 予期せぬエラーが発生した時に、try-catchによってエラー内容を把握したり、エラー発生後の処理を設定することができる。
10章.関数
概要
プログラムにおける関数とは、与えられた値をもとに、定められた独自の処理を実行し、その結果を返す処理の固まりのことです。
(この与えられた値は省略することも可能です。)
利用されるケースとしては、良く繰り返し使用される処理を関数としてまとめるといったことで使われます。
また別のファイルに書くことができ、それを読み込むといったこともできるため、一つのファイルに多くのコードが書かれるといったことを回避することもできます。
問の答えのコードと説明
(問1)
def calc_price(calc_price,calc_tax):
price_include_tax=calc_price*calc_tax
return int(price_include_tax)
answer_price=calc_price(100,1.1)
print(answer_price)
出力
110
〇 コードの説明
1)関数の定義
① def とタイプして半角の空欄を開けて、関数名とカッコを書きます。
関数に何らかの値を入れ、それを使用する場合は、カッコの中に変数を書きます。
このカッコ内に記載された変数を引数といいます。
➁ カッコの後に : (セミコロン)をタイプして、改行します。
➂ 半角空白4マス開けて(自動で挿入されている場合もあります)、処理を書きます。
④ 最後に何らかの値を返すときは、return とタイプして返す値を書きます。
この返す値を返り値といいます。
2)関数の使用
関数名とカッコの中に値を入れて使用します。
3)関数の定義と使用
-def calc_price(calc_price,calc_tax):
calc_price という関数名を定義し、引数として 2 つの変数 calc_price,calc_tax
を定義しています。
- price_include_tax=calc_price*calc_tax
price_include_tax に calc_price*calc_tax を格納します。
- return int(price_include_tax)
そして float 型の price_include_tax を int 型に変更してreturn によって返しています。
-answer_price=calc_price(100,1.1)
calc_price(100,1.1) として関数を使用すると、calc_price に 100、
calc_tax に 1.1 のデータが入るため、
price_include_tax = 100*1.1
が計算され、int 型になった 110 が返却されることになります。
そのため answer_price = 110 となります。
(問2)
def calc_price(calc_price,calc_tax):
price_include_tax=calc_price*calc_tax
return int(price_include_tax)
def display_price(display_price,display_tax):
price=calc_price(display_price,display_tax)
print("税抜き価格:",display_price,"消費税:",display_tax,"税込み価格",price)
display_price(100,1.1)
出力
税抜き価格: 100 消費税: 1.1 税込み価格 110
〇 コードの説明
返り値がない関数を定義することもできます。
その場合は、return を使用しません。
また関数のなかで関数を使用すること可能です。
-def display_price(display_price,display_tax):
関数名は display_price、引数は display_price, display_tax となります。
- price=calc_price(display_price,display_tax)
calc_price は、display_price と display_tax を掛け算して、int 型に変換した値を返しますので、price にその値が格納されます。
- print("税抜き価格:",display_price,"消費税:",display_tax,"税込み価格",price)
print で引数や price の値を出力しています。
-display_price(100,1.1)
そして関数 display_price に値 100、1.1 を入れて使用します。
関数が使用されたときの処理の流れは以下のようになります。
① display_price(display_price,display_tax) について
display_price=100, display_tax=1.1 が代入されます。
➁ display_price 内の calc_price(display_price,display_tax) について
display_price=100, display_tax=1.1 が代入されます。
➂ calc_price(calc_price,calc_tax) について
calc_price=100, calc_tax=1.1 が代入され、110 が返却されます。
また以下のように引数なしの関数も定義し、使用できます。
def hello_world():
print("Hello World")
hello_world()
出力
Hello World
押さえておきたいポイント
〇 よく使う処理の固まりを def というキーワードを使用して関数として定義し、繰り返して書かずに利用することができる。
11章.クラス
概要
プログラミング言語の中で一つのジャンルとして、オブジェクト指向プログラミングというものがあります。
このジャンルについて現時点では深入りしないほうが良いと思います。
そこで簡単なイメージとどのように書くかという点を知っていただければと思います。
そのため継承や多態性といった概念には触れません。
クラスというものは色々な説明方法があるのですが、関数を処理の固まりと捉えると、値と関数を一つにした設計図のようなものと捉えるのが良いと思います。
例えば今回の問題では Character をクラスにしています。
hp や mp は、RPG ゲームで使用される体力値や魔力値のことです。
これらはキャラクターごとに持っているほうが分かりやすくなります。
キャラクターごとに hp や mp の変数を作成した場合、変数が多くなりかつ意味の理解も難しくなります。
またこの Character クラスにメソッドという、クラスの持つ関数を設定します。
このメソッドは、そのキャラクターの持つ hp や mp を使った処理ができます。
では具体例を使用してもう少し詳細に説明したいと思います。
問の答えのコードと説明
(問1)
class Character:
def __init__(self,name,hp,mp):
self.name=name
self.hp=hp
self.mp=mp
def show_status(self):
print("name:",self.name,"HP:",self.hp,"MP:",self.mp)
def attack(self):
print(self.name,"は敵に攻撃")
def damage(self,damage_value):
print(self.name,"はダメージを受けた")
self.hp=self.hp-damage_value
〇 コードの説明
1)クラスの書き方
① class (クラス名): でクラスを定義します。
-class Character:
➁ 半角空白4マス開けて(自動で挿入されている場合もあります)、関数と同様な方法でメソッドを記載します。
- def show_status(self):
- print("name:",self.name,"HP:",self.hp,"MP:",self.mp)
2)オブジェクトについて
クラスというものはあくまで設計図なので、設計図を使ってキャラクターを生成する必要があります。
このクラスから生成したものをオブジェクトといいます。
オブジェクト各々がそれぞれ持つ値をメンバー変数と呼びます。
呼び出す際は、.(ドット)を使用します。
(オブジェクト).(メンバー変数)
またメソッドを呼び出す際も.(ドット)を使用します。
(オブジェクト).(メソッド)
実際の使用については(問2)を確認してください。
3)self について
メソッドの引数で記載される self というものは決まった言葉です。
意味としてはクラスから生成されたオブジェクト、つまり自分自身が入るようなイメージを持ってもらえればと思います。
メソッドにはとりあえず self を書くくらいの認識で今はいいと思います。
4)コンストラクタについて
- def __init__(self,name,hp,mp):
- self.name=name
- self.hp=hp
- self.mp=mp
コンストラクタはクラスを生成するときに使用されるもので、初期値を設定するのに使われます。
コンストラクタは関数名のように自由に名前を設定できず、 def の後に_(アンダースコア)を 2 つ重ねて、init とタイプし、その後さらに_(アンダースコア)を 2 つ重ねる必要があります。
このコンストラクタを使用するときは、Character("村人",30,5) のように使用します。
コンストラクタの引数である self には何も入れないので、
name="村人", hp=30, mp=5 という値が入ります。
self はそのオブジェクト自体を示し、 self.name, self.hp, self.mp
はオブジェクトがそれぞれ持つ値であるメンバー変数を意味しており、
それぞれ "村人", 30, 5 という値が格納されます。
5)使用されるときに引数を使用しないメソッド
- def show_status(self):
- print("name:",self.name,"HP:",self.hp,"MP:",self.mp)
- def attack(self):
- print(self.name,"は敵に攻撃")
メソッド show_status や attack はオブジェクト自身の値を使用しているので、定義するときは引数 self を使用して、呼び出すときは引数なしで使用します。
6)使用されるときに引数を使用するメソッド
- def damage(self,damage_value):
- print(self.name,"はダメージを受けた")
- self.hp=self.hp-damage_value
メソッド damage は、オブジェクト自身の値(self)と引数(damage_value)を使用するので、引数にはこの2つの変数が記載されます。
(問2)
warrior=Character("戦士",40,10)
warrior.show_status()
warrior.attack()
warrior.damage(10)
print(warrior.hp)
出力
name: 戦士 HP: 40 MP: 10
戦士 は敵に攻撃
戦士 はダメージを受けた
30
〇 コードの説明
設計図であるクラスを使用して、オブジェクトを生成し、それを変数に格納しています。
-warrior=Character("戦士",40,10)
オブジェクトの生成にはクラス名(引数)を使用します。
そうするとコンストラクタが使用され、キャラクタの設計図から戦士というオブジェクトが生成することになります。
-warrior.show_status()
-warrior.attack()
次に引数なしのメソッドを使用しています。
-warrior.damage(10)
引数ありのメソッドを使用しています。
このメソッドはオブジェクト自体の hp から引数の値を引く処理です。
そのため warrior の hp は初期の 40 から 30 に変化します。
-print(warrior.hp)
以下はそのメンバー変数である hp を出力しています。
〇 クラスの便利な点について
例えば次に魔法使いのオブジェクトを作成するとします。
magician=Character("魔法使い",20,50)
damage メソッドを呼びだしたとしても、魔法使いがダメージを受けたことは理解しやすいと思います。
magician.damage(15)
クラスを使用しないで、変数や関数でコードを書くと以下のように、非常に分かりづらくなっていき、コードを書くときに非常に注意が必要になることが確認できると思います。
<変数イメージ>
warrior_name
warrior_hp
warrior_mp
magician_name
magician_hp
magician_mp
<関数イメージ>
damage(warrior_hp,10)
押さえておきたいポイント
〇 値や処理をひとつのまとまりとした、クラスというものが定義できる。
12章.Next
参考
ここまで大体のプログラミング言語で共通する考え方を紹介してきました。
このあとより実践的なアプリケーションを作成する場合には、 Python についてはもう少し詳しい文法の内容を知り、ライブラリーやフレームワークと言われる作りたいものに対して役に立つものを知っていく必要があります。
ただ1章でも書きましたが、プログラミング言語には適材適所というものがあります。
もしあなたが作りたいものが他の言語を使用したほうが作りやすい場合、これより詳細な内容の紹介は不要になるでしょう。
ですから次に何を作りたいか考えてみてください。
以下にどういった分類があるかということと、向いている代表的なプログラミング言語について紹介します。
本腰入れて何を学ぶか決める際の目安にしてもらえればと思います。
(ここに記載されている言語以外でも開発されることはありますので、あくまで代表的な例です。)
-Web サイト(画面側):JavaScript/TypeScritp
-Web サイト(裏側のシステム):Java、C#、Ruby、JavaScript/TypeScritp、 PHP、 Python、Go、Rust 等多くの言語が使用される
-iOSアプリ:Swift
-Androidアプリ:Java,Kotolin
-ゲーム制作:Unreal Engine というゲームエンジンで使用されているC++
Unity というゲームエンジンで使用されているC#
-システム開発:銀行などのシステムは Java も多いです。
-組み込みシステム(電子機器の制御等):C , C++
-AI に使用される機械学習や科学分野におけるデータ分析:Python
-個人的に使いたいツール等:Python, Go
作りたいものと使用する言語が決まれば、試しにその言語でこれまで紹介した考え方を検索してみてください。
その言語による書き方も出てくると思います。
以下の例を見てもらえると他の言語でも同様、又は類似の考え方があることが分かると思います。
(言語の例は、Stack Overflow 2023 の上位からマークアップ言語等を除いて記載しています。)
(例)「JavaScript 出力 書き方」
-console.log(10);
(例)「TypeScript データ型」
-Number(数値型)、String(文字列)
(例)「Java 変数 書き方」
-int sum=58
(例)「C# 分岐処理 書き方」
-if (age <= 20) { ans= "20歳以下です。"; }
(例)「C++ 繰り返し処理 書き方」
-for (int i = 0; i < 3; i++)
{ cout << i << "\n"; }
(例)「C リスト 書き方」
※C言語の場合、元から確保した要素数で使用する配列が近い概念です。
- int int_arr[5] = {0, 1, 2, 3, 4};
printf("%d,", int_arr[1]);
(例)「PHP break文 書き方」
-foreach ($bs as $a)
{ $total += $a;
if ($total > 500) { break; } }
(例)「PowerShell エラーと例外処理 書き方」
-try { #処理内容 }
catch { #例外エラー発生時の処理内容 }
finally { #例外の有無に関わらず実行する内容 }
(例)「Go 関数 書き方」
-func add(x int, y int) int { return x + y }
(例)「Rust クラス 書き方」
※クラスそのものはなく、同様のことをするには構造体とメソッドを使います。
-struct Rectangle { width: u32, height: u32, }
impl Rectangle {
fn area(&self) -> u32 { self.width * self.height } }
let rect1 = Rectangle { width: 30, height: 50 };
println!( rect1.area() );
詳細は分からないと思いますが何となく雰囲気はつかめると思います。
何となく雰囲気を掴んでいると、他の言語の入門書や参考情報で学ぶハードルが下がります。
今回作成した記事が読んでくれた方にとって、何かプラスになればよいなと思います。
この記事が気に入ったらサポートをしてみませんか?