LoginSignup
30
32

More than 5 years have passed since last update.

PHPerの為のPython入門 - 関数

Last updated at Posted at 2014-05-11

前回の超基礎編からの続きで御座いますー。
今回は関数についての相違点と注意点をまとめてみます。

関数の定義

超基礎編でも説明しましたが、おさらいという事で。

まずはPHPのコード。

<?php

function func() {
    echo 'hoge';
}

func();

こっちがPythonのコード。

# coding=utf8

def func():  # 最後の : (コロン) を忘れずに!
    print('hoge')

func()

PHPではfunctionを使用しますが、Pythonではdefを使います。
Pythonはスコープの表現に{}は使用せずインデントを用います。

関数への値の渡し方 - その1

PHPもPythonも基本的な部分はそれほど変わりません。
ですが、Pythonの関数にはキーワード引数と呼ばれる物があります。
例を上げて見てみましょう。

PHP使ってると、デフォルト値を持っている引数を大量に持つ関数に出くわす事があります。
そんで、最後の引数だけデフォルト値じゃない値にしたい場合とかは、以下の様に書かないといけません。

<?php

function func($hoge='hoge', $piyo='piyo', $foo='foo', $bar='bar') {
    echo $hoge . PHP_EOL;
    echo $piyo . PHP_EOL;
    echo $foo . PHP_EOL;
    echo $bar . PHP_EOL;    
}

// 4つ目をデフォルト値以外にしたい場合、1〜3個目も書かないとダメ。
func('hoge', 'piyo', 'foo', 'fizz');

こういうケースで活躍するのがキーワード引数です!
PHPにはない特殊な書き方をする事で、指定した引数のみ渡すことが出来ます。

# coding=utf8

def func(hoge='hoge', piyo='piyo', foo='foo', bar='bar'):
    print(hoge)
    print(piyo)
    print(foo)
    print(bar)

# 指定した所だけを渡せる!
func(bar='fizz')

可変長引数

通常の可変長引数

可変長引数を持つ関数を実装する場合、PHPでは以下の様になりますね。

<?php

function func() {
    $args = func_get_args();
    var_dump($args);
}

func('hoge');
func('hoge', 'piyo');

これをPythonで表現するとこんな感じになるですよ!

# coding=utf8

def func(*args):
    print(args)

func('hoge')
func('hoge', 'piyo')

引数の名前の先頭に*を付けるだけ。
argsという引数名は固定ではなく、どんな名前でも大丈夫です。
args変数変更不可の配列(タプル)として扱う事ができます。
とてもシンプルですねー。

キーワード引数を可変長で扱う

さっき出てきたキーワード引数も可変長で受け取る事ができますよ。

# coding=utf8

def func(**kwargs):
    print(kwargs)

func(hoge='hoge')
func(hoge='hoge', piyo='piyo')

キーワード引数の場合は引数の名前の先頭に**を付けるだけ。
この場合はタプルではなく引数名と値がペアの辞書として扱うことが出来ます。

普通の引数もキーワード引数も可変長で扱う

さらに、これらを一緒に使うことも可能なのです!

# coding=utf8

def func(*args, **kwargs):
    print(args)
    print(kwargs)

func('hoge')
func('hoge', piyo='piyo')

関数への値の渡し方 - その2

関数へ値を渡す際にリスト(タプル)辞書を用いることが出来ます。

引数をリストで渡す

# coding=utf8

def func(hoge, piyo):
    print(hoge)
    print(piyo)

args = ['foo', 'bar']

# 引数の順番とリストの順番が対応しているよ。
func(*args)

可変長引数の時と似ていますねー。
リストが格納されている変数の名前に*を付けて関数に渡すことで、リストの要素を引数として扱う事が出来ます。

引数を辞書で渡す

# coding=utf8

def func(hoge, piyo):
    print(hoge)
    print(piyo)

kwargs = {
    'hoge': 'foo',
    'piyo': 'bar',
}

func(**kwargs)

リストで渡す方法と同様に、辞書が格納されている変数の名前に**を付けて関数に渡すと、キー(添字)に対応した引数に値が代入されていきます。
ただし、存在しない引数名をキー(添字)に書くとエラーになるのでご注意を。。

引数のデフォルト値にリスト・辞書を指定してはいけない

僕がちょっとハマった部分を紹介しますよ。
まずはPHPのコードを見てくださいな。

<?php

function func($hoge=array('foo')) {
    # hoge配列に 'bar' という要素を追加。
    $hoge[] = 'bar';
    var_dump($hoge);
}

func();
func();

$hoge = array('foo')に対して'bar'を追加して出力する関数を2回呼び出しています。
関数の実行結果はそれぞれ同じ結果になると思います。
これをPythonで書くと以下の様な感じ。

# coding=utf8

def func(hoge=['foo']):
    # hogeリストに 'bar' という要素を追加。
    hoge.append('bar')
    print(hoge)

func()
func()

実はこのPythonのコードは 期待通りに動きません!!!!!
実際に実行して見比べて見た方は、実行結果が違う事を確認出来たと思います。
詳しい説明は他の人に任せるとして、ここでは 引数のデフォルト値にはリスト・辞書は使っちゃダメ!と覚えて下さい。

まとめ

Pythonの関数は非常に柔軟でございます。
特にキーワード引数は強力なので、是非とも覚えてくださいませー。
次はクラスについて説明するよ!

30
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
32