Python 関数定義 def文

Python学習【365日チャレンジ!】47日目のマスターU(@Udemy11)です。

どうもMacのTimeMachineがうまく動いていないみたいなので、何度もAppleサポートに連絡しているのですが、未だに解決には至っていません。

直結で外付けHDを接続すれば問題なくバックアップが取れるのですが、Appleはどんどんジャックを減らして、コードから開放されようとしているわけなので、

なぜバックアップするときにはコードを繋がないといけないんだ〜!

と思っちゃうんですよね。

Appleはハードウェアからソフトウェアまで自社製品にこだわった製品づくりがあるからこそ、Windowsのようなハードとソフトのコンクリフトに悩まされることは少ないところが魅力です。

なのに、ネットワーク関連製品であるTimeCapsuleは例外のようで、すでに開発をやめて、製品のラインナップから外れてしまっています。

Appleが大好きな私からすると、

そこは外部に任してもいいんかい!

と突っ込みたくなっちゃうんですよね。

これまでTimeCapsuleを使っていた私としては、この先、Appleから進化したTimeCapsuleがリリースされることを期待しているんですけどね〜。

それでは、今日は、def文による関数定義を学習していきます。

昨日の復習

昨日は、for文での辞書型データの使い方について学習しました。

復習の復習になりますが、辞書型には、keyとvalueの一対になった値が格納されているので、for文で値を取り出す際には、keyだけを取り出すとき、valueだけを取り出すたとき、keyとvalueを一緒に取り出すときに使う3つのメソッドがありました。

それが、keys()、values()、items()でした。

d = {'a': 100, 'b': 200, 'c':300}
for i in d.keys():
    print(i)
 
for i in d.values():
    print(i)
 
for x, y in d.items():
    print(x, y)

出力結果

a
b
c
100
200
300
a 100
b 200
c 300

items()メソッドで取り出されるのは、タプル化された対のkeyとvalueになるので、それをアンパッキングして出力するコードになっています。

items()で取り出した値を代入する変数を【for x, y】とせずに、【for i】にして、変数iをprint出力すると次のような出力になります。

('a', 100)
('b', 200)
('c', 300)

今回復習だったので、ついつい変数を2つ指定するのを忘れてしまって、変数iに出力したので、この結果に気づいたわけですが、やっぱり何度も復習することで、新しい発見もできるので、復習って、ほんと大切ですね。

それでは、def文に入っていきましょう!

def文の基本

def文は、【definition】の略で、定義という意味ですが、関数を定義するときに使います。

関数って自分で定義できるんだ

と思ったあなたはなかなか鋭いですね。関数は自分で作れるんです。

これまでにいくつか関数を学習してきたわけですが、そもそも関数って何?というところを調べてみました。

関数とは

与えられた文字や数値に対し、定められた処理を行って結果を返す機能のこと。表計算ソフトやデータベースソフト、プログラミング言語などで利用される。関数ごとにさまざまな処理が割り当てられており、たとえば、表計算ソフトのExcelで「SUM」という関数を用いると、指定した範囲の合計が求められる。

つまり、定められた処理を実行して結果を返すものが関数ということなので、自分でいくつかの処理を組み合わせれば、関数を作れるということです。

そんな関数を定義できるのが、def文ということです。

def文の使い方

関数が何なのかを理解したところで、def文の使い方を学習しましょう。

def say_yes():
    print('Yes!')
 
say_yes()

出力結果

Yes!

このコードは、def文によって、【Yes!】と出力する関数say_yes()を定義して、関数say_yesを実行しています。

いまさらなんですが、酒井さんの講座を受講していいて疑問に思っていたことがあります。
それが、関数や変数の定義に関してルールがあるのか?ということです。

ここまで何気なく、変数にiやらaやらを使ったり、say_yesなんて関数にしたりしていますが、なんとなく感じているのが、

その変数は一体なんなのか?

ある程度理解できる名前にするということです。

ネットで調べてみても、変数の命名はプログラマのセンスに任されているようですし、決まった命名法はないようです。

重要なのは、他のプログラマーがみて、理解できる変数名にすることなので、酒井さんの変数命名を参考に、コードを書いていこうと思います。

前方参照禁止

Pythonには、インデントを揃えるというルールがありますが、前方参照禁止というルールもあります。

実行する時点で定義されていない関数を禁止するもので、定義する関数より先に実行するコードを書いてしまうとエラーになります。

say_yes()
 
def say_yes():
    print('Yes!')

出力結果

Traceback (most recent call last):
  File "/private/var/mobile/Containers/Shared/AppGroup/BA3519D5-E394-4ECC-BFF6-B1876836D55A/Pythonista3/Documents/Mypython/day0329.py", line 1, in <module>
    say_yes()
NameError: name 'say_yes' is not defined

関数say_yesは定義されていませんよ!と指摘されてエラーになります。

イメージ的には、前方参照禁止というより、後方参照禁止のほうがわかりやすい気がするのですが、関数より前方に実行コードを持ってくるから前方参照禁止というのでしょうか?

とりあえず、関数は実行コードより前で定義しないとだめということです。

typeはなに?

def文で定義する関数名のタイプをチェックしてみましょう。

def say_yes():
    print('Yes!')
 
print(type(say_yes))

出力結果

<lass 'function'>

当たり前ですが、functionつまり関数タイプになります。

ちょっと変わったPython学習者である私は、もちろんここでもタイプを調べるためにこんなコードを書いてしまっています。

def say_yes():
    print('Yes!')
 
print(type(say_yes()))

出力結果

Yes!
<class 'NoneType'>

parenthesisの丸括弧をつけてしまうことで、関数say_yesを実行して、その後type(say_yes())を出力しているようでした。

普通の人はこんなコードを書かないんでしょうね。

say_yesのタイプがfunctionなので、次のように書いても関数が実行されます。

a = say_yes
a()

まーこんなことするなら、最初の関数をaにすりゃいいんじゃない?と思ってしまいますが、とりあえず、こんなこともできるということで紹介されていたので、やってみた次第です。

返り値はreturnで

関数は、【return】を使って、処理をさせたあとの返り値を指定することができます。

def say_what():
    w = 'Hello!'
    return w
 
result = say_what()
print(result)

出力結果

Hello!

流れとしてはreturnで返り値に変数wを指定して、変数wには’Hello’を代入するという関数say_whatを定義して、関数say_whatの実行結果を変数resultに代入した後、変数resultを出力するという感じです。

引数を使う

定義する関数に引数というものを指定することができ、関数の実行時に引数に値を代入することができます。

def what_is_it(gadget):
    print(gadget)
 
what_is_it('iPhone')

出力結果

iPhone

引数gadgetを指定して、引数を出力するという関数what_is_itを定義して、関数を実行する際に、引数gadgetにiPhoneを代入することで、iPhoneと出力されます。

この引数と返り値を組み合わせて使うのが基本的な使い方です。

引数の値による条件分岐

引数に代入された値の条件によって、返り値を変えるという使い方ができます。

def what_this(color):
    if color == 'red':
        return 'apple'
    elif color == 'green':
	return 'vegetable'
    else:
	return "I don't know"
 		
print(what_this('red'))
print(what_this('green'))
print(what_this('orange'))

出力結果

apple
vegetable
I don't know

関数what_thisは、引数colorを指定して、colorがredだった場合は、apple、greenだった場合は、vagetable、それ以外はI don’t knowと出力するように定義しています。

それぞれ引数にred、green、orangeを入れて実行していますが、出力結果は、apple、vegetable、I don’t knowが出力されます。

次に、実行部分の引数の値をinput関数で入力するようにしてみました。

def what_is(color):
    if color == 'red':
        return 'apple'
    elif color == 'green':
	return 'vegetable'
    else:
	return "I don't know"
 	
answer = input('Enter color:')
print(what_is(answer))

出力結果

Enter color:

Consolで色を入力することで、条件に指定した値が出力されます。
redならapple、greenならvegetable、それ以外は、I don’t knowと出力されます。

プラスアルファが大切

たまに、講座を受講する前は、学習した内容だけでいいやと思うことがあるのですが、やはり、講座を受講すると疑問が生まれて、追加のプラスアルファの内容を調べている自分がいます。

今回は過去に学習したinput関数を組み合わせて使ってみたのですが、意外なことに1回でうまく実行することができました。
(いつもは必ずエラーを起こすのに。。。)

あんまり欲張ってあれもこれもと一気にやってしまうと、かなりエネルギーを使うので、後々継続のモチベーションを保つのが大変になってしまいます。

もちろん、好奇心に従って没頭することはいいことですが、1年365日継続するという目標を立てているので、熱くなりすぎず、少しずつ疑問に感じたことをクリアーにしていこうと考えています。

今日は、少し長くなりましたが、今後の学習に重要なところなので、しっかり復習しておきましょう!

それでは、明日もGood Python!