ロゴ

プログラミング初心者がアプリ開発を目指すブログ

【Python入門】関数- Python初心者勉強記022

今回から、Pythonの関数を見ていきたいと思います。Pythonの関数機構は多彩で、様々なコーディングに対応することができます。

関数の引数の基本

関数の定義はdef文を使って行います。
def 関数名 (引数 …)
関数の基本は、何かしらのオブジェクトを引数として受け取って、何かしらのオブジェクトを戻り値として返すというものです。
ここでは、まず引数に着目して見ていきたいと思います。

引数なしの関数

まずは、一番シンプルな関数を見ましょう


>>> def hello():
...     print('Hello')
... 
>>> hello()
Hello

このコードの「def」以降のインデントしている部分が関数の内容の定義です。定義した関数は
関数名()
とすることで呼び出すことができます。

一般的な引数を受ける関数

引数を受ける関数は以下のように書きます。


>>> def hello2(target1,target2):
...     print('Hello ' + target1 + ' ' + target2)
... 
>>> hello2('Jim','Tom')
Hello Jim Tom

この例では、target1,target2という変数で引数を受け取って処理します。呼び出す際は、引数の順番に注意しましょう。

デフォルト値を指定した関数

以下のように書くと、関数の呼び出し時に引数が指定されない場合、デフォルト値が引数として渡されるようになります。


>>> def hellodefault(target='everyone'):
...     print('Hello ' + target)
... 
>>> hellodefault()
Hello everyone
>>> hellodefault('Jim')
Hello Jim

シーケンス型で可変長引数

シーケンス型を使うことで任意の数の引数を受け取ることができます。
引数の宣言の前に「*」をつけると、引数をタプル型として受け取ります。デフォルトでは空のタプルを受けたことになります。
関数の呼び出し時に、シーケンス型のオブジェクトを複数の引数として渡したい場合は、「*」をオブジェクトの前につけます。


>>> def hellose(*targets):
...     print('Hello ' + ' '.join(targets))
... 
>>> hellose('Jim','Tom')
Hello Jim Tom
>>> hellose(*['Jim','Tom'])
Hello Jim Tom

辞書型で可変長引数

引数の宣言の前に「**」をつけると、キーワード付き引数を辞書型として受け取ることができます。デフォルトでは空の辞書です。
辞書型のオブジェクトを引数として渡したい場合は、「**」をそのオブジェクトの前につけます。


>>> def hellodic(**options):
...     if options.get('target') == 'Japanese':
...             hello='こんにちは'
...     else:
...             hello='Hello'
...     print(hello + ' ' + options.get('suffix',''))
... 
>>> hellodic(target='Japanese',suffix='!')
こんにちは !
>>> hellodic(**{'target' : 'Japanese','suffix' : '!'})
こんにちは !

複数種類の引数の渡し方

ここまで説明した、一般的な引数、デフォルト値のある引数、シーケンス型の可変長引数、辞書型の可変長引数は、同時に指定することができます。
ただし、宣言の順番は「一般的な引数⇒デフォルト値のある引数⇒シーケンス型の可変長引数⇒辞書型の可変長引数」の順でなければなりません。

参照渡しと値渡し

関数の引数渡しは、参照渡しと値渡しがあります。
参照渡しは、変数のメモリの番地を渡す引数の渡し方で、これにより変数が共有されたような形になります。
参照渡しを行うと、関数内で変数を更新すると関数外にも更新が反映されます。
値渡しは、変数の中身をコピーして渡す方法で、変数は共有されません。
これにより、関数内で変数に変更を施しても、関数外には影響を及ぼしません。

Pythonの引数は、基本的には参照渡しで、変更不可能なオブジェクトのときは実質的に値渡しのようになります。

例えば、引数に配列を渡すと、関数内での更新が関数外にも反映されます。


>>> def func(x):
...     x.append(1)
... 
>>> a = [1,2,3]
>>> func(a)
>>> a
[1, 2, 3, 1]

この例では、func外で宣言されたa と func内のxが参照渡しによってメモリ番地が共有されるので、
関数内でxを更新するとaも更新されます。

一方、数字、文字列、タプルなどは関数外に更新が反映されません。


>>> def func(x):
...     x+=1
... 
>>> a=3
>>> func(a)
>>> a
3

この例では、aは値渡しになるので、変更されません。

関数の戻り値

戻り値の設定

次に関数の戻り値を説明します。
既に何度か出てきていますが、戻り値の指定はreturn文で行います。
return 戻り値


>>> def multiply(a,b):
...     return a * b
... 
>>> multiply(3,4)
12

return文がないときは、戻り値は”None”になります。

アンパック代入

return文でタプル型のオブジェクトを返す場合は、その各要素をそれぞれ別の変数に格納したいときは次のように書きます。


>>> def difference(a,b):
...     return a[0]-b[0],a[1]-b[1]
... 
>>> x,y=difference((3,4),(1,2))
>>> (x,y)
(2, 2)

Python入門講座の次の記事はこちら => 【Python入門】関数オブジェクト デコレーター スコープ- Python初心者勉強記023

スポンサード リンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA