この章では関数で星座の判定を作成します。 この例は星座の判定をjudge関数に任せています。
このように判定の部分を関数で作成することでコンパクトになり、プログラムがすっきりします。
では説明を始めます。
ここでユーザーにデータを入力させます。
ユーザーに入力をさせる関数はraw_input関数です。
「文字列」には画面に表示させたい文字列を入力します。
ここでユーザーが入力をするとその結果は文字列として変数に入ります。
の中のbirthmonthのデータがjudgeメソッドの仮引数monthに入り、birthdayのデータがdayに入ります。
ここでmonthとdayを整数値に変換するためにint関数でキャストしています。
つまり、raw_input関数は文字列を返すので、ここでint関数で整数に変換します。
namesでは星座名をリストで作成しています。
この配列内は山羊座から順番通りに並んでいます。
決して、ランダムに並んでいるわけではありません。
day1には各星座の月の末日をリストに入れています。
day2には1月から12月までの末日をリストに入れています。
例えば仮引数のmonthに1が入り、dayに19が入っているとします。
の部分ではcountが0の時にifの条件式trueになりますので、入れ子のif文の条件式の判定に入ります。
if文はこのように入れ子にすることができます。
つまり、初めのif文がtrueであればさらに入れ子のif文の条件判定に入ります。 の中のdayには19が入り、1周目のにはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnamesの0番目の要素である「やぎ座」が入ります。
例えばdayに19ではなく23が入っていると仮定するとはfalseになるので、の条件式の判定に入ります。
ここでday2[count]にはday2の0番目の要素である31が入っていますので trueになり、name にはに該当する星座が入ります。
のcountには1周目では0が入っていますのでで余りを求めると1になりますのでになり、「みずがめ座」が入ることになります。
ではの詳しい説明をします。
「count + 1」をする理由は例えばmonthが1で、day が23の場合にはがになりfalseになるので、elifのブロックに入りますが、1月は やぎ座と水瓶座しかなく、やぎ座ではないのならば水瓶座しかないのでnamesを1つ進めるためにで1を足しています。
len(names) を記述している理由は例えばの中のcountに11が入るとの箇所が12になりますが、の箇所が無いと仮定するととなってしまいますが、実際にという要素はありません。
ですので、の箇所で余りを0(12割る12で余り0)にして山羊座が出るようにしています。
つまり、該当する以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。 結果は以下の通りです。
タグ: 関数
関数について知ろう2
この章では関数について説明します。
関数とは引数と言うデータを受け取って、ある一定の処理を行い、戻り値を呼び出し元に返す命令のことを言います。
引数とは関数を実行するときに関数で使われるバラメータ(データ)のことを言います。
戻り値とは、関数を実行した結果、返される値です。
この章以前のint関数のような関数は組み込み関数と言いまして、Pythonによって初めから用意されている関数です。
例えばint関数は文字列を数値に変換する関数ですが、Pythonの内部機構でそのような働きを作ってくれています。
その他に自分で好き勝手に「ある働きを持った関数」を作ることができます。
これをユーザー定義関数と言います。
例えば消費税を自動で計算する関数を自分で作りたいとします。
その場合、商品の代金を関数に渡すと商品金額に消費税率を掛けた処理をして、その結果を返すという機能を持った関数を作ります。
関数の基本構文は以下の通りですが、このように関数の中に実行内容を書いていくことを「関数の定義」と言います。 〇引数が無い関数もありますが、引数が複数ある場合はカンマで区切ります。 〇引数が複数ある場合はカンマで区切ります。
〇関数は関数の定義を書いただけでは実行しません。
そこで関数を実行するためには関数を呼び出さなくてはいけません。
関数の呼び出しはという構文で書きますが、引数が複数ある場合はカンマで区切ります。
引数が必要無い関数であるならば引数は省略出来ます。
引数を省略する場合もカッコを付けてと記述します。
では実際に関数の例を見てみましょう。 この関数は三教科の平均を求める関数です。
関数を呼び出すには関数名と同じ名前を付けて呼び出します。
上の例で言えばの箇所です。
呼び出すことによって関数の中身が実行されます。
では順を追って詳しく説明します。 引数である変数にはそれぞれ56、45、99が代入されています。
この呼び出し側の引数は実引数と呼ばれています。 この関数側の引数を仮引数と言います。 また、実引数と仮引数の変数名が同じでなくても問題ありません。
つまりnum1とe, num2とf, num3とgが 同じ変数名である必要はありません。
また、この関数内部の変数e,f,g,h,iのことをローカル変数と言いますが、このローカル変数は関数内部でしか使用することはできません。
ローカル変数を関数の外で使用するとエラーになります。 結果は以下の通りです。 実行すると次のようなエラーが表示されます。
次の例をみてみましょう。 関数にはのように引数に初期値(デフォルト値)を設定することができます。
しかし、初期値は初期値を持たない引数よりも前で
設定してはいけません。
つまり、のように初期値のある引数を初期値のない引数より前に記述してはいけません。
また、初期値にg=46が設定してあるために、以下のように第三引数を省略して呼び出すことが出来ます。 結果は次の通りです。
次の例をみてみましょう。 例え関数で初期値を設定していても、呼び出し側で引数(実引数)を 設定していればこちらが優先されます。
この例ではの箇所で初期値を設定していますが、では実引数で3つとも引数を設定しているので、こちらの引数が優先されます。
結果は以下の通りです。
次は戻り値のある関数についての説明をします。
戻り値についてはこの章の冒頭で説明しましたが、関数を実行した結果、返される値のことです。
戻り値を返すためには関数の定義の中にという形式で記述します。
では例をみてみましょう。 関数内で処理をした結果(戻り値)を呼び出した側に返すにはreturnを使います。returnの後に何かしらの処理があってもその処理は実行されないで、呼び出し元に返りますので注意してください。
つまりは実行されません。
この戻り値を利用するには例のように変数(この例ではnum4)に戻り値を代入して使用するか、もしくはのように変数に入れないで、直接出力することもできます。この例では3つの平均点であるiをreturnで呼び出し元に戻してnum4に代入しています。
次は引数の無い関数について説明します。 この関数は仮引数も実引数もありません。
ただ関数の中で処理されて、呼び出し元に値を返しているだけです。
このような関数も作成できることを覚えておいてください。 結果は次の通りです。
次は関数の引数にはリストも指定することができますので、次の例で説明します。 リストを関数側に渡すにはのように実引数にリストを指定します。
以下のように書いても同じ意味になります。 その後、関数側でも仮引数を設定します。
この例の場合はkです。
そのkの要素をfor文で一つ一つ取り出して計算しています。
結果は次の通りです。
次の例もリストの要素を関数に渡すのですが、前の例はリストそのものを渡していましたが、今回はリストを分解してから関数側に要素を渡しています。 呼び出し側の実引数であるリストに「*」を付けると、仮引数にはリストの要素が分解した状態で渡るので、仮引数はのように4つ設定します。
結果は次の通りです。
次は実引数が複数ある場合、仮引数もその数だけ書くのは大変ですが、この例で便利な方法を紹介します。 では説明を始めます。
のように引数が多数ある場合、関数側にもと、書かなくてはいけないのは面倒です。
そこで、この仮引数をと、書き替えることで複数の実引数をすべて引き受けることが出来ます。 はタプルとして、のように受け取るので、for文で分解することが出来ます。
結果は108です。
次は関数の引数にはディクショナリも指定することができますので、次の例で説明します。 ディクショナリを関数側に渡すにはのように引数にディクショナリを指定します。
その後、関数側でも引数を設定します。この例の場合はaです。
そのaの要素をfor文で一つ一つ取り出して計算します。
for文ではディクショナリの値だけを使いたいので、keysメソッドでキーを取得して、その後にという構文で値を得ます。
結果は33です。
関数について知ろう1
前の章でややなどについて説明しましたが、これらは関数と呼ばれています。
関数とは入力したデータ(引数)に基づいて 決められた処理を行い、戻り値という結果を返す機能を持っています。
エクセルをご存知の方はわかると思いますが、エクセル関数にSUMと言う関数が有ります。
この関数は指定した範囲のデータに基づいて足し算を行う関数です。
例えば指定した範囲のデータが3,5,7(引数)であるならば結果は15です。
つまり、エクセルの内部機構でSUMの機能は指定した範囲の足し算を行うと言うプログラムがされていると言うことです。
これが関数の意味です。
Pythonには初めからこのように機能が定義されている関数が多数あります。
では次の例で関数について説明します。 lenのカッコの中にあるデータを引数と言います。
この例のlen関数は引数の長さを取得するという決められた処理を行い、戻り値として6を返します。
もう一度関数の意味を書きますが、len関数の説明と較べてみてください。 上の2つのprint文は同じ結果を返しますが、以下の図のように戻り値を変数name3に入れてから、出力させてもいいですし、戻り値を変数で受け取らないで、直接と出力してもいいです。
関数で星座判定を作ってみよう
「if文で星座の判定をしよう」の章ではif文で星座判定のプログラムを作成しましたが、これを関数を使って書き換えてみましょう。
この例にはポインタ、2次元配列、関数、グローバル変数が含まれていますので、理解を深めてください。
では例をみてみましょう。 例えばmonthに1が入り、dayに19が入っているとします。
そうするとの箇所はiが0の時にifの条件式がtrueになりますので、以下の入れ子のif文の条件式の判定に入ります。 「day <= day1[i]」の中のdayには19が入り、1周目のにはday1の0番目の要素である19が入っていますので、条件式はtrueになり、nameにはnames配列の0番目の要素である「やぎ座」が入ります。
例えばdayに19ではなく23が入っていると仮定するとはFALSEになるので、の条件式の判定に入ります。
ここでday2[i]にはday2の0番目の要素である31が入っていますのでTRUEになり、name にはに該当する星座が入ります。
1周目ではのiには0が入っていますのでで余りを求めると1になります。
結果、となり「みずがめ座」が入ることになります。
ではをさらに詳しく説明します。
「i + 1」の箇所の説明をしますと例えばmonthが1で、day が23の場合にはがになりFALSEになるので、else ifのブロックに入ります。
そして1月は やぎ座と水瓶座しかなく、やぎ座ではないのならば水瓶座しかないのでnames配列を1つ進めるためにで1を足しています。
「%12」を記述している理由は例えばの中のiに11が入るとの箇所が12になりますが、「%12」の箇所が無いと仮定するととなってしまいます。
しかし、実際にという要素はありません。
そこで「%12」で余りを0(12割る12で余り0)にして「やぎ座」が出るようにしています。
つまり、以下の余りの数字がnames配列の添え字になり、その該当するデータがnameに入ります。 グローバル変数ですので、プログラムの中のどこからでも使用することが出来ます。そして、最後にmain関数の中でnameに入っている星座を出力しています。
結果は以下の通りです。
関数に関してのC言語との違い
「関数について知ろう」の章では関数について説明しましたが、この章ではC言語にはない関数の使い方について説明します。
C++では関数プロトタイプ宣言で、デフォルト引数(あらかじめ決められている値)を設定することが出来ます。
つまり、関数プロトタイプ宣言で、デフォルト引数を設定すると、関数を呼び出すときの実引数を省略できます。
では例をみてみましょう。 次はデフォルト引数を複数設定した時の例を見てみましょう。
すべてに共通することは直接実引数を指定した場合はデフォルト引数よりも優先されます。 では次の例をみてみましょう。 デフォルト引数の設定の方法は関数プロトタイプ宣言に書く以外に関数の定義に直接書く方法もあります。
この例ではdisplay関数にデフォルト引数を設定しています。
また以下のように真ん中だけを設定することもできません。
関数のプロトタイプ宣言を知ろう
この章では関数のプロトタイプ宣言について説明します。 と書きましたが、関数のプロトタイプ宣言をすることで、このような制約は無くなります。
つまり関数の定義(以下の例ではhello関数)は関数の呼び出しよりも後に定義することが出来るということです。
では例をみてみましょう。 関数のプロトタイプ宣言は関数よりも前に宣言します。
引数がない場合、引数はvoidを入力します。
さらに戻り値も無いならば、戻り値の型の箇所にもvoidを入力します。 次の例は引数がdouble型の関数のプロトタイプ宣言を行っています。 引数のあるプロトタイプ宣言の場合には以下のように関数の引数を入力して宣言を行います。 しかし、以下のように引数の箇所はデータ型のみでも問題ありません。
関数の仕組みはエクセルの関数の仕組みと意味は同じです。
エクセルをご存知の方はわかると思いますが、エクセル関数にSUMと言う関数が有りますが、この関数は指定した範囲のデータに基づいて足し算を行う関数です。
例えば指定した範囲のデータが「3,5,7」(引数)であるならば結果は「15」です。
SUMには初めから指定した範囲の足し算を行うと言う仕組みが備わっています。
つまり、エクセルの内部機構でSUMの機能は指定した範囲の足し算を行うと言うプログラムがされていると言うことです。
これが関数の意味です。
この章以前の関数は組み込み関数と言いまして、C++によって始めから用意されている関数です。
例えばprintf関数は文字列を出力する関数ですが、C++でそのような働きを作ってくれています。
組み込み関数の他にC++では自分で好き勝手に「ある働きを持った関数」を作ることができます。
これをユーザー定義関数と言いますが、この関数の作成方法をこの章で説明していきます。
例えば消費税を自動で計算する関数を自分で作りたいとします。
その場合、商品のお金を関数に渡すと関数は商品金額に消費税率を掛けた処理をして、その消費税を返すという関数を作ることになります。
関数の構文は以下の通りですが、これを関数の定義と呼びます。 〇引数とは関数が利用するデータのことを言います。
〇関数の中の引数は左端からと数えていきます。
〇1個以上の引数を記述する場合はカンマで区切ってください。
〇 returnを記述するときはという形で書きます。
returnは必要がない場合、省略することが出来ます。
main関数も関数の一種ですが、他にも色々な関数を作ることが出来ます。
main関数は特別で他にどんな関数を作っても一番初めに実行される関数です。
次は関数の実行方法について説明します。
関数はmain関数を除いて関数を定義しただけでは何も動きません。
関数を実行させるためには関数を呼び出す必要があります。
呼び出すことによって関数の中身が実行されます。 では1番簡単な例から、見てみましょう。 初めにプログラムの流れから説明します。 では関数の仕組みを詳しく見てみましょう。 戻り値の型の箇所にvoidと書かれていますが、この例の場合は戻り値が無いのでvoidと記述します。
関数とは入力したデータ(引数)に基づいて決められた処理を行い、戻り値という結果を返す機能を持っていますと説明しましたが、その戻り値の型を関数名の左側に書きます。
この例のようにreturn文がなくて戻すための値がない場合にはvoidと書きます。 つまり、関数の呼び出し元から渡されてくる引数が無いということです。 この例の場合はの箇所でhello関数を呼び出していますが、引数がカラです。 以下の書き方はエラーです。 次は引数のある関数についての説明をします。
では例をみてみましょう。 tashizan関数を実行し終えたのならばmain関数に戻ってきて,でプログラムを終了します。 次は戻り値のある例を見てみましょう。 tashizan関数の中で足し算の計算がされて、変数zにその結果を代入しています。
そして、そのz(戻り値)をreturn を使ってmain関数内のに戻して、その値を変数dに代入しています。 このようにreturnは関数の呼び出し元に値を返す役割があります。
returnの書き方はです。
図にすると以下のような過程で進みます。 では、どのような時にのように戻り値を返す必要があるのか?
それは呼びだし側であるmain関数でその値を活用したい場合に戻り値を返します。
C++の基礎を知ろう1
この章ではC++の基礎について説明していきます。 このプログラムを実行しますと「Hello」と出力されますが、出力させるためにはという記述が必要です。
はデータを出力させる機能を持っています。
「std::cout」を機能させるためにはその機能を定義したファイルが必要ですので、そのファイルが「iostream」というファイルです。
これをヘッダーファイルと言います。このファイルを取り込む方法ですが、それにはファイル名の前にという記述が必要になります。
は今書いているプログラムに他のファイルを入れたい時に使います。
またヘッダーファイルを取り込む記述はプログラムの先頭で行ってください。
ではプログラムの骨格について説明します。
プログラムを書く際にはから作成します。
このmain関数がプログラムの中で初めに実行されます。 関数とは入力したデータ(引数)に基づいて「決められた処理」を行い、「戻り値」という結果を返す機能を持っています。
「戻り値」を返すにはreturnを使用します。
エクセルをご存知の方はわかると思いますが、例えばエクセル関数にSUMと言う関数が有りますが、この関数は指定した範囲のデータに基づいて足し算を行う関数です。指定した範囲のデータ(引数)が3,5,7であるならば戻り値は15です。
このように決められた機能を実行して結果を返すのが関数の役割です。
ではmain関数について説明します。 この例の関数名はmainですが、プログラムの中で最初に実行されるのはmain関数です。
このmain関数は必ず書く必要があります。
戻り値の型であるintや引数であるvoidについては「関数について知ろう」で詳しく説明しますので,今はmain関数からプログラムが実行されるとだけ覚えておいてください。
そして、実行内容はブロックの中に書いていきますが、そのブロック内ではプログラムは上から下へ実行されていきます。 上の赤枠の箇所にスペースがありますが、これはプログラムを読みやすくするためにあります。
このスペースのことをインデントと言います。
インデントは入れなくてもエラーにはなりませんが、入れると読みやすくなります。
またインデントは必ず半角で開けてください。 intやmainなどプログラムの骨格に書く文字やカッコなどは全て半角で入力して下さい。
この例の場合にintの箇所が大文字になっていますのでエラーが出ます。 プログラムの中にコメントを残すことも出来ます。
コメントはプログラムの意味などメモを書き残すために書きます。
このコメントの部分はプログラムには影響しません(つまり、コメント部分は出力されません)。
1行でコメントする場合はがコメントになります。
複数行の場合はの間にコメントを書いてください。
関数について知ろう3
この章では関数の定義の3つ目である「関数リテラルで定義」について説明します。
初めに先ほど説明した「関数の定義の基本構文1」で作成した例を見てみましょう。 これを「関数リテラルで関数を定義」する方法で書き直してみると以下のようになります。 関数はデータ型であり、配列リテラルと同じように関数も関数リテラルで記述することが出来ます。 この形式で書いた関数は無名関数と呼ばれています。
注意する点としては関数の定義は例のように呼び出しより前に書いてください。
つまり、以下のコードはエラーです。
関数について知ろう2
この章では関数の定義の2つ目である「Functionで定義」について説明します。
初めに先ほど説明した「関数の定義の基本構文1」で作成した例を見てみましょう。 これを「Functionで定義」する方法で書き直してみると以下のようになります(変数の値は違います)。これはFunctionオブジェクトを使った関数の定義です。
オブジェクトについては「オブジェクト指向型プログラミングについて」の章で学習しますので、今は形だけ覚えておいてください。 カッコの中の引数はダブルクォートで囲って何個でも書くことが出来ますが、カッコの中の末尾は関数の処理文を書きます。
処理文もセミコロンで区切れば何個でも書くことが出来ます。
では関数の中身の説明をします。
関数の初めの3つは送られてきたデータが入れられる引数です。
末尾のは3つの文からなっていますが、文の区切りにはセミコロンを付け、全体をダブルクォートで囲います(スペースの都合で関数を2行で書いていますが1行で書いても結構です)。
注意する点としてはFunctionで定義する場合は関数本体を関数の呼び出しより前に書いてください。
つまり、以下のコードはエラーです。