【Python】*args/**kwargsって何?1分で理解できる可変長引数

Python

Python学習中の方であれば1度は疑問に思うであろう「*args」「**kwargs」について端的に説明します。

結論から説明すると、*args/**kwargs は、自由に引数の数を指定できる引数のことです。

このページでは、*args/**kwargsはどのように利用されるのか?利用シーンや押さえておきたいツボをサンプルコードを用いて解説していきます。

このページで学べる内容
  • 可変長引数(*args/**kwargs)とは?
  • 可変長引数の特徴と使い方・書き方
  • 可変長引数を用いた関数の定義方法を呼び出し方

関数や、リスト・辞書(ディクショナリ)などの基本用語が出てきますが、それらの基本となる用語・概念についても合わせて解説していますので、是非最後までご覧ください。

スポンサーリンク

前提:関数の基本

関数とは何か?を理解している方はこの章は読み飛ばしてください。

*args/*kwargsは、関数の引数として用いられます。

前提として関数とは何かをおさらいしておきましょう。

関数は、一言で言えば「複数の処理を1つにまとめて名前を付けたもの」。 処理を予め構造化(定義)しておき、あとから呼び出す形で利用するイメージです。

プログラムをコーディングしていくと、同じような処理を複数回必要とする場合がでてきます。このようなタイミングで、当該処理を予め構造化しておいて、何度も呼び出す形で利用することができればコード全体の「構造化」と「効率化」を向上させることが可能です。
 def func1 ():              # 関数の定義
    print("初めての関数")

func1() # 関数の呼び出し


# 結果 ⇒ 初めての関数

*args/**kwargsとは?

関数のパラメータを定義する際に、引数に「*(アスタリスク)」を1つ、もしくは2つつけることで任意の数の引数を指定することができるようになります。

分かりやすく言うと

関数を定義する際に引数を2つ指定した場合には、関数の実行時に必ず2つの引数を渡さなければいけませんでした。(3つの引数であれば3つ。4つの引数であれば引数を4つ渡さなければならないということ。

「引数」の先頭に「*」を付与することで、引数には任意の数のパラメータを渡すことができるようになるということです。

この引数の数を任意に指定できる引数を「可変長引数」と呼び、Pythonでは慣例的に「*agrs」「**kwargs」として記述します。

構文ルールとしては、引数の前に「*(アスタリスク)」を付与するだけでOK。それだけで可変長引数であることを表現することができます。

ただし、*を付与した引数が「可変長引数であるということ」を分かりやすくするために 「*agrs」「**kwargs」 と記述するのが慣例で巣。

「*a」や「**aaa123」という名称でも良いですが、特にその名称に意味が無いような場合は*args/**kwargsの名称を用いるようにしましょう。

*args

*(アスタリスク)を1つ付与した場合、複数の引数をタプルとして受け取ります。

def func1(*args):
    print(args)
 
func1(1, 2, 3, 4, 5)


# 結果 ⇒ (1, 2, 3, 4, 5)

"args" は argument(日本語:引数) の複数形の略です。

タプルとは?

タプルとは、配列の仲間です。

配列は、複数の値を代入することが可能な変数だと理解してしまってOK。

タプルは、配列と似ていますが、要素の変更ができないものです。

tuple = ("あいうえお","かきくけこ","さしすせそ")
tuple(0) = "たちつてと"  # 要素を変更しようとするとエラーになる

タプルについて詳しき知りたい方は、こちらの記事をご覧下さい。

*args を普通の引数と同時に用いる

*args を普通の引数と一緒に用いることも可能です。

def func2(number, name, *points):
    print(number, name)
    print(points)
 
func2(10, 'Yamada Taro', '100', '98' ,'76' ,'97' ,'82')


"""
結果
10 Yamada Taro
('100', '98', '76', '97', '82')
"""

**kwargs

引数の先頭に * を2つ付与した場合、複数の値を辞書(ディクショナリ)として受け取ります。

def func2(**points):
    print(points)
 
func2(English='100', Math='98', Science='76' ,Social='97' ,Japanese='82')


"""
結果
{'English': '100', 'Math': '98', 'Science': '76', 'Social': '97', 'Japanese': '82'}
"""
辞書(ディクショナリ)とは

辞書(dictionary)とは、keyとvalueの組み合わせが含まれているデータのことです。

# 辞書「city」の定義
city = {
    '東京'  :"東京", 
    '神奈川':"横浜", 
    '大阪'  :"大阪", 
    '愛知'  :"名古屋", 
    '北海道':"札幌",
}


print(city['神奈川']) # キー「神奈川」の値を表示
print(city['愛知'])    # キー「愛知」の値を表示
# 結果はこちら
"""
横浜
名古屋
"""

**kwargs を普通の引数と同時に用いる

**kwagrs を普通の引数と一緒に用いることも可能です。

def func2(number, name, **points):
    print(number, name)
    print(points)
 
func2(10, 'Yamada Taro', English='100', Math='98', Science='76' ,Social='97' ,Japanese='82')


"""
結果
10 Yamada Taro
{'English': '100', 'Math': '98', 'Science': '76', 'Social': '97', 'Japanese': '82'}
"""

Pythonを1から学習したい方は

Pythonをより実践的に学びたい―。実際にコーディングをしながら学びたい―。独学に限界を感じている―。

そんな方には、無料体験/オンライン完結もあるプログラミングスクールで学ぶのがおすすめです。都度検索しながら知識を補完していくのではなく、1から体系立てて学ぶことで短時間・かつ効率的にスキルハックすることが可能です。

各プログラミングスクールの特徴をまとめた記事をこちらに記載しておきますので、是非ご覧ください。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    アウトプットは「最強のインプット」である!
  2. 備忘:忘れたとしても後から見返せるように。
    未来の自分への「お手紙」を書いています。
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    あなたの知識は誰かにとっての「価値ある情報」です。

副業ブログの始め方はこちらから

スポンサーリンク
Python
ビズドットオンラインをフォローする
blank
ビズドットオンライン
タイトルとURLをコピーしました