<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>関数Python Tech</title>
	<atom:link href="https://tech.nkhn37.net/category/python/python-introduction/python-function/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech.nkhn37.net</link>
	<description>Python学習サイト</description>
	<lastBuildDate>Fri, 23 Jan 2026 23:09:36 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://tech.nkhn37.net/wp-content/uploads/2021/01/cropped-lion-normal-clear-1-32x32.png</url>
	<title>関数Python Tech</title>
	<link>https://tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Python】filter関数の使い方の基本 ~条件を満たす要素を抽出~</title>
		<link>https://tech.nkhn37.net/python-filter-basic/</link>
					<comments>https://tech.nkhn37.net/python-filter-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Thu, 24 Aug 2023 20:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[Filter]]></category>
		<category><![CDATA[高階関数]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=8808</guid>

					<description><![CDATA[Python の組み込み関数である filter 関数を使って条件を満たす要素を抽出する方法を解説します。 filter 関数で条件を満たす要素を抽出する filter 関数は、関数と処理対象のイテラブルを受け取って、特 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python の組み込み関数である <span class="jinr-d--text-color d--marker1 d--bold"><code>filter</code> 関数を使って条件を満たす要素を抽出する方法</span>を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold"><code>filter</code> 関数で条件を満たす要素を抽出する</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><code>filter</code></span> 関数は、関数と処理対象のイテラブルを受け取って、特定の条件を満たす要素を抽出する Python の組み込み関数です。</p>



<p class="wp-block-paragraph">このように引数に関数を受け取る関数は<span class="jinr-d--text-color d--marker1 d--bold">高階関数</span>と言います。<code>for</code> 文でも同じ処理ができますが、繰り返し処理を書かずともシンプルに記載できる点がメリットです。</p>



<p class="wp-block-paragraph"><code>filter</code> 関数は、関数型プログラミング言語においてよく使用される代表的な関数です。Python はマルチパラダイムの言語と言われているため、厳密ではありませんが関数型プログラミングのスタイルもサポートしており、<code>filter</code> 関数が組み込み関数として利用できます。</p>



<p class="wp-block-paragraph">この記事では、リストの要素を関数で評価してフィルタする例を用いて、<span class="jinr-d--text-color d--marker1 d--bold"><code>filter</code> 関数の使い方の基本</span>を紹介します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>filter</code> 関数と同様に関数型プログラミングに関連のある関数として <code>map</code> 関数、<code>reduce</code> 関数、<code>partial</code> 関数があります。以下ページも参考にしてください。</p>



<ul class="wp-block-list jinr-list">
<li><a href="https://tech.nkhn37.net/python-map-basic/" target="_blank" rel="noreferrer noopener">map関数の使い方の基本 ~要素への関数適用~</a></li>



<li><a href="https://tech.nkhn37.net/python-reduce-basic/" target="_blank" rel="noreferrer noopener">reduce関数の使い方の基本 ~要素の畳み込み~</a></li>



<li><a href="https://tech.nkhn37.net/python-partial-basic/" target="_blank" rel="noreferrer noopener">partial関数の使い方の基本 ~関数の部分適用~</a></li>
</ul>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold"><code>filter</code> 関数の基本的な使い方</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><code>filter</code></span> 関数の基本的な構文は以下の通りです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">result = filter(関数, イテラブル)</pre>



<p class="wp-block-paragraph"><code>filter</code> 関数は、<code>イテラブル</code> の各要素に <code>関数</code> を適用し、条件を満たす要素を抽出（フィルタ）した結果のイテレータを返却します。フィルタされた結果は <code>next</code> を用いることで順に取り出したり、<code>for</code> 文で繰り返し取り出して使用したりすることができます。</p>



<p class="wp-block-paragraph">後述の例でも紹介しますが、<code>list(filter(関数, イテラブル))</code> のようにすることでリストに変換して取得することも可能です。ただし、大きなサイズのフィルタ結果の場合は、リストに変換しない方が効率的である場合もあるので注意して使用してください。</p>



<p class="wp-block-paragraph"><code>filter</code> 関数は条件を満たす要素の抽出が目的のため、<span class="jinr-d--text-color d--marker1 d--bold">引数に指定する<code>関数</code> は「与えられた要素に対して真偽を評価できる値を返却する必要がある」</span>点に注意してください。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox5 ">
			<i class="jif jin-ifont-v2speaker" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><strong>【真偽を評価できる値 (truthy / falsy)】</strong></p>



<p class="wp-block-paragraph">上記において「真偽を評価できる値」とは、<code>if</code> 文の条件式として使える値のことです。Python では、値を <code>True</code> / <code>False</code> として評価する仕組みがあり、<code>None</code> や <code>0</code>、空文字列 <code>""</code>、空のリスト <code>[]</code> などは <strong><code>False</code>（falsy）</strong> として扱われ、それ以外は <strong><code>True</code>（truthy）</strong> として扱われます。</p>
</div>
		</div></section>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">イテレータの基本は以下を参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://tech.nkhn37.net/python-iterator-basics/" target="_blank" rel="noreferrer noopener">イテレータ（iterator）の基本</a></p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">基本的な使い方</h4>



<p class="wp-block-paragraph"><code>filter</code> 関数の基本的な使い方を以下の例を用いて見ていきましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def is_even(num):
    """数値が偶数か判定する"""
    return num % 2 == 0


if __name__ == "__main__":
    tmp_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    # filter関数を適用し、イテレータを取得
    result = filter(is_even, tmp_list)
    print(result, "\n")

    # nextで1要素ずつ結果データを取得
    print(next(result))
    print(next(result))
    print(next(result))
    print(next(result))
    print(next(result))</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;filter object at 0x000001FA10FB45E0> 

2
4
6
8
10</pre>



<p class="wp-block-paragraph">例では、受け取った数値が偶数かどうかを判定する <code>is_even</code> 関数が定義されており、<code>tmp_list</code> の各要素が偶数かどうかをフィルタしています。</p>



<p class="wp-block-paragraph"><code>filter</code> 関数を呼び出している部分では「<code>filter(is_even, tmp_list)</code>」というように関数と処理対象のリストを渡しています。ここで、<span class="jinr-d--text-color d--marker1 d--bold">関数を渡す際には <code>()</code> をつけない</span>ことがポイントです。関数は <code>is_even(2)</code> のように <code>()</code> で引数を指定すると関数を実行することを意味しますが <code>()</code> がない場合は関数そのものを表します。<code>filter</code> 関数は、受け取った <code>is_even</code> という関数を内部で実行しているわけです。</p>



<p class="wp-block-paragraph">また、<code>filter</code> 関数は条件を満たす要素を抽出することが目的であるため、フィルタの判定ができるように <code>is_even</code> 関数は <code>True</code> / <code>False</code> を返却しています。</p>



<p class="wp-block-paragraph"><code>filter</code> 関数の返却値は「<code>filter object</code>」となっていますが、これはイテレータの一種です。<code>next</code> 関数を使用することで次の要素を順番に取得することができます。この例では、<code>tmp_list</code> の要素で偶数である数値が順に取得されていることが分かります。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">例で <code>next(result)</code> を再度実行すると <code>StopIteration</code> 例外が発生します。これは、イテレータがもう要素を持たない場合に発生する例外です。<code>StopIteration</code> は <code>for</code> の繰り返しの終了判定に使用されています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
Traceback (most recent call last):
...(省略)...
StopIteration</pre>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">リストやタプルで取得する方法</h4>



<p class="wp-block-paragraph"><code>filter</code> 関数の返却値はイテレータであるため、以下のように <code>list</code> や <code>tuple</code> に変換することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def is_even(num):
    """数値が偶数か判定する"""
    return num % 2 == 0


if __name__ == "__main__":
    tmp_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    # filter関数を適用し、リストで取得
    result = list(filter(is_even, tmp_list))
    print(result)

    # filter関数を適用し、タプルで取得
    result = tuple(filter(is_even, tmp_list))
    print(result)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[2, 4, 6, 8, 10]
(2, 4, 6, 8, 10)</pre>



<h4 class="wp-block-heading jinr-heading d--bold">関数に <code>None</code> を指定する方法</h4>



<p class="wp-block-paragraph"><code>filter</code> 関数では、<code>関数</code> として設定する引数に <code>None</code> を指定することが可能です。その場合は、フィルタ対象の要素が truthy である要素のみ抽出します。truthy とは、if 文で <code>True</code> と判定される値のことです。（<code>None</code> や <code>0</code>、空文字列 <code>""</code>、空のリスト <code>[]</code> などは <code>False</code> 扱いとなり抽出されません。）</p>



<p class="wp-block-paragraph">以下の例で確認してみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tmp_list = [0, 1, "", "Hello", [], [1, 2, 3], None, True, False]

# None を指定すると要素の truthy/falsy で判定される
result = list(filter(None, tmp_list))
print(result)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[1, 'Hello', [1, 2, 3], True]</pre>



<p class="wp-block-paragraph">例のように、関数として <code>None</code> を指定することで truthy となる値のみがフィルタできることが分かります。欠損値や空データをお手軽に取り除く方法として使用できます。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>filter(None, ...)</code> は、便利な方法ですが、<code>0</code> や <code>False</code> も除外されるため、想定外の結果にならないか十分に注意して使用してください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold">ラムダ関数（無名関数）と組み合わせる方法</h3>



<p class="wp-block-paragraph"><code>filter</code> 関数では、<span class="jinr-d--text-color d--marker1 d--bold">ラムダ関数（無名関数）</span>と組み合わせることで、より手軽に条件を満たす要素を抽出することができます。ラムダ関数は、関数定義を <code>def</code> で定義することなく、その場で作れるもので関数型プログラミングでは非常によく使われる概念です。</p>



<p class="wp-block-paragraph"><code>is_even</code> 関数をラムダ関数にして <code>filter</code> 関数で使う例を見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tmp_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# filter関数を適用し、リストで取得
result = list(filter(lambda x: x % 2 == 0, tmp_list))
print(result)

# filter関数を適用し、タプルで取得
result = tuple(filter(lambda x: x % 2 == 0, tmp_list))
print(result)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[2, 4, 6, 8, 10]
(2, 4, 6, 8, 10)</pre>



<p class="wp-block-paragraph">これまでの例で <code>is_even</code> と関数を指定していた部分に「<code>lambda x: x % 2 == 0</code>」というラムダ関数を指定しています。結果は <code>is_even</code> 関数を使った場合と同じです。</p>



<p class="wp-block-paragraph">ラムダ関数は無名関数ともいわれる通り、関数名はありませんが、そのものが関数として扱われるため、<code>filter</code> 関数に渡すことでリストの各要素に関数を適用してフィルタした結果を取得できます。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">ラムダ関数の基本については以下を参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://tech.nkhn37.net/python-lambda/" target="_blank" rel="noreferrer noopener">ラムダ（lambda）関数：無名関数の使い方</a></p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python の組み込み関数である <span class="jinr-d--text-color d--marker1 d--bold"><code>filter</code> 関数を使って条件を満たす要素を抽出する方法</span>を解説しました。</p>



<p class="wp-block-paragraph"><code>filter</code> 関数は、関数と処理対象のイテラブルを受け取って、特定の条件を満たす要素を抽出する Python の組み込み関数です。<code>filter</code> 関数は他の関数型プログラミング言語でもよく使用される代表的な関数で Python でも使用できます。</p>



<p class="wp-block-paragraph"><code>filter</code> 関数は <code>for</code> 文を用いなくてもシンプルに関数で条件判定するフィルタ処理ができることが特徴です。</p>



<p class="wp-block-paragraph">非常に強力な機能ではありますが、<code>filter</code> 関数の適用が常に最適な選択というわけではありません。場合によっては <code>for</code> 文で書いた方が可読性が上がる可能性もあります。目的に応じて適切に方法を選択できるよう <code>filter</code> 関数の使い方を理解しておくようにしましょう。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/filter" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-filter-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】map関数の使い方の基本 ~要素への関数適用~</title>
		<link>https://tech.nkhn37.net/python-map-basic/</link>
					<comments>https://tech.nkhn37.net/python-map-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Wed, 23 Aug 2023 20:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[高階関数]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=8806</guid>

					<description><![CDATA[Python の組み込み関数の map 関数を使って要素へ関数を適用する方法を解説します。 map 関数で要素へ関数を適用する map 関数は、関数と処理対象のイテラブルを受け取って、イテラブルの各要素に関数を適用した結 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python の組み込み関数の <span class="marker"><strong><code>map</code> 関数を使って要素へ関数を適用する方法</strong></span>を解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold"><code>map</code> 関数で要素へ関数を適用する</h2>



<p class="wp-block-paragraph"><span class="marker"><strong><code>map</code></strong></span> 関数は、関数と処理対象のイテラブルを受け取って、イテラブルの各要素に関数を適用した結果を返す Python の組み込み関数です。</p>



<p class="wp-block-paragraph">このように引数に関数を受け取る関数は<span class="marker"><strong>高階関数</strong></span>と言います。<code>for</code> 文で処理しても同じ処理ができますが、繰り返し処理を書かずにシンプルに記載できる点がメリットです。</p>



<p class="wp-block-paragraph"><code>map</code> 関数は、関数型プログラミング言語において中心的な関数です。Python はマルチパラダイムの言語と言われているため、厳密ではありませんが関数型のプログラミングスタイルもサポートしており、<code>map</code> 関数が組み込み関数として利用できます。</p>



<p class="wp-block-paragraph">本記事では、リストの要素へ関数を適用する例を用いて、<span class="marker"><strong><code>map</code> 関数の使い方の基本</strong></span>を紹介します。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>map</code> 関数と同様に関数型プログラミングに関連のある関数として <code>filter</code> 関数、<code>reduce</code> 関数、<code>partial</code> 関数があります。以下ページも参考にしてください。</p>



<ul class="wp-block-list jinr-list">
<li><a href="https://tech.nkhn37.net/python-filter-basic/" target="_blank" rel="noreferrer noopener">filter関数の使い方の基本 ~条件を満たす要素を抽出~</a></li>



<li><a href="https://tech.nkhn37.net/python-reduce-basic/" target="_blank" rel="noreferrer noopener">reduce関数の使い方の基本 ~要素の畳み込み~</a></li>



<li><a href="https://tech.nkhn37.net/python-partial-basic/" target="_blank" rel="noreferrer noopener">partial関数の使い方の基本 ~関数の部分適用~</a></li>
</ul>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold"><code>map</code> 関数の基本的な使い方</h3>



<p class="wp-block-paragraph"><span class="marker"><strong><code>map</code></strong></span> 関数の基本的な構文は以下のようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">result = map(関数, イテラブル)</pre>



<p class="wp-block-paragraph">複数の引数を取る関数を指定する場合には、以下のようにイテラブルを列挙して指定することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">result = map(関数, イテラブル1, イテラブル2, ...)</pre>



<p class="wp-block-paragraph"><code>map</code> 関数では、イテラブルの各要素に関数を適用した結果のイテレータを返却します。イテレータは値を逐次取り出せるオブジェクトで、<code>next</code>を用いることで順に関数を適用した値を取り出したり、<code>for</code> 文で使用したりすることができます。後述の例でも見ますが、<code>list(map(関数, イテラブル))</code> のようにすることでリストに変換して取得することも可能です。</p>



<p class="wp-block-paragraph">また、<code>map(関数, イテラブル1, イテラブル2, ...)</code>というように複数のイテラブルを渡す場合には、関数は引数としてイテラブルの数だけ受け取れる必要があります。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">イテレータの基本は以下を参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://tech.nkhn37.net/python-iterator-basics/" target="_blank" rel="noreferrer noopener">イテレータ（iterator）の基本</a></p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">基本的な使い方</h4>



<p class="wp-block-paragraph"><code>map</code> 関数の基本的な使い方を以下の例を用いて見ていきましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def square(x):
    """値を2乗する"""
    return x**2


if __name__ == "__main__":
    tmp_list = [1, 2, 3, 4, 5]

    # map関数を適用し、イテレータを取得
    result = map(square, tmp_list)
    print(result, "\n")

    # nextで1要素ずつ結果データを取得
    print(next(result))
    print(next(result))
    print(next(result))
    print(next(result))
    print(next(result))</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;map object at 0x0000018E82BC2A70> 

1
4
9
16
25</pre>



<p class="wp-block-paragraph">上記の例では、受け取った値を 2 乗する <code>square</code> という関数が定義されており、<code>tmp_list</code> の各要素に適用しています。</p>



<p class="wp-block-paragraph"><code>map</code> 関数を呼び出している部分では「<code>map(square, tmp_list)</code>」というように関数と処理対象のリストを渡しています。ここで<span class="marker"><strong>ポイントは、関数を渡す際に <code>()</code> がない</strong></span>ことです。関数は <code>square(2)</code> のように <code>()</code> で引数を指定すると関数を実行することを意味しますが、<code>()</code> がない場合は関数そのものを表します。<code>map</code> 関数は、受け取った <code>square</code> という関数を内部で実行しているわけです。</p>



<p class="wp-block-paragraph"><code>map</code> 関数の返却値は「<code>map object</code>」となっていますが、これはイテレータの一種です。<code>next</code> 関数を使用することで次の要素を順番に取得することができます。この例では、<code>tmp_list</code> の要素それぞれを2乗した結果が順に取得されていることが分かります。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">上記例で <code>next(result)</code> を追加して再度実行すると <code>StopIteration</code> 例外が発生します。これはイテレータがもう要素を持たない場合に発生する例外です。<code>StopIteration</code> は <code>for</code> ループ等の繰り返しの終了を判断するために使用されています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
Traceback (most recent call last):
...(省略)...
StopIteration</pre>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">リストやタプルで取得する場合</h4>



<p class="wp-block-paragraph"><code>map</code> 関数の返却値はイテレータであるため、以下のように <code>list</code> や <code>tuple</code> に変換することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def square(x):
    """値を2乗する"""
    return x**2


if __name__ == "__main__":
    tmp_list = [1, 2, 3, 4, 5]

    # map関数を適用し、リストで取得
    result_list = list(map(square, tmp_list))
    print(result_list)

    # map関数を適用し、タプルで取得
    result_tuple = tuple(map(square, tmp_list))
    print(result_tuple)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[1, 4, 9, 16, 25]
(1, 4, 9, 16, 25)</pre>



<h4 class="wp-block-heading jinr-heading d--bold">複数イテラブルを指定する場合</h4>



<p class="wp-block-paragraph"><code>map</code> 関数は複数のイテラブルを受け取り、それらに対してまとめて関数を適用することができます。以下の例では、<code>make_variable_set</code> という関数が 3 つの引数を受け取り、それらをタプルとして返す動作をします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def make_variable_set(x, y, z):
    """各引数を並べたタプルを返却する"""
    return x, y, z


if __name__ == "__main__":
    nums1 = [1, 2, 3]
    nums2 = [4, 5, 6]
    nums3 = [7, 8, 9]

    # map関数で複数のイテラブルを渡す
    # 関数側もイテラブルの数だけの引数を受け取れる必要がある
    result = list(map(make_variable_set, nums1, nums2, nums3))
    print(result)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]</pre>



<p class="wp-block-paragraph">この結果を見ると、3 つのリストの各要素が関数によってタプルとしてまとめられて返されていることが確認できます。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--heading-iconbox1 ">
			<div class="a--heading-iconbox-title">
			<div class="a--iconbox-title-icon"><i class="jif jin-ifont-caution" aria-hidden="true"></i></div>
			<div class="a--iconbox-title-text">注意点</div>
			</div>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><code>map(関数, イテラブル1, イテラブル2, ...)</code> というように複数のイテラブルを渡す場合、関数は指定するイテラブルの数だけ引数を受け取ることができるように設計されている必要があります。</p>
</div>
		</div></section>



<h4 class="wp-block-heading jinr-heading d--bold">複数のイテラブルの要素数が異なる場合</h4>



<p class="wp-block-paragraph"><code>map</code> 関数を使用する際、複数のイテラブルを指定することができますが、それらの要素数が異なる場合の挙動に注意が必要です。</p>



<p class="wp-block-paragraph">具体的には、<code>map</code> 関数は、<span class="marker"><strong>最も短いイテラブルの要素数に合わせて</strong></span>処理を行います。これは最も短いイテラブルが終了した時点で、他のイテラブルの残りの要素は無視されることを意味します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def make_variable_set(x, y, z):
    """各引数を並べたタプルを返却する"""
    return x, y, z


if __name__ == "__main__":
    nums1 = [1, 2, 3]
    nums2 = [4, 5, 6, 7, 8, 9]
    nums3 = [10, 11, 12, 13, 14]

    # map関数で複数のイテラブルを渡す
    # 最も短いイテラブルが消費されたら終了
    result = list(map(make_variable_set, nums1, nums2, nums3))
    print(result)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[(1, 4, 10), (2, 5, 11), (3, 6, 12)]</pre>



<p class="wp-block-paragraph">この例では、3 つの要素を使用していますが、最も短いイテラブルである <code>nums1</code> に合わせて処理が行われるため、<code>nums2</code> の <code>7</code>、<code>8</code>、<code>9</code> や <code>nums3</code> の <code>13</code>、<code>14</code> については結果に含まれていないことが分かります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ラムダ関数（無名関数）と組み合わせる場合</h4>



<p class="wp-block-paragraph"><code>map</code> 関数は、<span class="marker"><strong>ラムダ関数（無名関数）</strong></span>と組み合わせることで、より手軽に要素に対して関数を適用することができます。ラムダ関数は、関数定義を <code>def</code> で定義することなく、その場で作れるもので関数型プログラミングでは中核の概念です。</p>



<p class="wp-block-paragraph"><code>square</code> 関数をラムダ関数にして <code>map</code> 関数で使う例を見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tmp_list = [1, 2, 3, 4, 5]

# map関数を適用し、リストで取得
result = list(map(lambda x: x**2, tmp_list))
print(result)

# map関数を適用し、タプルで取得
result = tuple(map(lambda x: x**2, tmp_list))
print(result)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
[1, 4, 9, 16, 25]
(1, 4, 9, 16, 25)</pre>



<p class="wp-block-paragraph">これまでの例で <code>square</code> と関数を指定していた部分に「<code>lambda x: x**2</code>」というラムダ関数を指定しています。結果は <code>square</code> 関数を使った場合と同じす。</p>



<p class="wp-block-paragraph">ラムダ関数は無名関数ともいわれる通り、関数名はありませんが、そのものが関数として扱われるため、<code>map</code> 関数に渡すことでリストの各要素に関数を適用できます。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox6 ">
			<i class="jif jin-ifont-v2books" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">ラムダ関数の基本については以下を参考にしてください。</p>



<p class="wp-block-paragraph"><a href="https://tech.nkhn37.net/python-lambda/" target="_blank" rel="noreferrer noopener">ラムダ（lambda）関数：無名関数の使い方</a></p>
</div>
		</div></section>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python の組み込み関数である <span class="marker"><strong><code>map</code> 関数を使って要素へ関数を適用する方法</strong></span>を解説しました。</p>



<p class="wp-block-paragraph"><code>map</code> 関数は、関数と処理対象のイテラブルを受け取って、イテラブルの各要素に関数を適用した結果を返す Python の組み込み関数です。<code>map</code> 関数は他の関数型プログラミング言語でも中心的な関数で Python でも使用できます。</p>



<p class="wp-block-paragraph"><code>map</code> 関数は <code>for</code> 文を用いなくてもシンプルに関数の適用ができることが特徴です。非常に強力な機能ではありますが、<code>map</code> 関数の適用が常に最適な選択というわけではありません。</p>



<p class="wp-block-paragraph">場合によっては <code>for</code> 文で書いた方が可読性が上がる可能性もあります。目的に応じて適切に方法を選択できるよう <code>map</code> 関数の使い方を理解しておくようにしましょう。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/map" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-map-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】デコレータの基本的な使い方</title>
		<link>https://tech.nkhn37.net/python-decorator/</link>
					<comments>https://tech.nkhn37.net/python-decorator/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Wed, 03 Feb 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[decorator]]></category>
		<category><![CDATA[クロージャ]]></category>
		<category><![CDATA[デコレーター]]></category>
		<category><![CDATA[高階関数]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=585</guid>

					<description><![CDATA[Python のデコレータの基本的な使い方について解説します。 デコレータ（decorator） デコレータとは、関数に機能を追加するための仕組みです。例えば、関数の実行時間を計測したり、ログを出力したりするなど、関数に [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Python の<span class="jinr-d--text-color d--marker1 d--bold">デコレータ</span>の基本的な使い方について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="デコレータ-decorator">デコレータ（decorator）</h2>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold">デコレータ</span>とは、関数に機能を追加するための仕組みです。例えば、関数の実行時間を計測したり、ログを出力したりするなど、関数に依存しない汎用的な機能を簡単に付加できます。「飾る・装飾する」という意味から、デコレータは関数を装飾して機能を追加するものと理解してください。</p>



<p class="wp-block-paragraph">この記事では、Python のデコレータの基本的な使い方について紹介します。また、理解を深めるために高階関数やクロージャについても説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="デコレータを使わない場合-高階関数での機能拡張">高階関数とクロージャ</h3>



<p class="wp-block-paragraph">デコレータは「<span class="jinr-d--text-color d--marker1 d--bold">高階関数での機能の拡張をシンプルに表現する記法</span>」とも言えます。理解を助けるために、高階関数とクロージャについて説明します。</p>



<ul class="wp-block-list jinr-list">
<li>高階関数：関数を引数や戻り値として扱う関数</li>



<li>クロージャ：上位のスコープの変数を保持する関数</li>
</ul>



<p class="wp-block-paragraph">以下の例では、高階関数を用いて、<code>sum_range_value</code> 関数に「実行時間を計測する機能」を追加しています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import time


def measure_execution_time(func):
    def wrapper(*args, **kwargs):
        # 処理前の時刻を設定
        timer_start = time.time()
        # 対象関数の実行
        result = func(*args, **kwargs)
        # 処理後の時刻を設定
        timer_end = time.time()
        # 処理時間を計算
        elapsed_time = timer_end - timer_start
        print(f"処理実行時間: {elapsed_time} sec")
        return result

    return wrapper


def sum_range_value(start, end, step=1):
    result = 0
    for i in range(start, end + 1, step):
        result += i
    return result


def main():
    measure_func = measure_execution_time(sum_range_value)
    sum_value = measure_func(1, 1000000)
    print(sum_value)


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果例】
処理実行時間: 0.044879913330078125 sec
500000500000</pre>



<p class="wp-block-paragraph"><code>measure_execution_time</code> 関数は、関数を引数として受け取り、<code>wrapper</code> 関数を返却します。このように、関数自体を引数や戻り値に持つ関数を<span class="jinr-d--text-color d--marker1 d--bold">高階関数</span>と言います。</p>



<p class="wp-block-paragraph">また、<code>wrapper</code> 関数は、<code>measure_execution_time</code> の引数である <code>func</code> を保持したまま返されるため、これを<span class="jinr-d--text-color d--marker1 d--bold">クロージャ</span>と呼びます。</p>



<p class="wp-block-paragraph">呼び出しの流れでは <code>measure_execution_time(sum_range_value)</code> により <code>sum_range_value</code> が <code>func</code> に渡され、<code>wrapper</code> にセットされた状態で <code>measure_func</code> に返されます。<code>measure_func</code> は、<code>wrapper</code> 関数であり、その内部で <code>func(*args, **kwargs)</code> として元の <code>sum_range_value</code> が実行されます。</p>



<p class="wp-block-paragraph">このように、高階関数によって関数の機能拡張を行うことができます。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox5 ">
			<i class="jif jin-ifont-v2speaker" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph">高階関数とクロージャは、関数型言語（例えば、Haskell や Scala など）を学ぶときによく登場する概念です。興味があれば関数型プログラミングも学んでみてください。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold" id="デコレータの使い方">デコレータの使い方</h3>



<p class="wp-block-paragraph">高階関数による機能拡張は、デコレータを使うことで簡単に実現できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import time
from functools import wraps


def measure_execution_time(func):
    """時間計測デコレータ関数

    Args:
        func: 対象関数

    Returns:
        wrapper関数
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        """内部ラッパー関数"""
        # 処理前の時刻を設定
        timer_start = time.time()
        # 対象関数の実行
        result = func(*args, **kwargs)
        # 処理後の時刻を設定
        timer_end = time.time()
        # 処理時間を計算
        elapsed_time = timer_end - timer_start
        print(f"処理実行時間: {elapsed_time} sec")
        return result

    return wrapper


@measure_execution_time
def sum_range_value(start, end, step=1):
    """範囲内の数値を合計する関数

    Args:
        start: 開始数値
        end: 終了数値
        step: ステップ値

    Returns:
        合計結果
    """
    result = 0
    for i in range(start, end + 1, step):
        result += i
    return result


def main():
    sum_value = sum_range_value(1, 1000000)
    print(sum_value)
    print(f"\ndocstring:\n{sum_range_value.__doc__}")


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果例】
処理実行時間: 0.03454852104187012 sec
500000500000

docstring:
範囲内の数値を合計する関数

    Args:
        start: 開始数値
        end: 終了数値
        step: ステップ値

    Returns:
        合計結果</pre>



<p class="wp-block-paragraph">デコレータは関数定義の上に「<span class="jinr-d--text-color d--marker1 d--bold"><code>@デコレータ名</code></span>」と記述します。例えば <code>@measure_execution_time</code> とすることで <code>sum_range_value</code> 関数に実行時間の計測機能が付加されます。</p>



<p class="wp-block-paragraph">このようにデコレータを使うことで関数の機能拡張が簡単に行えます。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="デコレータ使用時の注意事項-メタ情報の保持">デコレータ使用時の注意事項（メタ情報の保持）</h3>



<p class="wp-block-paragraph">デコレータを使用する際、オリジナル関数のメタ情報（docstringなど）が失われることがあります。この問題は <code>functools</code> の <code>@wraps</code> デコレータで解決できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">@wraps(func)
def wrapper(*args, **kwargs):</pre>



<p class="wp-block-paragraph"><code>@wraps</code> デコレータを使用しない場合、メタ情報が以下のように <code>wrapper</code> 関数のものになってしまいますので注意が必要です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
内部ラッパー関数</pre>



<p class="wp-block-paragraph">上記については「<a href="https://www.amazon.co.jp/exec/obidos/asin/4048930842/nkhn37net04-22/" target="_blank" rel="noreferrer noopener"></a><strong>エキスパートPythonプログラミング</strong>」という書籍に記載があります。Python 応用編として色々な知見が得られますので参考にしてみてください。</p>





<h3 class="wp-block-heading jinr-heading d--bold" id="複数のデコレータを重ねて使用する">複数のデコレータを重ねて使用する</h3>



<p class="wp-block-paragraph">デコレータは、複数重ねて使用ができます。以下は、<code>measure_execution_time</code> に加えて、関数名と引数情報を表示する <code>show_function_info</code> デコレータを追加した例です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import time
from functools import wraps


def measure_execution_time(func):
    """時間計測デコレータ関数

    Args:
        func: 対象関数

    Returns:
        wrapper関数
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        """内部ラッパー関数"""
        # 処理前の時刻を設定
        timer_start = time.time()
        # 対象関数の実行
        result = func(*args, **kwargs)
        # 処理後の時刻を設定
        timer_end = time.time()
        # 処理時間を計算
        elapsed_time = timer_end - timer_start
        print(f"処理実行時間: {elapsed_time} sec")
        return result

    return wrapper


def show_function_info(func):
    """関数情報表示用デコレータ関数

    Args:
        func: 対象関数

    Returns:
        wrapper関数
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        """内部ラッパー関数"""
        print("--------------------------------------------------------------")
        print(f"Name: {func.__name__}")
        print(f"args: {args}")
        print(f"kwargs: {kwargs}")
        print("--------------------------------------------------------------")
        return func(*args, **kwargs)

    return wrapper


@measure_execution_time
@show_function_info
def sum_range_value(start, end, step=1):
    result = 0
    for i in range(start, end + 1, step):
        result += i
    return result


def main():
    sum_val = sum_range_value(1, 1000000)
    print(sum_val)


if __name__ == "__main__":
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果例】
--------------------------------------------------------------
Name: sum_range_value
args: (1, 1000000)
kwargs: {}
--------------------------------------------------------------
処理実行時間: 0.044873714447021484 sec
500000500000</pre>



<p class="wp-block-paragraph">デコレータを複数適用する場合、上から順に適用され数学の合成関数のように <code>measure_execution_time(show_func_info(sum_range_value))</code> となります。</p>



<p class="wp-block-paragraph">このように、複数のデコレータを重ねることで関数の拡張が簡単に表現できます。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python の<span class="jinr-d--text-color d--marker1 d--bold">デコレータ</span>の基本的な使い方について解説しました。また、デコレータの理解の助けとなる<span class="jinr-d--text-color d--marker1 d--bold">高階関数</span>と<span class="jinr-d--text-color d--marker1 d--bold">クロージャ</span>に関する考え方も紹介しています。</p>



<p class="wp-block-paragraph">デコレータは「<code>@デコレータ名</code>」という表記を関数に付与するだけで簡単に関数に機能を付与することが可能です。ただし、<code>functools</code> の <code>@wraps</code> デコレータを使用しない場合、docstring などのメタ情報が内部関数のものになるので注意してください。</p>



<p class="wp-block-paragraph">デコレータは、関数に対して汎用的な機能拡張を行う際に非常に便利な方法です。ぜひ使い方を覚えて活用してみてください。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/function/decorator" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-decorator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】lambda（ラムダ式、無名関数）の使い方</title>
		<link>https://tech.nkhn37.net/python-lambda/</link>
					<comments>https://tech.nkhn37.net/python-lambda/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Tue, 02 Feb 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[ラムダ式]]></category>
		<category><![CDATA[無名関数]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=581</guid>

					<description><![CDATA[Pythonの　lambda の使い方 の基本について解説します。lambda は、ラムダ式、無名関数とも呼ばれます。 lambda（ラムダ式、無名関数） Pythonの lambda は、名前のない関数を簡単に作成する [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonの　<span class="jinr-d--text-color d--marker1 d--bold"><code>lambda</code> の使い方</span> の基本について解説します。<code>lambda</code> は、ラムダ式、無名関数とも呼ばれます。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="ラムダ-lambda-関数-無名関数"><code>lambda</code>（ラムダ式、無名関数）</h2>



<p class="wp-block-paragraph">Pythonの <span class="jinr-d--text-color d--marker1 d--bold"><code>lambda</code></span> は、名前のない関数を簡単に作成するための構文です。名前がないため<strong>無名関数</strong>と呼ばれ、式として使えるため<strong>ラムダ式</strong>とも呼ばれます。</p>



<p class="wp-block-paragraph"><code>lambda</code> は、関数を第 1 級オブジェクトとして扱う関数型プログラミングのパラダイムに基づいており、Python はこの考え方を取り入れています。第 1 級オブジェクトとは、変数に代入したり、関数の引数や戻り値として使えるオブジェクトを言います。</p>



<p class="wp-block-paragraph"><code>lambda</code> を使うメリットには以下の通りです。</p>



<ul class="wp-block-list jinr-list">
<li>小さな関数を <code>def</code> で宣言する必要がありません。</li>



<li>関数名の衝突を防げます。</li>



<li>1 行で記述ができ、コードがシンプルになります。</li>



<li>高階関数の引数として使用できます。</li>
</ul>



<p class="wp-block-paragraph">この記事では、<code>lambda</code> の使い方の基本を紹介していきます。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="ラムダ-lambda-関数の使い方"><code>lambda</code> の使い方</h3>



<p class="wp-block-paragraph"><span class="jinr-d--text-color d--marker1 d--bold"><code>lambda</code></span> は、以下のように定義して使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">lambda 引数1, 引数2, … : 返却値の計算式</pre>



<p class="wp-block-paragraph"><code>lambda</code> の後に受け取る引数を列挙し、<code>:</code> の後ろに返却値の計算式を記述します。例えば「<code>lambda x, y: x + y</code>」とすると <code>x</code> と <code>y</code> を足した結果を返すことを意味します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">基本的な使用方法</h4>



<p class="wp-block-paragraph">以下の簡単な使用例で <code>lambda</code> の使い方を確認しましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># lambda function
func = lambda val1, val2: val1 * 2 + val2 * 2

print(type(func))
print(func(1, 2))
print(func(3, 4))</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;class 'function'>
6
14</pre>



<p class="wp-block-paragraph">上記の <code>lambda</code> は、<code>val1</code> と <code>val2</code> をそれぞれ <code>2</code> 倍して足した値を返却する関数です。</p>



<p class="wp-block-paragraph"><code>lambda</code> の返却値の <code>func</code> は <code>&lt;class 'function'></code> であり <code>function</code> クラスのオブジェクトです。このように Python では、関数も 1 つのオブジェクトとして扱います。</p>



<p class="wp-block-paragraph"><code>function</code> オブジェクトである <code>func</code> は「<code>func(1, 2)</code>」のように <code>()</code> で引数を受け取ることで、関数を実行した値を返却することができます。</p>



<h4 class="wp-block-heading jinr-heading d--bold" id="ラムダ-lambda-関数を使用することのメリット"><code>lambda</code> を使用するメリット</h4>



<p class="wp-block-paragraph"><code>lambda</code> の使い方を紹介しましたが <code>def</code> で定義しても同じと思うかもしれません。<code>lambda</code> のメリットの 1 つは小さな関数をシンプルにその場で作成できる点です。</p>



<p class="wp-block-paragraph">以下の例で見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def sum_func_value(val_list1, val_list2, func):
    ret = []
    for v1, v2 in zip(val_list1, val_list2):
        ret.append(func(v1, v2))
    return ret


def main():
    l1 = [1, 2, 3, 4, 5]
    l2 = [6, 7, 8, 9, 10]

    ret_list1 = sum_func_value(l1, l2, lambda val1, val2: val1 + val2)
    print(f'ret_list1 = {ret_list1}')

    ret_list2 = sum_func_value(l1, l2, lambda val1, val2: 2 * val1 + 2 * val2)
    print(f'ret_list2 = {ret_list2}')

    ret_list3 = sum_func_value(l1, l2, lambda val1, val2: 3 * val1 + 3 * val2)
    print(f'ret_list3 = {ret_list3}')


if __name__ == '__main__':
    main()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
ret_list1 = [7, 9, 11, 13, 15]
ret_list2 = [14, 18, 22, 26, 30]
ret_list3 = [21, 27, 33, 39, 45]</pre>



<p class="wp-block-paragraph">上記の <code>sum_func_value</code> 関数は、受け取った 2 つのリストの各要素に対して <code>func</code> で指定された関数を適用したリストを返却する関数です。</p>



<p class="wp-block-paragraph">呼び出し時には <code>lambda</code> によってリストの各要素に対してどのような計算をさせるのかを定義して関数として渡しています。もし、この関数を <code>def</code> で定義する場合、似たような関数をたくさん定義し、それぞれに関数名をつける必要があります。</p>



<p class="wp-block-paragraph">このような小さな関数をその場で定義して使用するには <code>lambda</code> は非常に有用です。なお、<code>sum_func_value</code> 関数のように引数に関数を受け取る関数を<strong>高階関数</strong>と呼びます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">リストのソート条件を <code>lambda</code> で指定する</h4>



<p class="wp-block-paragraph"><code>lambda</code> のよくある使用例は、リストのソート条件を <code>lamba</code> で指定する方法です。<code>lambda</code> を <code>sort</code> や <code>sorted</code> の <code>key</code> 引数に指定して、カスタムのソート条件を指定できます。</p>



<p class="wp-block-paragraph">具体的には「<a href="https://tech.nkhn37.net/python-list-sort/" target="_blank" rel="noreferrer noopener">リストのソート方法</a>」内で紹介しているので参考にしてください。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python の <span class="jinr-d--text-color d--marker1 d--bold"><code>lambda</code> の使い方</span> の基本について解説しました。</p>



<p class="wp-block-paragraph"><code>lambda</code> は、名前のない関数をその場で簡単に作成するための構文です。名前がないため<strong>無名関数</strong>と呼ばれ、式として使えるため<strong>ラムダ式</strong>とも呼ばれます。</p>



<p class="wp-block-paragraph"><code>lambda</code> は、小さな関数を宣言することなく使用できるため、コードをシンプルに記述できるメリットがあります。また、高階関数の引数として使用するなど便利な使い方ができます。ぜひ、<code>lambda</code> を使いこなせるようになってもらえたらと思います。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードは <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/function/lambda" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】ジェネレータ関数とジェネレータの基本</title>
		<link>https://tech.nkhn37.net/python-generator-yield/</link>
					<comments>https://tech.nkhn37.net/python-generator-yield/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[yield]]></category>
		<category><![CDATA[ジェネレータ]]></category>
		<category><![CDATA[ジェネレータ内包表記]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=583</guid>

					<description><![CDATA[Pythonのジェネレータ関数とジェネレータの基本について解説します。 ジェネレータ関数とジェネレータ Pythonにおけるジェネレータ関数とは、yield 文を使って値を返却する関数であり、その実行によってジェネレータ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonの<span class="marker"><strong>ジェネレータ関数とジェネレータの基本</strong></span>について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="ジェネレータ-generator-関数">ジェネレータ関数とジェネレータ</h2>



<p class="wp-block-paragraph">Pythonにおける<span class="marker"><strong>ジェネレータ関数</strong></span>とは、<span class="marker"><strong><code>yield</code></strong></span> 文を使って値を返却する関数であり、その実行によって<span class="marker"><strong>ジェネレータ</strong></span>というオブジェクトが作成されます。ジェネレータはイテレータの一種であり、逐次的に値を生成して返すオブジェクトのことを言います。なお、イテレータについては「<a href="https://tech.nkhn37.net/python-iterator-basics/" target="_blank" rel="noreferrer noopener">イテレータの基本</a>」を参考にしてください。</p>



<p class="wp-block-paragraph">このため、ジェネレータを使うとシーケンス全体をメモリ上に展開せず、無限のシーケンスであっても必要な時に必要な値だけを生成することができ、メモリ使用量を大幅に削減できます。</p>



<p class="wp-block-paragraph">この記事では、ジェネレータ関数とジェネレータについて基本の使い方を紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="ジェネレーター関数の定義方法-yieldによる返却">ジェネレータ関数の定義方法</h3>



<p class="wp-block-paragraph">ジェネレータ関数は、通常の関数とほぼ同じ定義方法ですが、<code>return</code> 文の代わりに <span class="marker"><strong><code>yield</code></strong></span> 文を使用します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ジェネレータ関数
def generate_char():
    yield "A"
    yield "B"
    yield "C"


if __name__ == "__main__":
    gen = generate_char()
    print(type(gen))

    # Aが出力される
    print(next(gen))
    # Bが出力される
    print(next(gen))
    # Cが出力される
    print(next(gen))</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;class 'generator'>
A
B
C</pre>



<p class="wp-block-paragraph">上記の<code>generate_char</code>関数は、<code>"A"</code>、<code>"B"</code>、<code>"C"</code>という文字列を順に返すジェネレータ関数です。<code>gen</code>はジェネレータのオブジェクト（<code>&lt;class 'generator'&gt;</code>）となります。</p>



<p class="wp-block-paragraph">ジェネレータはイテレータの一種であり、<code>__next__()</code>メソッドが実装されているため、<code>next</code>関数を使って順番に値を取り出せます。</p>



<p class="wp-block-paragraph">ジェネレータ関数は<code>yield</code>文まで実行され、その位置を記憶します。次に呼び出されると、その位置から実行を再開します。例えば、最初の呼び出しでは<code>yield "A"</code>が実行され、次の呼び出しでは<code>yield "B"</code>が実行されます。</p>



<p class="wp-block-paragraph"><code>yield "C"</code>までが実行され、さらに次の呼び出しで返す値がなくなると、ジェネレータは、<code>StopIteration</code>例外を送出します。</p>



<p class="wp-block-paragraph">ジェネレータはイテレータの一種のため<code>for</code>文で使用できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ジェネレータ関数
def generate_char():
    yield "A"
    yield "B"
    yield "C"


if __name__ == "__main__":
    # for文でのジェネレータ関数の使用
    for s in generate_char():
        print(s)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
A
B
C</pre>



<p class="wp-block-paragraph">上記結果のようにジェネレータが生成する値（<code>"A"</code>、<code>"B"</code>、<code>"C"</code>）を順に取り出せていることが分かります。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="range関数と同じ処理を自分で書いてみる"><code>range</code> をジェネレータ関数で実現する</h3>



<p class="wp-block-paragraph">Pythonの<code>for</code>文では、数値シーケンスの生成に<code>range</code>をよく使用します。<code>range</code>はジェネレータ関数として実現されています。</p>



<p class="wp-block-paragraph">ジェネレータ関数の使用方法を覚えるために<code>range</code>と同じ動作をするジェネレータ関数を作ってみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ジェネレータ関数でrangeと同じ動作を実現
def sample_range(start=0, stop=10, step=1):
    num = start
    while num &lt; stop:
        yield num
        num += step


if __name__ == "__main__":
    iter_range = sample_range(0, 5)
    print(type(iter_range))
    print(next(iter_range))
    print(next(iter_range))
    print(next(iter_range))

    print("======================")
    for i in iter_range:
        print(i)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;class 'generator'>
0
1
2
======================
3
4</pre>



<p class="wp-block-paragraph">上記の<code>sample_range</code>関数は、<code>range</code>と同じ動作をするジェネレータ関数です。<code>iter_range</code>は、ジェネレータのオブジェクト（<code>&lt;class 'generator'&gt;</code>）となっています。</p>



<p class="wp-block-paragraph">そのため、<code>next</code>で値を順に取り出せていることが分かります。また、途中で「<code>"==="</code>」のような<code>print</code>の中断を入れていますが、次の呼び出しでは後続の値から取り出しができていることが分かります。</p>



<p class="wp-block-paragraph">ジェネレータ関数を使用することで、一度にメモリ上に展開できないような無限に続くような数列なども実現可能になります。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="ジェネレータ内包表記">ジェネレータ内包表記</h2>



<p class="wp-block-paragraph">ジェネレータは、ジェネレータ内包表記というシンプルな記載方法でも生成することができます。ジェネレータ内包表記については「<a href="https://tech.nkhn37.net/python-generator-comprehension/" target="_blank" rel="noreferrer noopener">ジェネレータ内包表記の使い方</a>」を参考にしてください。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Pythonの<span class="marker"><strong>ジェネレータ関数とジェネレータの基本</strong></span>について解説しました。</p>



<p class="wp-block-paragraph">ジェネレータ関数は、<code>yield</code> 文を使って値を返却する関数であり、ジェネレータオブジェクトを作成します。ジェネレータはイテレータの一種なので逐次的に値を生成することができます。この記事では、ジェネレータ関数の定義方法の例とジェネレータの使用例を紹介しました。</p>



<p class="wp-block-paragraph">ジェネレータは一度にメモリ上に展開できないような無限に続くシーケンスを扱うこともできて便利です。ぜひ、使い方を覚えてもらいたいと思います。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードは <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/function/generator" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-generator-yield/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】ジェネレータ内包表記の使い方</title>
		<link>https://tech.nkhn37.net/python-generator-comprehension/</link>
					<comments>https://tech.nkhn37.net/python-generator-comprehension/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Mon, 01 Feb 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[ジェネレータ]]></category>
		<category><![CDATA[内包表記]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=633</guid>

					<description><![CDATA[Pythonのジェネレータ内包表記（generator comprehension）の使い方について解説します。 ジェネレータ内包表記（generator comprehension） Pythonにおけるジェネレータ内 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonの<span class="marker"><strong>ジェネレータ内包表記（generator comprehension）</strong></span>の使い方について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="ジェネレータ内包表記-generator-comprehension">ジェネレータ内包表記<br>（generator comprehension）</h2>



<p class="wp-block-paragraph">Pythonにおける<span class="marker"><strong>ジェネレータ内包表記（generator comprehension）</strong></span>は、既存リスト等のイテラブルなオブジェクトから、ジェネレータのオブジェクトを作成する際にシンプルに記載するための定義方法です。なお、ジェネレータについては「<a href="https://tech.nkhn37.net/python-generator-yield/" target="_blank" rel="noreferrer noopener">ジェネレータ関数とジェネレータの基本</a>」を参考にしてください。</p>



<p class="wp-block-paragraph">この記事では、ジェネレータ内包表記の基本的な使い方について紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="ジェネレータ内包表記の使い方">ジェネレータ内包表記の使い方</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>ジェネレータ内包表記</strong></span>の構文は以下になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">(式 for 仮変数 in イテラブルなオブジェクト if 条件)</pre>



<p class="wp-block-paragraph">上記の意味合いとしては、イテラブルなオブジェクトから要素を順番に仮変数に取得し、条件に一致するものに対して式を適用した値を返却するようなジェネレータオブジェクトを作るということになります。</p>



<p class="wp-block-paragraph">なお、<code>(</code>で始まるのでタプル内包表記のように思われるかもしれませんが、タプル内包表記というものはありません。タプルにする場合は、変換するという作業が必要です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ジェネレータ内包表記を使う場合</h4>



<p class="wp-block-paragraph">ジェネレータ内包表記を使用するには以下のようにします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">gen = (i for i in range(10) if i % 2 == 0)

print(type(gen))
for i in gen:
    print(i)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;class 'generator'>
0
2
4
6
8</pre>



<p class="wp-block-paragraph">上記例では、<code>2</code>で割り切れる数値を生成するジェネレータを作成しています。<code>gen</code>は、ジェネレータのオブジェクト（<code>&lt;class 'generator'&gt;</code>）となります。</p>



<p class="wp-block-paragraph">ジェネレータオブジェクトは、イテレータの一種のため例のように<code>for</code>文で繰り返しに使用したり、<code>next(gen)</code>のように順に値を取り出して使用したりできます。</p>



<h4 class="wp-block-heading jinr-heading d--bold">タプルやリストに変換したい場合</h4>



<p class="wp-block-paragraph">ジェネレータ内包表記では、ジェネレータのオブジェクトを生成します。タプルやリストに変換したい場合は、以下のように変換することが可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ジェネレータからタプルに変換
gen = (i for i in range(10) if i % 2 == 0)
tpl_tmp = tuple(gen)
print(type(tpl_tmp), tpl_tmp)

# ジェネレータからリストに変換
gen = (i for i in range(10) if i % 2 == 0)
list_tmp = list(gen)
print(type(list_tmp), list_tmp)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;class 'tuple'> (0, 2, 4, 6, 8)
&lt;class 'list'> [0, 2, 4, 6, 8]</pre>



<p class="wp-block-paragraph">ジェネレータはメモリを節約しながら無限シーケンスを扱えるため、タプルやリストに変換する際は、その利点が失われることを考慮し、変換の必要性を十分検討しましょう。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ジェネレータ内包表記を使用しないで記載する場合</h4>



<p class="wp-block-paragraph">ジェネレータ内包表記は、ジェネレータ関数として書き換えることが可能です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># ジェネレータ関数で定義
def generate_num():
    for g in range(10):
        if g % 2 == 0:
            yield g


gen = generate_num()
print(type(gen))
for i in gen:
    print(i)</pre>



<h3 class="wp-block-heading jinr-heading d--bold">ジェネレータ内包表記の特徴と注意点</h3>



<p class="wp-block-paragraph">ジェネレータ内包表記は、処理をシンプルに記述できる点が特徴です。また、ジェネレータ内包表記は、Python内部で最適化されているため、一般的に実行速度も速くなります。特に、大きなデータセットやメモリ効率が重要な場合に積極的に採用するのが良いでしょう。ただし、処理速度は状況によって異なり、必ずしも常に早いとは限らないため、その点には注意が必要です。</p>



<p class="wp-block-paragraph">また、ジェネレータ内包表記がコードを複雑にする場合は、使用を慎重に検討してください。特にチーム開発では、ソースコードの可読性が重要ですので、シンプルさと可読性のバランスを保つことが重要です。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="内包表記まとめ">まとめ</h2>



<p class="wp-block-paragraph">Pythonの<span class="marker"><strong>ジェネレータ内包表記（generator comprehension）</strong></span>の使い方について解説しました。</p>



<p class="wp-block-paragraph">ジェネレータ内包表記は、イテラブルなオブジェクトからジェネレータのオブジェクトを作成する際にシンプルに記載するための定義方法です。この記事では、ジェネレータ内包表記の基本的な使い方や特徴と注意点を紹介しました。</p>



<p class="wp-block-paragraph">Pythonにおける内包表記は他にも「リスト内包表記」「辞書内包表記」「集合内包表記」といったものがあります。内包表記については「<a href="https://tech.nkhn37.net/python-comprehension/" target="_blank" rel="noreferrer noopener">内包表記（まとめ）</a>」を参考にしてください。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/function/generator-comprehension" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-generator-comprehension/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】関数定義の基本</title>
		<link>https://tech.nkhn37.net/python-function-basic/</link>
					<comments>https://tech.nkhn37.net/python-function-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sun, 31 Jan 2021 00:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[**kwargs]]></category>
		<category><![CDATA[*args]]></category>
		<category><![CDATA[キーワード引数]]></category>
		<category><![CDATA[デフォルト引数]]></category>
		<category><![CDATA[位置引数]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=572</guid>

					<description><![CDATA[Pythonで関数を定義する方法について解説します。関数定義では、色々な引数の種類や使い方が登場します。それらの使い方を含めて詳細を説明していきます。 Pythonにおける関数 関数とは、特定の処理を実行するためのコード [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonで<span class="marker"><strong>関数を定義する方法</strong></span>について解説します。関数定義では、色々な引数の種類や使い方が登場します。それらの使い方を含めて詳細を説明していきます。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="関数の定義方法">Pythonにおける関数</h2>



<p class="wp-block-paragraph"><span class="marker"><strong>関数</strong></span>とは、特定の処理を実行するためのコードのまとまりのことです。適切な関数定義を行うことで、再利用可能なコードブロックとして様々な場所から必要な時に呼び出して処理を実行することができるようになります。</p>



<p class="wp-block-paragraph">この記事では、Pythonにおける<span class="marker"><strong>関数定義の基本</strong></span>を紹介します。また、関数では引数の扱いが重要です。様々な引数の種類や使い方についても詳細に説明します。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="基本的な関数宣言方法">基本的な関数宣言</h3>



<p class="wp-block-paragraph">関数は、<span class="marker"><strong><code>def</code></strong></span>を使って以下のように定義します。<code>def</code> は「定義する」の意味の define を意味する略となっています。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 関数定義の基本
def print_hello_world():
    print("hello world!")


if __name__ == "__main__":
    print_hello_world()</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
hello world!</pre>



<p class="wp-block-paragraph">上記例では、<code>"hello world!"</code>と表示する関数<code>print_hello_world</code>を定義しています。関数を呼び出す際には、<code>print_hello_world()</code>というように呼び出すことが可能です。</p>



<section class="wp-block-jinr-blocks-iconbox b--jinr-block b--jinr-iconbox"><div class="d--simple-iconbox5 ">
			<i class="jif jin-ifont-v2speaker" aria-hidden="true"></i>
			<div class="a--jinr-iconbox">
<p class="wp-block-paragraph"><strong><code>if __name__ == "__main__":</code> の意味について</strong></p>



<p class="wp-block-paragraph">この構文は、Python のエントリーポイントを示すために使用されます。具体的にはスクリプトが直接実行された場合と、他モジュールからインポートされた場合で挙動が異なります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>状況</th><th>動作概要</th></tr></thead><tbody><tr><td>スクリプトが直接実行されたとき</td><td><code>__name__</code>  が <code>__main__</code> となるため、<code>if</code> ブロック内のコードが実行されます。</td></tr><tr><td>他モジュールからインポートされたとき</td><td><code>__name__</code> はモジュール名となるため、<code>if</code> ブロック内のコードは実行されません。</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><code>if __name__ == "__main__":</code> ブロックがない場合、スクリプトをインポートするたびにスクリプト内のコードが上から順に実行されます。このような動きは、ライブラリとして使う場合には意図しない不具合の原因となります。この if ブロックにより、インポートの際の不必要なコード実行を防ぐことができます。</p>



<p class="wp-block-paragraph">Python でのベストプラクティスの書き方の1つです。</p>
</div>
		</div></section>



<h3 class="wp-block-heading jinr-heading d--bold" id="関数の引数と返り値の宣言方法">関数の引数と返り値の宣言</h3>



<p class="wp-block-paragraph">関数は、引数を受け取り処理を実行し、結果を返り値として呼び出し元へ返却します。引数は関数の<code>()</code>内に記載をし、返り値については<code>return</code>を使用して返却します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 関数定義 引数、返却値
def func_2(num):
    return 2 * num


if __name__ == "__main__":
    x1 = 5
    y1 = func_2(x1)
    print(f"x1 = {x1}, y1 = {y1}")

    x2 = 10
    y2 = func_2(x2)
    print(f"x2 = {x2}, y2 = {y2}")</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
x1 = 5, y1 = 10
x2 = 10, y2 = 20</pre>



<p class="wp-block-paragraph">上記例の<code>func_2</code>関数は受け取った数値を2倍にして返却する関数です。</p>



<p class="wp-block-paragraph">関数定義の<code>()</code>内に引数となる変数を列挙すると関数内で使用することができます。関数定義での引数は<span class="marker"><strong>仮引数</strong></span>と呼ばれ、呼び出し時に渡される引数は<span class="marker"><strong>実引数</strong></span>と呼ばれます。</p>



<p class="wp-block-paragraph">返却値を呼び出し元に返す場合には、<span class="marker"><strong><code>return</code></strong></span>を使用します。変数を指定するか、式を直接指定した場合は式が評価された結果が返却されます。返り値がない場合は、<code>return</code>を省略した関数とするか、<code>return None</code>を用いることが一般的です。</p>



<p class="wp-block-paragraph">関数の呼び出し時には、<code>y1 = func_2(x1)</code>のように呼び出しができます。実引数<code>x1</code>の値が関数の仮引数<code>num</code>に渡され処理が実行されます。もちろん<code>def func_values(x1, x2):</code>のように複数の引数を受け取る関数を定義することも可能です。</p>



<p class="wp-block-paragraph">関数の基本的な部分は以上となります。関数の引数にはいくつかの種類があるため、以降では、関数の引数の種類と使い方についてより詳細に説明します。</p>



<h2 class="wp-block-heading jinr-heading d--bold" id="関数の引数の種類と使い方">関数の引数の種類と使い方</h2>



<p class="wp-block-paragraph">関数の引数にはいくつかの種類や考え方があります。以降では「位置引数」「キーワード引数」「引数のデフォルト値」「<code>*args</code>」「<code>**kwargs</code>」といったトピックスについて詳細を説明していきます。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="位置引数">位置引数</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>位置引数（positional arguments）</strong></span>とは、関数を呼び出す際に引数の順番に基づいて値を渡す方法です。位置引数では、関数定義時に指定されている引数の順番に値を渡す必要があります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def make_profile(first, last, birth):
    return {"first name": first, "last name": last, "birthday": birth}


if __name__ == "__main__":
    first_name = "Taro"
    last_name = "Python"
    birthday = "2021/1/1"

    # 位置引数にて指定
    profile = make_profile(first_name, last_name, birthday)
    print(profile)

    profile = make_profile(last_name, first_name, birthday)
    print(profile)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
{'first name': 'Taro', 'last name': 'Python', 'birthday': '2021/1/1'}
{'first name': 'Python', 'last name': 'Taro', 'birthday': '2021/1/1'}</pre>



<p class="wp-block-paragraph">上記例は、入力された名前(<code>first_name</code>)、苗字(<code>last_name</code>)、誕生日(<code>birthday</code>)を受け取って辞書にして返却する<code>make_profile</code>関数です。</p>



<p class="wp-block-paragraph">位置引数を使用する場合には、引数の位置と順番が非常に重要です。例えば、上記例で2回目に呼び出した際には、<code>fist_name</code>と<code>last_name</code>の変数の指定位置が入れ替わっています。結果として、名前である<code>Taro</code>が苗字として処理されてしまっています。</p>



<p class="wp-block-paragraph">位置引数では、呼び出し時の順序が重要です。呼び出し順序を間違えると予期しない動作をする可能性がありますので十分に注意しましょう。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="キーワード引数">キーワード引数</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>キーワード引数（keyword arguments）</strong></span>とは、関数を呼び出す際に引数名を指定して値を渡す方法です。関数定義で指定された引数名に基づいて値を渡すため、順番に依存せずに引数を指定できることが特徴です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def make_profile(first, last, birth):
    return {"first name": first, "last name": last, "birthday": birth}


if __name__ == "__main__":
    first_name = "Taro"
    last_name = "Python"
    birthday = "2021/1/1"

    # キーワード引数にて指定
    profile = make_profile(birth=birthday, last=last_name, first=first_name)
    print(profile)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
{'first name': 'Taro', 'last name': 'Python', 'birthday': '2021/1/1'}</pre>



<p class="wp-block-paragraph">上記例は、位置引数の説明時と同様の関数です。キーワード引数の呼び出しでは、「<code>仮引数名=</code>」という形で指定します。</p>



<p class="wp-block-paragraph">キーワード引数では呼び出し時に仮引数名を指定するため順番は関係がなくなります。上記例でいうと、<code>make_profile(birth=birthday, last=last_name, first=first_name)</code>のように関数定義時の順序とは異なる順序で指定しているにも関わらず、結果は正しくなっていることが分かります。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="デフォルト引数値の指定方法">引数のデフォルト値</h3>



<p class="wp-block-paragraph">関数は、引数として定義したものを呼び出し元で全て設定しないとエラーとなってしまいます。ただし、<span class="marker"><strong>引数のデフォルト値</strong></span>を定義しておくことで、呼び出し元で引数の指定がなかった場合に、デフォルト値を代わりに設定して関数を実行することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># デフォルト値を指定
def make_profile(first=None, last=None, birth=None):
    return {"first name": first, "last name": last, "birthday": birth}


if __name__ == "__main__":
    first_name = "Taro"
    last_name = "Python"
    birthday = "2021/1/1"

    # キーワード引数にて指定
    profile = make_profile(first=first_name, birth=birthday)
    print(profile)

    profile = make_profile(first=first_name, last=last_name, birth=birthday)
    print(profile)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
{'first name': 'Taro', 'last name': None, 'birthday': '2021/1/1'}
{'first name': 'Taro', 'last name': 'Python', 'birthday': '2021/1/1'}</pre>



<p class="wp-block-paragraph">引数のデフォルト値は「<code>仮引数=デフォルト値</code>」という形で定義します。呼び出し元で引数が指定された場合は、その値が使用されますが、指定がない場合はデフォルト値が使用されます。</p>



<p class="wp-block-paragraph">なお、デフォルト値を設定する引数は、<span class="marker"><strong>デフォルト値が設定されていない引数の後</strong></span>に定義する必要があるので注意してください。例えば、<code>def make_profile(first=None, last, birth):</code>といった定義はエラーとなります。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="argsによる位置引数のタプル受取"><code>*args</code> による任意個の位置引数の受け取り</h3>



<p class="wp-block-paragraph">関数の引数として任意の個数の引数を渡したい場合には、関数の引数として<span class="marker"><strong><code>*args</code></strong></span>を定義します。なお、<code>args</code>という名称の使用は必須ではありませんが、Pythonを使っている人は通例としてargumentsを意味する<code>args</code>という名称を使用します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">基本的な使い方</h4>



<p class="wp-block-paragraph"><code>*args</code>による引数の受け取りは以下のようにします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># *argsによる位置引数の受け取り
def print_input(*args):
    print(type(args))
    for i, arg in enumerate(args):
        print(f"arg[{i}] = {arg}")


if __name__ == "__main__":
    print_input(1, 2, "A", "B", [1, 2])</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;class 'tuple'>
arg[0] = 1
arg[1] = 2
arg[2] = A
arg[3] = B
arg[4] = [1, 2]</pre>



<p class="wp-block-paragraph"><code>*args</code>として引数を設定した場合には、受け取った引数はタプルとなります。上記例では、<code>print_input(1, 2, "A", "B", [1, 2])</code>のように合計5つの引数を受け取ることができています。</p>



<h4 class="wp-block-heading jinr-heading d--bold">通常の引数との組み合わせ</h4>



<p class="wp-block-paragraph"><code>＊args</code>は、以下のように通常の引数と組み合わせて使用することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def print_input(input1, input2, *args):
    print(input1)
    print(input2)
    for i, arg in enumerate(args):
        print(f'arg[{i}] = {arg}')


if __name__ == '__main__':
    print_input(1, 2, 'A', 'B', 'C')</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
1
2
arg[0] = A
arg[1] = B
arg[2] = C</pre>



<p class="wp-block-paragraph">上記例では、<code>input1</code>、<code>input2</code>は位置引数として指定された順で値が設定され、残りの引数がすべて<code>args</code>にまとめられていることが分かります。これにより、関数として重要な引数は、位置引数として定義しておき、任意の引数を<code>args</code>にまとめてしまうといったことができます。</p>



<p class="wp-block-paragraph">なお、<span class="marker"><strong>通常の引数は*argsの前に定義する必要がある</strong></span>ため注意してください。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="kwargsによるキーワード引数の辞書受取"><code>**kwargs</code> による任意個のキーワード引数の受け取り</h3>



<p class="wp-block-paragraph">関数の引数として任意の個数のキーワード引数を渡したい場合には、関数の引数として<span class="marker"><strong><code>**kwargs</code></strong></span>を定義します。なお、<code>kwargs</code>という名称は必須ではありませんが、Pythonを使っている人は通例としてkeyword argumentsを意味する<code>kwargs</code>という名称を使用します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">基本的な使い方</h4>



<p class="wp-block-paragraph"><code>**kwargs</code>によるキーワード引数の受け取りは以下のようにします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># **kwargsによるキーワード引数の辞書受取
def print_input(**kwargs):
    print(type(kwargs))
    for k, v in kwargs.items():
        print(f"key: {k}, value:{v}")


if __name__ == "__main__":
    print_input(opt1=1, opt2=2, value="python")</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
&lt;class 'dict'>
key: opt1, value:1
key: opt2, value:2
key: value, value:python</pre>



<p class="wp-block-paragraph"><code>**kwargs</code>として引数を指定した場合には、受け取った引数は辞書となります。上記例では、合計3つのキーワード引数を受け取ることができています。<code>**kwargs</code>の使用は、特に複数のオプションとなる引数を関数に渡す場合などに非常に便利です。</p>



<h4 class="wp-block-heading jinr-heading d--bold">通常の引数や <code>*args</code> との組み合わせ</h4>



<p class="wp-block-paragraph"><code>**kwargs</code>は、以下のように通常の引数や<code>*args</code>と組み合わせて使用することができます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 通常の位置引数や*argsとの組み合わせ
def print_input(in1, in2, *args, **kwargs):
    print(in1)
    print(in2)
    for i, arg in enumerate(args):
        print(f"arg[{i}] = {arg}")

    for k, v in kwargs.items():
        print(f"key: {k}, value:{v}")


if __name__ == "__main__":
    print_input(1, 2, "A", "B", "C", opt1=1, opt2=2, name="python")</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
1
2
arg[0] = A
arg[1] = B
arg[2] = C
key: opt1, value:1
key: opt2, value:2
key: name, value:python</pre>



<p class="wp-block-paragraph">上記の例では、通常の位置引数である<code>in1</code>, <code>in2</code>、任意個の引数の<code>*args</code>、任意個のキーワード引数の<code>**kwargs</code>を<code>print_input</code>関数の引数にしています。このように組み合わせをすることで、非常に柔軟に関数の挙動を定義することが可能になってきます。</p>



<p class="wp-block-paragraph">ただし、引数の順は、<span class="marker"><strong>通常の引数、<code>*args</code>、<code>**kwargs</code>の順で定義する必要がある</strong></span>ため注意してください。</p>



<h3 class="wp-block-heading jinr-heading d--bold" id="関数のデフォルト引数に関する注意事項">関数の引数に関する注意事項</h3>



<p class="wp-block-paragraph">ここでは関数の引数に関する注意事項を説明します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">デフォルト値にはミュータブルな型を使うべきではない</h4>



<p class="wp-block-paragraph">関数の引数の<span class="marker"><strong>デフォルト値にはミュータブル（mutable）な値を使うべきではありません</strong></span>。</p>



<p class="wp-block-paragraph">デフォルト値にミュータブルな型を使用すると、同じインスタンスが再利用されてしまい、意図しない動作を引き起こすことがあります。以下の例で見てみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def sample_function(in1, tmp_list=[]):
    tmp_list.append(in1)
    return tmp_list


if __name__ == '__main__':
    result1 = sample_function('A')
    print(result1)

    result2 = sample_function('B')
    print(result2)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
['A']
['A', 'B']</pre>



<p class="wp-block-paragraph">上記例のsample_function関数は、値とリストを受け取ってリストに値を追加する関数です。デフォルト値として空リスト<code>[]</code>を設定しています。この時、前提としてプログラムを書いた人はリストが指定されていないときは新しくリストを作成することを想定しているとします。</p>



<p class="wp-block-paragraph">関数の呼び出し結果を見てみましょう。2回呼び出しを行っており、いずれも<code>tmp_list</code>に渡すリストは指定していません。そのため、結果は1回目は<code>['A']</code>、2回目は<code>['B']</code>となってほしいわけです。しかし、2回目の呼び出しでは結果が<code>['A', 'B']</code>となってしまいました。</p>



<p class="wp-block-paragraph">このような結果となるのは、Pythonでは<span class="marker"><strong>関数のデフォルト値は最初に1回だけ評価される</strong></span>ためです。2回目以降の呼び出しでは既に<code>'A'</code>が追加されているリストを使ってしまうため、<code>['A', 'B']</code>となりました。</p>



<p class="wp-block-paragraph">このように、ミュータブルな型をデフォルト値に使ってしまうと想定外の挙動をしてしまうため注意してください。</p>



<p class="wp-block-paragraph">このように想定外の挙動をする可能性があるため、<span class="marker"><strong>ミュータブルな型をデフォルト値に使用することは避ける</strong></span>ようにしてください。</p>



<h4 class="wp-block-heading jinr-heading d--bold">ミュータブルなデフォルト値を使いたい場合</h4>



<p class="wp-block-paragraph">上記では、ミュータブルな値を使うべきではないということで例を紹介しましたが、では実際にどのような解決策があるでしょうか。</p>



<p class="wp-block-paragraph">このような場合は、以下のようにデフォルト値として<code>None</code>を指定して起き、関数内で<code>None</code>であった場合に初期化する方法が適切です。この方法では、毎回新しいリストが作成されるため安全です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">def sample_function(in1, tmp_list=None):
    if tmp_list is None:
        tmp_list = []
    tmp_list.append(in1)
    return tmp_list


if __name__ == '__main__':
    result1 = sample_function('A')
    print(result1)

    result2 = sample_function('B')
    print(result2)</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">【実行結果】
['A']
['B']</pre>



<p class="wp-block-paragraph">上記結果では、想定した通り結果では、呼び出しの1回目は<code>['A']</code>、2回目は<code>['B']</code>という結果となりました。</p>



<h2 class="wp-block-heading jinr-heading d--bold">まとめ</h2>



<p class="wp-block-paragraph">Python で<span class="marker"><strong>関数を定義する方法</strong></span>について解説しました。また、関数定義では、色々な引数の種類や使い方について紹介しています。</p>



<p class="wp-block-paragraph">関数の定義では <code>def</code> を使って、必要に応じて引数や返り値を設定して定義します。</p>



<p class="wp-block-paragraph">引数では、位置引数、キーワード引数といった考え方があり、<code>*args</code> や <code>**kwargs</code> といった任意個の引数を渡す仕組みがあります。引数が渡されない時のデフォルト引数を設定することができますが、リスト、辞書などのミュータブルな型を設定するとバグにつながりやすいため注意しましょう。</p>



<p class="wp-block-paragraph">関数の定義は、プログラミングでも重要なので基本をしっかり押さえましょう。パッケージなどを使う際にどのように呼び出すことができるかを調べる際にも関数定義の構造をしっかり理解しておくことが役に立ちます。</p>



<section class="wp-block-jinr-blocks-simplebox b--jinr-block-container"><div class="b--jinr-block b--jinr-box d--heading-box8  "><div class="a--simple-box-title d--bold">ソースコード</div><div class="c--simple-box-inner">
<p class="wp-block-paragraph">上記で紹介しているソースコードについては <a href="https://github.com/nkhn37/python-tech-sample-source/tree/main/python-basic/function/basics" target="_blank" rel="noreferrer noopener">GitHub</a> にて公開しています。参考にしていただければと思います。</p>
</div></div></section>


<section class="b--jinr-block b--jinr-blogcard d--blogcard-hover-up d--blogcard-style1 d--blogcard-mysite t--round "><div class="a--blogcard-label ef">あわせて読みたい</div><a class="o--blogcard-link t--round" href="https://tech.nkhn37.net/python-tech-summary-page/"><div class="c--blogcard-image"><img decoding="async" class="a--blogcard-img-src" width="128" height="72" src="https://tech.nkhn37.net/wp-content/uploads/2024/08/Python-Tech-Pythonプログラミングガイド_new1-640x360.jpg" alt="【Python Tech】プログラミングガイド" /></div><div class="a--blogcard-title d--bold">【Python Tech】プログラミングガイド</div></a></section>]]></content:encoded>
					
					<wfw:commentRss>https://tech.nkhn37.net/python-function-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: tech.nkhn37.net @ 2026-06-08 12:57:06 by W3 Total Cache
-->