python入門講座 | 関数の基礎5(キーワード引数)[第47回]

アラサーOLのためのpython入門講座

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!「パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日は位置引数とキーワード引数について解説します。Pythonでは、関数の引数に位置引数とキーワード引数の2種類が存在します。キーワード引数には初期値を設定することができます。初期値を設定しておくことで、関数呼び出しの際に引数を渡さなくても実行できるようになります。便利な技なのでぜひマスターしましょう!

この記事を読めば、関数の基礎知識について知ることができます。ぜひ最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!
  1. Abstract | キーワード引数で初期値を設定して関数をより便利に
  2. Background | Pythonの関数の引数
    1. まずは関数の基礎知識をおさらい
    2. 位置引数とキーワード引数
  3. Method | 位置引数とキーワード引数を取る方法
    1. 準備 | python notebookの新規作成
    2. キーワード引数を取る関数
      1. デフォルト値の引数で関数を呼び出す
      2. 引数を設定して関数を呼び出す
      3. 「引数 = 」を書かずに引数を設定して関数を呼び出す
    3. キーワード引数を複数取る場合
      1. デフォルト値で引数を呼び出す
      2. 引数を設定して関数を呼び出す
      3. 「引数 = 」を書かずに引数を設定して関数を呼び出す
    4. 位置引数とキーワード引数を取る関数
      1. 位置引数のみを設定して実行
      2. キーワード引数も与えて実行
      3. 位置引数も「引数 =」で与えることができる
    5. 位置引数とキーワード引数に関するエラーの典型例
      1. 関数定義時: 位置引数はキーワード引数よりも前に書く必要がある
      2. 関数実行時: 位置引数は必ず与える必要がある
    6. 発展編: 任意の数の位置引数とキーワード引数を取る関数
      1. 引数を与えずに実行
      2. 位置引数だけ与えて実行
      3. キーワード引数だけ与えて実行
      4. 位置引数とキーワード引数を与えて実行
      5. 引数を予めlist型とdict型で用意する方法
      6. 予めlist型とdict型で用意する方法は通常の関数でも使用可能
  4. Result | 練習問題
    1. 練習問題の回答例
  5. Conclusion | まとめ
  6. Reference
    1. Pythonの参考教科書

Abstract | キーワード引数で初期値を設定して関数をより便利に

キーワード引数は初期値を設定することができます。Pythonの関数の引数には位置引数とキーワード引数の2種類を設定することができます。関数を実行するとき、位置引数は必ず与えなければなりませんが、キーワード引数には初期値を設定しておくことで、基本は初期値(デフォルト値)を用いることができます。

関数を実行するたびに外部から与えて変更したいパラメータは位置変数として、一方で外部から与える可能性はあるけれども、基本は初期値を使えば良いというパラメータはキーワード引数として定義しておくと便利です。自分で関数を作るときには、位置引数とキーワード引数を目的に応じて使い分けると使いやすい関数になります。位置引数とキーワード引数を使った関数の作成は、実戦で頻繁に登場するテクニックなのでぜひマスターしましょう!



Background | Pythonの関数の引数

Pythonの関数の引数には位置引数(positional argumentもしくはnon-default argument)とキーワード引数(keyword argumentもしくはdefault argument)があります。今回はこれらについて解説します。

まずは関数の基礎知識をおさらい

関数とは、よく行う処理をまとめたものです。繰り返し登場する処理を関数としてまとめておくことで、シンプルでわかりやすいコードにすることができます。プログラムがある程度複雑になると、複数行に渡るような処理を何回も行う必要がある場面が出てきます。このとき、繰り返し登場する処理をそのままコピー&ペーストで増殖させてしまうと、

  • あとで見直したときに、どこで何をしているのかすぐにわからない
  • 修正したいときに、あらゆる箇所を直さなくてはならない

など、プログラミングの手間が増えて効率が落ちます。

関数を使って処理をまとめることで、その処理を行う際に関数を呼び出す1行だけを書けば良くなります。ソースコードがシンプルで短くなるので、どこで何をしているのかわかりやすくなります。また、処理内容を修正したり変更したいときには、関数を定義した箇所を一つだけ変更すれば済みます。このように、関数を使って繰り返し登場する処理をまとめることで、効率よくプログラミングができるようになります。

関数については以下の過去記事もありますので、参考にご覧ください。

前回は引数の関数を定義する方法を解説しました。今回は位置引数とキーワード引数について見ていきます。



位置引数とキーワード引数

位置引数とは、前回記事「python入門講座 | 関数の基礎4(引数のとり方)」で紹介した通常の引数です。関数を定義するときに、

def 関数名(引数):
    hogehoge

このようにすることで、位置引数を取ることができます。関数を呼び出す際、位置引数を必ず与える必要があります。

一方、キーワード引数は、関数を呼び出す際に与えなくても構いません。関数を定義する際にデフォルト値を定義しておくことで、その値に設定されます。キーワード引数を取る関数を定義するには、

def 関数名(引数 = デフォルト値):

のように、引数の後にデフォルト値を設定します。関数を呼び出す際には、

関数名()

とすれば、キーワード引数はデフォルト値に設定されます。他の値に設定したい場合には、

関数名(引数 = 設定値)

と書きます。

また、キーワード引数のことを”defaut argument”、位置引数のことを”non-default argument”と呼ぶこともあります。こちらの呼び方も覚えておきましょう。



Method | 位置引数とキーワード引数を取る方法

実際に手を動かしながら学んでいきましょう!Jupyter Notebookを立ち上げてコーディングしながら読み進めてください。練習問題の後にコーディング例も掲載しますので、やってみてどうしてもわからなければそれを見て進めてください。



準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。いつものpython_practiceのディレクトリに「practice_func_kwargs」という名前のpython notebookを作成してください。ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」で詳しく解説しているので、これを見ながらやってみてください。

python notebookを起動したら、適宜Markdownセルに説明書きを加えながら下記の説明に沿ってコードを書いて実行していきましょう。Markdownセルやコードセルなどの用語やこれらの使い方についても、過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。練習問題の後にpython notebookの例を掲載します。もし書き方がわからなければそちらを見てください。



キーワード引数を取る関数

キーワード引数を一つ取る関数を作成してみましょう。引数の後にデフォルト値を書きます。以下を実行してみましょう。

# define a function
def HelloVar(var = 'world'):
    print('Hello, %s!' % (var))

関数を定義するときの丸括弧の中に「引数 = デフォルト値」と書くことでデフォルト値を設定できます。

デフォルト値の引数で関数を呼び出す

上の関数を呼び出してみましょう。引数を与えずに呼び出せば、デフォルト値が設定された状態で関数が実行されます。以下を実行してみましょう。

# call the function
HelloVar()

関数HelloVar内のvarという変数にはデフォルト値である’world’が設定されています。実行結果は以下です。

Hello, world! 



引数を設定して関数を呼び出す

引数を別の値に設定したい場合は、「引数 = 設定値」と書いて関数を呼び出します。以下を実行してみましょう。

# call the function giving an argument
HelloVar(var = 'python') 

実行結果は以下です。

Hello, python!



「引数 = 」を書かずに引数を設定して関数を呼び出す

「引数 = 」を書かなくても関数を呼び出すことができます(ただし書かなければいけない関数も存在します。発展編で後述します)。以下を実行してみましょう。

# call the function
HelloVar('python')

実行結果はさきほどと同じです。



キーワード引数を複数取る場合

キーワード引数を複数取る関数も作ってみましょう。先程と同様、「引数 = デフォルト値」を複数書くだけです。以下を実行してみましょう。

# define a function
def HelloTwoVar(var1 = 'cats', var2 = 'dogs'):
    print('Hello, %s and %s!' % (var1, var2))

デフォルト値で引数を呼び出す

この関数を引数を与えずに呼び出してみましょう。以下を実行してください。

# call the function
HelloTwoVar()

実行結果は次のとおりです。

Hello, cats and dogs!



引数を設定して関数を呼び出す

引数を与えて実行してみましょう。2つ与えることも、一つだけ与えることもできます。以下を実行してください。

# call the function (2 args given)
HelloTwoVar(var1 = 'tigers', var2 = 'dragons')

# call the function (1 arg given)
HelloTwoVar(var1 = 'wolves')

# call the function (1 arg given)
HelloTwoVar(var2 = 'tigers')

実行結果は以下です。

Hello, tigers and dragons!
Hello, wolves and dogs!
Hello, cats and tigers!



「引数 = 」を書かずに引数を設定して関数を呼び出す

「引数 = 」を書かずに実行することもできます。その場合、置引数と同様、順番通りに引数が設定されます。1つ目の引数はデフォルト値にして2つ目だけを変更したい場合(上の例の「var2 = ‘tigers’」のみ与えて、「Hello, cats and tigers!」を出力するような場合)、「引数=」を書くか、1つ目の引数も与える必要があります。以下を実行してみましょう。

# call the function (2 args given)
HelloTwoVar('tigers', 'dragons')

# call the function (1 arg given)
HelloTwoVar('wolves')

# call the function (1 arg given)
HelloTwoVar('tigers')

# call the function (2 args given)
HelloTwoVar('cats', 'tigers')

この例の3番目では、「var2 =」をつけずに「’tigers’」のみを与えているため、「’tigers’」はvar1に格納されることに気をつけます。実行結果は以下の通りです。

Hello, tigers and dragons!
Hello, wolves and dogs!
Hello, tigers and dogs!
Hello, cats and tigers!



位置引数とキーワード引数を取る関数

位置引数とキーワード引数を両方取る関数も作ることができます。関数を定義するときに、位置引数をすべて定義してから、キーワード引数を定義するという順番にします。以下の例を実行してみましょう。

# define a finction
def GreetVar(greeting, var = 'world'):
    print('%s, %s!' % (greeting, var))

変数greetingが位置引数、varがキーワード引数です。位置引数が必ず先に定義されている必要があります。

位置引数のみを設定して実行

キーワード引数は与えなくても実行できますが、位置引数は必ず与える必要があります。まずは位置引数だけを与えて実行してみましょう。以下を実行してください。

# hello
GreetVar('Hello')

# hi
GreetVar('Hi')

# Good morning
GreetVar('Good morning')

第一引数である変数greetingを変更することで、いろいろな挨拶ができます。実行結果は以下のとおりです。

Hello, world!
Hi, world!
Good morning, world!



キーワード引数も与えて実行

キーワード引数も与えて実行してみましょう。以下を実行してください。

# hello python
GreetVar('Hello', var = 'python')

# hello python
GreetVar('Hello', var = 'jupyter')

第2引数である変数varを変更することで、いろいろな対象に挨拶できます。実行結果は以下の通りです。

Hello, python!
Hello, jupyter!



位置引数も「引数 =」で与えることができる

位置引数も「引数 =」という書き方で与えることができます。以下の例を実行してみましょう。

# hello python
GreetVar(greeting = 'Hello', var = 'python')

これでも実行できます。結果は以下です。

Hello, python!



位置引数とキーワード引数に関するエラーの典型例

位置引数とキーワード引数に関連するエラーでよく起こるものをご紹介します。

関数定義時: 位置引数はキーワード引数よりも前に書く必要がある

関数を定義するときに、位置引数はキーワード引数よりも前に書く必要があります。キーワード引数を前にしてしまうとエラーとなります。以下を実行してみましょう。

# wrong definition
def WrongGreetVar(greeting = 'Hello', var):
    print('%s, %s!' % (greeting, var))

変数greetingはキーワード引数として定義されていますが、変数varは位置引数です。これは以下のようなエラーとなります。

SyntaxError: non-default argument follows default argument



関数実行時: 位置引数は必ず与える必要がある

関数を実行するとき、位置引数を必ず与える必要があります。これを忘れるとエラーとなります。以下を実行してみましょう。

# error
GreetVar(var = 'error')

先程の例で定義した関数GreetVarには変数greetingが位置引数として設定されています。したがって位置引数を与えないと以下のようなエラーとなります。

TypeError: GreetVar() missing 1 required positional argument: 'greeting'



発展編: 任意の数の位置引数とキーワード引数を取る関数

発展編として、任意の数の引数を取る関数の作成方法を紹介します。使う機会はあまりないので「こんなのあるんだ」ぐらいに思ってください。

まず、以下のように関数を定義します。以下の例を実行して関数ArbitArgsを定義してください。

# define a function
def ArbitArgs(*args, **kwargs):
    print('Type of args', type(args))
    print('N of args:', len(args))
    # - print all args - #
    for i in range(len(args)):
        print(' ', i, args[i])
    
    # - kwargs - #
    print('Type of kwargs', type(kwargs))
    print('N of kwargs', len(kwargs))
    # - print all kwargs - #
    for t in kwargs:
        print(' ', t, kwargs[t])

このように「*args」、「**kwargs」と書いて関数を作成すると、変数argsはtuple型で位置引数として、変数kwargsはdict型でキーワード引数として定義されます。この関数では、argsとkwargsそれぞれについて、変数の型、要素数を表示した上で、for文で要素を一つ一つ表示します。



引数を与えずに実行

試しに引数を与えずに実行してみましょう。以下を実行してみてください。

# - call the function with no input - #
ArbitArgs()

引数を与えないと、argsとkwargsは要素数0のtuple型、dict型となります。実行結果は以下です。

Type of args <class 'tuple'>
N of args: 0
Type of kwargs <class 'dict'>
N of kwargs 0



位置引数だけ与えて実行

次に、位置引数だけ与えてみましょう。以下を実行してみましょう。

# - call the function with args- #
ArbitArgs('arg1', 'arg2', 'arg3')

与えた文字列’arg1′, ‘arg2’, ‘arg3’は位置引数のargsに格納されます。argsは要素数3のtuple型となります。キーワード引数のkwargsは何もないので要素数0です。実行結果は以下です。

N of args: 3
  0 arg1
  1 arg2
  2 arg3
N of kwargs 0



キーワード引数だけ与えて実行

今度はキーワード引数だけ与えてみましょう。以下を実行してください。

# - call the function with kwargs- #
ArbitArgs(kw1 = 'kwarg1', kw2 = 'kwarg2', kw3 = 'kwarg3', kw4 = 'kwarg4')

ここで与えたkw1, kw2, kw3, kw4は、関数ArbitArgs内ではキーワード引数であるkwargsに格納されます。kwargsはdict型で、kw1のキーで’kwarg1’の値が呼び出されます。実行結果は以下です。

N of args: 0
N of kwargs 4
  kw1 kwarg1
  kw2 kwarg2
  kw3 kwarg3
  kw4 kwarg4



位置引数とキーワード引数を与えて実行

位置引数とキーワード引数を両方与えて実行しましょう。以下を実行してください。

# - call the function with args and kwargs - #
ArbitArgs('arg1', 'arg2', 'arg3', kw1 = 'kwarg1', kw2 = 'kwarg2', kw3 = 'kwarg3', kw4 = 'kwarg4')

この場合、’arg1’から’arg3’までが位置引数と認識されてargsに、kw1 = ‘kargs1’以降はキーワード引数と認識されてkwargsに格納されます。実行結果は以下です。

N of args: 3
  0 arg1
  1 arg2
  2 arg3
N of kwargs 4
  kw1 kwarg1
  kw2 kwarg2
  kw3 kwarg3
  kw4 kwarg4

ちなみに、当然ながら、キーワード引数は「引数 = 」という書き方をする必要があります。そうでないと、自動的に位置引数として認識されてしまいます。試しに以下を実行してみてください。

# - Without kw? = expression, all arguments are regarded as positional - #
ArbitArgs('arg1', 'arg2', 'arg3', 'kwarg1')

4つの引数はすべて位置引数とみなされます。実行結果は以下です。

N of args: 4
  0 arg1
  1 arg2
  2 arg3
  3 kwarg1
N of kwargs 0



引数を予めlist型とdict型で用意する方法

与えたい引数を引数を予めlist型とdict型で用意することもできます。以下を実行して、list型変数argsとdict型変数kwargsを定義しましょう。

# - prepara args and kwargs  - #
args = ['arg1', 'arg2', 'arg3']
kwargs = {'kw1': 'kwarg1', 'kw2': 'kwarg2', 'kw3':'kwarg3', 'kw4':'kwarg4'}

位置引数を渡すときは、「*」を付けます。以下を実行してみましょう。

# - call the function with args- #
ArbitArgs(*args)

結果は先程と同様で、以下のようになります。

N of args: 3
  0 arg1
  1 arg2
  2 arg3
N of kwargs 0

キーワード引数を渡すときは「**」を付けます。以下を実行してみましょう。

# - call the function with kwargs- #
ArbitArgs(**kwargs)

結果は以下のとおりです。

N of args: 0
N of kwargs 4
  kw1 kwarg1
  kw2 kwarg2
  kw3 kwarg3
  kw4 kwarg4



予めlist型とdict型で用意する方法は通常の関数でも使用可能

上記で解説した、与えたい引数をlist型とdict型で用意しておく方法は、任意の数の引数を取る関数だけではなく、通常の関数でも使用できます。先程の例で作成した関数HelloTwoVar()で試してみましょう。以下を実行してみましょう。

# set kwargs
kwargs = {'var1':'tigers', 'var2':'dragons'}

# call the function
HelloTwoVar(**kwargs)

ここではまず、dict型変数kwargsに、’var1’と’var2’をキーとする値’tigers’と’dragons’を格納しています。これをキーワード引数として関数HelloTwoVar()に渡します。キーワード引数の場合は「**」をつける必要があることに注意します。実行結果は以下です。

Hello, tigers and dragons!



位置引数とキーワード引数を両方とる関数でも同様です。先程の例で作成した関数GreetVar()を使って試してみましょう。以下を実行してみましょう。

# set args
args = ['Good morning']

# set kwargs
kwargs = {'var': 'Japan'}

# call the function
GreetVar(*args, **kwargs)

list型変数argsに’Good morning’という文字列、dict型変数kwargsに’var’をキーとする値’Japan’を格納します。それぞれを位置引数とキーワード引数としてGreetVar()に渡します。位置引数は「*」、キーワード引数は「**」をつけることに注意です。実行結果は以下です。

Good morning, Japan!

Result | 練習問題

練習問題をやってみましょう。以下の処理を行うコードを書いてみましょう。

  1. 引数を1つ取り、「I like」のあとにその引数の内容を出力する関数ILikeVarを作成してください。
    ただし、引数の初期値は”cats”としてください。
  2. 関数ILikeVarを引数を与えずに呼び出してください。
  3. 関数ILikeVarに”cats”以外の適当な引数を与えて呼び出してください。
  4. 引数を2つ取り、「I like」のあとにその引数の内容を出力する関数ILikeTwoVarを作成してください。
    ただし、引数の初期値は”cats”と”dogs”としてください。
  5. 関数ILikeTwoVarを引数を与えずに呼び出してください。
  6. 関数ILikeTwoVarに適当な引数を与えながら呼び出してください。



練習問題の回答例

練習問題の回答が完成したら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!参考にしてみてください。また、今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただき、ありがとうございます!
キーワード引数を取る関数を定義する方法を解説しました。キーワード引数は初期値を設定することができます。外部から与える可能性はあるけれども、基本は初期値を使えば良いパラメータに便利です。自分で関数を作るときには頻繁に登場するテクニックなのでぜひマスターしましょう!

以上「python入門講座 | 関数の基礎5(位置引数とキーワード引数)」でした!
またお会いしましょう!Ciao!



Reference

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでみてください!

Pythonの参考教科書

コメント

タイトルとURLをコピーしました