<?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/tag/higher-order-function-jpn/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を用いた関数型プログラミング</title>
		<link>https://tech.nkhn37.net/python-functional-programming/</link>
					<comments>https://tech.nkhn37.net/python-functional-programming/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Sat, 26 Aug 2023 20:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[不変性]]></category>
		<category><![CDATA[副作用]]></category>
		<category><![CDATA[参照透過性]]></category>
		<category><![CDATA[関数型プログラミング]]></category>
		<category><![CDATA[高階関数]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=8815</guid>

					<description><![CDATA[Pythonはマルチパラダイム言語のため、関数型スタイルのプログラミングにも対応しています。関数型プログラミング概要を紹介するとともにPythonで関数型スタイルのプログラミングをする方法について解説します。 関数型プロ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Pythonはマルチパラダイム言語のため、関数型スタイルのプログラミングにも対応しています。<span class="marker"><strong>関数型プログラミング概要</strong></span>を紹介するとともに<span class="marker"><strong>Pythonで関数型スタイルのプログラミングをする方法</strong></span>について解説します。</p>



<h2 class="wp-block-heading jinr-heading d--bold">関数型プログラミングとは</h2>



<p class="wp-block-paragraph"><span class="marker"><strong>関数型プログラミング</strong></span>とは、数学的な関数の概念に基づき、副作用を避け、関数の合成や高階関数を中心としてプログラミングをするスタイルのことです。</p>



<p class="wp-block-paragraph">プログラミング言語には、手続き型言語、オブジェクト指向言語、関数型言語といったものがあります。関数型プログラミング言語は、関数型プログラミングに特化した言語で、代表的な言語にHaskell、Scala、F#、Lispなどがあります。</p>



<p class="wp-block-paragraph">Pythonはマルチパラダイム言語のため、手続き型やオブジェクト指向のプログラミングだけでなく、関数型スタイルのプログラミングにも対応しています。</p>



<p class="wp-block-paragraph">本記事では、まず関数型プログラミングや関数型プログラミング言語全般の特徴を紹介し、<span class="marker"><strong>Pythonにおける関数型プログラミングの方法</strong></span>について紹介しようと思います。Pythonでの関数型プログラミングの方法にのみ興味がある方は、関数型プログラミングの説明部分は読み飛ばしてもらっても構いません。</p>



<h3 class="wp-block-heading jinr-heading d--bold">関数とは</h3>



<p class="wp-block-paragraph">関数型プログラミング言語に限らず、ほとんどのプログラミングでは関数が出てきます。では、関数型プログラミングでいうところの「<span class="marker"><strong>関数</strong></span>」とはいったい何でしょうか。関数型プログラミングを勉強する際にはこの部分をしっかりと理解しておく必要があります。</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--simple-box1  "><div class="c--simple-box-inner">
<ol class="wp-block-list jinr-list">
<li>すべての関数は引数を受け取らなければならない</li>



<li>すべての関数は値を返却しなければならない</li>



<li>関数が同じ引数で呼び出されたときは常に同じ結果にならなければならない</li>
</ol>
</div></div></section>



<p class="wp-block-paragraph">上記は、与えられた入力のみから出力が決まるということを意味しています。3つ目の特徴は、<span class="marker"><strong>参照透過性</strong></span>として有名です。</p>



<p class="wp-block-paragraph">Pythonをはじめ、多くのプログラミング言語では、引数を受け取らない、または返却値を返さない関数を作ることができますが、これは数学的な意味での関数とは厳密には異なります。</p>



<h3 class="wp-block-heading jinr-heading d--bold">関数型プログラミングの特徴</h3>



<p class="wp-block-paragraph">関数型プログラミングでは、プログラムは「関数」であるという見方をし、プログラムは<span class="marker"><strong>関数合成(function composition)</strong></span>したものと捉えます。</p>



<p class="wp-block-paragraph">関数合成とは、ある関数$f$と関数$g$があった時に、入力$x$に対して$(f \circ g)=f(g(x))$とできることを言います。$g$の値域(出力の取り得る値全体からなる集合)が、$f$の定義域(入力の取り得るの値全体からなる集合)におさまっていれば関数は合成できることになります。</p>



<p class="wp-block-paragraph">関数型プログラミングでは、小さな関数から関数を合成していくことで大きなプログラムを実現していくことになるわけですが、以下のようないくつかの特徴があります。</p>



<ul class="wp-block-list jinr-list">
<li>プログラムを手続きではなく関数合成で表現する</li>



<li>関数を変数として扱うことができる</li>



<li>関数は入力値と返却値を持ち、返却値は入力にのみ依存する（参照透過性）</li>



<li>関数の副作用を許可しない</li>



<li>形式手法と定理証明でプログラムの数学的な証明ができる</li>
</ul>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">以降では関数型プログラミングの上記の特徴について説明してみたいと思います。</p>



<h4 class="wp-block-heading jinr-heading d--bold">プログラムを手続きではなく関数合成で表現する</h4>



<p class="wp-block-paragraph">関数型プログラミングがC言語などの手続き型言語と異なるのは、手続きを列挙するのではなく関数を順に適用した関数合成で宣言的に結果を実現する点です。</p>



<p class="wp-block-paragraph">例えば、リストの中の数値をそれぞれ2乗して、すべてを足し合わせる問題を考えたとしましょう。Pythonで、手続き的にプログラミングする場合と、関数の合成でプログラミングする場合の例を以下に示します。</p>



<p class="wp-block-paragraph"><strong>【手続きで書く場合】</strong>初期化、ループ、状態変更を用いる</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="">target = [1, 2, 3, 4, 5]

# 手続きで書く場合
sum_value = 0
for d in target:
    sum_value += d**2
print(sum_value)</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="">【実行結果】
55</pre>



<p class="wp-block-paragraph"><strong>【関数で書く場合】</strong>高階関数を用いてデータ変換と合成を行う</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="">from functools import reduce


def add_nums(x, y):
    """値を足し算する"""
    return x + y


def square(x):
    """値を2乗する"""
    return x**2


target = [1, 2, 3, 4, 5]

# 関数で書く場合
sum_value = reduce(add_nums, map(square, target))
print(sum_value)</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="">【実行結果】
55</pre>



<p class="wp-block-paragraph">上記のプログラムは、計算結果としてはどちらも55となります。</p>



<p class="wp-block-paragraph">手続き的にプログラムを記載する場合には、合計用の変数<code>sum_value</code>を<code>0</code>で初期化し、for文で、<code>target</code>というリストの中の要素を順に変数<code>d</code>に取込み、<code>d</code>を2乗して<code>sum_value</code>に足しこんでいくという書き方をしています。処理の過程で変数<code>d</code>や<code>sum_value</code>の値が変化していくのが特徴です。</p>



<p class="wp-block-paragraph">一方で、関数で記載する場合の例では、値を足し算する<code>add_nums</code>関数と値を2乗する<code>square</code>関数を用意しています。関数型プログラミングでは「<code>target</code>の各要素を<code>square</code>で2乗し、結果を<code>add_nums</code>で足し込む」を関数合成の要領で「<code>reduce(add_nums, map(square, target))</code>」という1行で記載しています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="997" height="193" src="https://tech.nkhn37.net/wp-content/uploads/2023/08/image.png" alt="関数合成" class="wp-image-8961" srcset="https://tech.nkhn37.net/wp-content/uploads/2023/08/image.png 997w, https://tech.nkhn37.net/wp-content/uploads/2023/08/image-300x58.png 300w, https://tech.nkhn37.net/wp-content/uploads/2023/08/image-768x149.png 768w" sizes="(max-width: 997px) 100vw, 997px" /></figure>
</div>


<p class="wp-block-paragraph"><code>map</code>はリストの各要素に関数を適用するための関数で、<code>reduce</code>はリストの要素を使って関数で畳み込むための関数ですが、詳細は後に紹介します。</p>



<p class="wp-block-paragraph">関数型の書き方では、状態を変化させるようなコードがないことが特徴的です。関数型プログラミングでは、入力に対する出力の性質を宣言的に書くことで、コードの見通しが良くなるという特徴があります。</p>



<h4 class="wp-block-heading jinr-heading d--bold">関数を変数として扱うことができる</h4>



<p class="wp-block-paragraph">関数型プログラミングでは、値を変数に入れることと同じようにして関数を変数に入れて扱うことができます。変数の中身は値の場合もありますし、関数自体の場合もあります。</p>



<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>参照透過性</strong></span>と言い、関数型プログラミングで重要なものとなっています。</p>



<p class="wp-block-paragraph">以下で参照透過である関数とそうでない関数を見てみましょう。</p>



<p class="wp-block-paragraph"><strong>【参照透過である関数】</strong></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__":
    print(square(2))
    print(square(2))
    print(square(3))
    print(square(3))</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="">【実行結果】
4
4
9
9</pre>



<p class="wp-block-paragraph"><strong>【参照透過ではない関数】</strong></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="">global_value = 0


def func():
    global global_value
    global_value += 1

    return global_value


if __name__ == "__main__":
    print(func())
    print(func())
    print(func())</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
3</pre>



<p class="wp-block-paragraph"><code>square</code>関数は、引数として受け取った<code>x</code>の値を2乗して返却する関数で、<code>x=2</code>であれば<code>4</code>ですし、<code>x=3</code>であれば<code>9</code>と常に同じ結果を返します。このような関数は参照透過であると言います。</p>



<p class="wp-block-paragraph">一方で、参照透過ではない<code>func</code>関数は呼び出すたびに返却値の値が異なっています。このように呼び出しのたびに結果が変わるようなものは、数学的な意味での関数とは言えません。</p>



<h4 class="wp-block-heading jinr-heading d--bold">関数の副作用を許可しない</h4>



<p class="wp-block-paragraph">プログラミングにおいて<span class="marker"><strong>副作用</strong></span>というのは非常に重要な概念です。副作用とは、処理が外部の状態や環境に影響を与えるような変更を指します。変数の変更、ファイルの入出力、ネットワーク通信などは、代表的な副作用の例と言えます。例外送出も状態を変更することから一種の副作用と言えます。</p>



<p class="wp-block-paragraph">関数型プログラミング言語では、こういった副作用を許可しないような仕組みが多く取り込まれています。関数型プログラミング言語では、変数に値を設定すると値を変更できないか、もしくは非常に限定されています。このような性質は<span class="marker"><strong>値の不変性</strong></span>と言いますが、この特徴は副作用を避けるためのものと言えます。</p>



<p class="wp-block-paragraph">関数型プログラミングでは、プログラミングの範囲を以下のように「副作用のないもの」「副作用のあるもの」で区別して考えることが重要です。副作用を持つような手続きは、数学的な意味での関数とは言えません。</p>


<div class="wp-block-image">
<figure class="aligncenter size-medium"><img decoding="async" width="300" height="156" src="https://tech.nkhn37.net/wp-content/uploads/2023/08/image-1-300x156.png" alt="" class="wp-image-8962" srcset="https://tech.nkhn37.net/wp-content/uploads/2023/08/image-1-300x156.png 300w, https://tech.nkhn37.net/wp-content/uploads/2023/08/image-1-768x398.png 768w, https://tech.nkhn37.net/wp-content/uploads/2023/08/image-1.png 798w" sizes="(max-width: 300px) 100vw, 300px" /></figure>
</div>


<p class="wp-block-paragraph">どのように副作用のあるものを扱うかというと、例えば、純粋関数型言語のHaskellではモナドという仕組みを使って副作用を扱います。詳細は割愛しますが、ここでは関数型プログラミング言語では、副作用を許さないような仕組みで言語が成り立っているということを理解してもらえればと思います。</p>



<h4 class="wp-block-heading jinr-heading d--bold">形式手法と定理証明でプログラムの数学的な証明ができる</h4>



<p class="wp-block-paragraph">関数型プログラミング言語に関連している事項として<span class="marker"><strong>形式手法</strong></span>と<span class="marker"><strong>定理証明</strong></span>というものがあります。</p>



<p class="wp-block-paragraph">形式手法とは、プログラムやシステムを形式的なモデルや仕様で記述する手法で、抽象的なレベルで設計や検証を行うことで問題やバグを事前に特定できるような技術です。特に鉄道分野、航空分野、金融・セキュリティ分野など、システムの不具合が人命や人の生活に多大に影響を及ぼすような分野で使用されています。</p>



<p class="wp-block-paragraph">一方、定理証明とは、形式手法で作成されたモデルや仕様を元に証明を行うための技術です。定理証明を使用してプログラムの性質を確認することにより、形式手法で設計されたモデルや仕様の妥当性が検証され、プログラムが正しい振る舞いを持つことをテストを行わずに示すことができます。ただし、テストが不要という極端なことを言っているわけではありませんので注意してください。</p>



<p class="wp-block-paragraph">一般に定理証明は簡単ではなく、十分に行えるプログラマも多くはないと言われています。私もこの領域のレベルの技術領域については知っているだけで、十分な理解は得られていません。数学に基づく言語であるからこそ、こういったことに対応できるというのが関数型プログラミング言語の大きな特徴と言えます。興味がある方は勉強してみるといいでしょう。</p>



<h3 class="wp-block-heading jinr-heading d--bold">Pythonで関数型プログラミング</h3>



<p class="wp-block-paragraph">Pythonはマルチパラダイム言語であるため、関数型プログラミングスタイルを使うことができます。</p>



<p class="wp-block-paragraph">関数型プログラミングには、プログラムの見通しが良くなるなどの特徴があり、紹介してきたような特徴を活かすため、Pythonでも関数型プログラミングを意識したコーディングができるようになることは、プログラムの質を向上させるための役に立つと思います。</p>



<p class="wp-block-paragraph">ただし、Pythonが厳密な意味で関数型プログラミングの制約を課すわけではないことに注意が必要です。Pythonで関数型プログラミングをしようとすると、例えば関数としての制約を満たせているか、関数の定義域と値域の関係性が問題ないかなどをプログラマが考慮する必要があります。</p>



<p class="wp-block-paragraph">一方で、Haskellなどの関数型プログラミング言語では、言語としての学習コストが高いものの、関数型プログラミングとしてのチェックを言語がしてくれるためプログラマがその点を考える必要はありません。そのため、本当の意味で関数型プログラミングをしたい場合は、Haskellなどの関数型プログラミング言語を採用するのが適切でしょう。</p>



<h2 class="wp-block-heading jinr-heading d--bold">Pythonによる関数型プログラミング</h2>



<p class="wp-block-paragraph">以降では、Pythonで関数型スタイルでプログラミングする方法を説明します。独立したページで詳しく整理しているため、関連ページへのリンクを中心に紹介します。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ラムダ関数（無名関数）</h3>



<p class="wp-block-paragraph">関数型プログラミングと<span class="marker"><strong>ラムダ関数</strong></span>は、非常に密接な関係性を持つ概念です。関数中心のプログラミングスタイルである関数型プログラミングにおいてラムダ関数は核となる概念ともいえます。なお、ラムダ関数は、関数名を持たないことから無名関数とも呼ばれます。</p>



<p class="wp-block-paragraph">ラムダ関数は、関数を直接表現する手段として関数型プログラミングにおいて非常に重要です。ラムダ関数を変数に代入して使用したり、関数を引数に取る高階関数の引数として渡して使うことができます。</p>



<p class="wp-block-paragraph">Pythonにおけるラムダ関数は「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-lambda/" data-type="link" data-id="https://tech.nkhn37.net/python-lambda/" target="_blank">ラムダ（lambda）関数：無名関数の使い方</a>」を参考にしてください。</p>



<h3 class="wp-block-heading jinr-heading d--bold">高階関数の使用</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>高階関数</strong></span>とは、関数自体を引数／返却値として扱う関数を言います。関数型プログラミングの領域でよく使われる高階関数は、Python組み込み関数やfunctoolsモジュールで実装がされています。以降では、それらの関数について紹介します。</p>



<h4 class="wp-block-heading jinr-heading d--bold">map関数</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>map</strong></span>関数は、関数と処理対象のイテラブルなオブジェクト(リスト等)を受け取って、イテラブルなオブジェクトの各要素に関数を適用した結果を返却するPythonの組み込み関数です。map関数は関数型プログラミング言語で特徴的で重要な関数です。</p>



<p class="wp-block-paragraph">map関数の詳細な使い方は「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-map-basic/" data-type="link" data-id="https://tech.nkhn37.net/python-map-basic/" target="_blank">map関数の使い方の基本 ~リスト要素への関数適用~</a>」を参考にしてください。</p>



<h4 class="wp-block-heading jinr-heading d--bold">filter関数</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>filter</strong></span>関数は、関数と処理対象のイテラブルなオブジェクト(リスト等)を受け取って、特定の条件を満たす要素を抽出するPythonの組み込み関数です。filter関数は、関数型プログラミング言語でも特徴的で重要な関数です。</p>



<p class="wp-block-paragraph">filter関数の詳細な使い方は「<a href="https://tech.nkhn37.net/python-filter-basic/" data-type="link" data-id="https://tech.nkhn37.net/python-filter-basic/" target="_blank" rel="noreferrer noopener">filter関数の使い方の基本 ~リストから条件を満たす要素を抽出~</a>」を参考にしてください。</p>



<h4 class="wp-block-heading jinr-heading d--bold">reduce関数</h4>



<p class="wp-block-paragraph"><span class="marker"><strong>reduce</strong></span>関数は、関数と処理対象のイテラブルなオブジェクト(リスト等)を受け取って、リストの要素を指定した関数を使って畳み込む関数です。</p>



<p class="wp-block-paragraph">もともとreduce関数は、Python2でmap関数やfilter関数同様にPythonの組み込み関数でしたが、Python3からはfunctoolsモジュールに移動しています。</p>



<p class="wp-block-paragraph">reduce関数の詳細な使い方は「<a href="https://tech.nkhn37.net/python-reduce-basic/" data-type="link" data-id="https://tech.nkhn37.net/python-reduce-basic/" target="_blank" rel="noreferrer noopener">reduce関数の使い方の基本 ~リスト要素の畳み込み~</a>」を参考にしてください。</p>



<h4 class="wp-block-heading jinr-heading d--bold">partial関数</h4>



<p class="wp-block-paragraph">関数の<span class="marker"><strong>部分適用</strong></span>というのは、数学やプログラミングにおいて重要な概念です。部分適用は、ある関数に対して一部の引数を固定して新しい関数を作る手続きのことを言います。</p>



<p class="wp-block-paragraph"><span class="marker"><strong>partial</strong></span>関数は、関数と固定する引数の値を受け取ることで関数の部分適用をすることができる関数です。partial関数は、functoolsモジュールの中に含まれています。</p>



<p class="wp-block-paragraph">partial関数の詳細な使い方は「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-partial-basic/" data-type="link" data-id="https://tech.nkhn37.net/python-partial-basic/" target="_blank">partial関数の使い方の基本 ~関数の部分適用~</a>」を参考にしてください。</p>



<h3 class="wp-block-heading jinr-heading d--bold">デコレータ</h3>



<p class="wp-block-paragraph">Pythonの<span class="marker"><strong>デコレータ</strong></span>は、関数型プログラミングのアイデアを利用して関数を変更したり、拡張したりするための仕組みです。「@関数名」として使うのがデコレータの表記となっています。ここでの関数は、引数に関数を受け取って関数を返却するような高階関数です。</p>



<p class="wp-block-paragraph">デコレータの使い方は<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-decorator/" data-type="link" data-id="https://tech.nkhn37.net/python-decorator/" target="_blank">デコレータ（decorator）の基本的な使い方</a>を参考にしてください。</p>



<h3 class="wp-block-heading jinr-heading d--bold">ジェネレータ</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>ジェネレータ</strong></span>は、プログラム内で逐次的に値を生成するための仕組みです。値を一つずつ取得することができ、途中で停止したり再開したりすることが可能なため、無限のデータ列を表現できます。関数型プログラミングでもジェネレータが利用される点で関連があります。</p>



<p class="wp-block-paragraph">Pythonでジェネレータを使う方法は「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-generator-yield/" data-type="link" data-id="https://tech.nkhn37.net/python-generator-yield/" target="_blank">ジェネレータ（generator）関数 ~yieldによる返却~</a>」を参考にしてください。また、ジェネレータは内包表記で表現することも可能です。ジェネレータ内包表記の使い方は「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-generator-comprehension/" data-type="link" data-id="https://tech.nkhn37.net/python-generator-comprehension/" target="_blank">ジェネレータ（generator）内包表記の使い方</a>」を参考にしてください。</p>



<h3 class="wp-block-heading jinr-heading d--bold">型ヒント（型アノテーション）</h3>



<p class="wp-block-paragraph">関数型プログラミングをする場合には型の情報というのは重要なものです。関数型プログラミング言語には、型検査や型推論といったものがあることからも重要性が分かります。</p>



<p class="wp-block-paragraph">Pythonは動的型付け言語であるため、型の指定は必要はありません。そのため、型が適切に使われているかといった判断をすることは難しいです。</p>



<p class="wp-block-paragraph">しかし、Pythonではバージョン3.5から<span class="marker"><strong>型ヒント</strong></span>がサポートされており、変数や関数に型アノテーションとして型情報を指定できるようになっています。また、この型ヒントを元にした型チェックを行う<span class="marker"><strong>mypy</strong></span>というサードパーティ製のライブラリも存在します。これらをうまく使うことで関数型プログラミング言語のように型チェックを行うことが可能です。</p>



<p class="wp-block-paragraph">型ヒントについては「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-type-annotation-basic/" data-type="link" data-id="https://tech.nkhn37.net/python-type-annotation-basic/" target="_blank">型ヒント（変数・関数の型アノテーション）の基本</a>」を参考にしてください。また、mypyについても「<a rel="noreferrer noopener" href="https://tech.nkhn37.net/python-mypy-type-annotation-check/" data-type="link" data-id="https://tech.nkhn37.net/python-mypy-type-annotation-check/" target="_blank">mypyを使用した型チェックの方法</a>」にまとめていますので興味があれば参考にしてください。</p>



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



<p class="wp-block-paragraph">Pythonはマルチパラダイム言語のため、関数型スタイルのプログラミングにも対応しています。本記事では、<span class="marker"><strong>関数型プログラミング概要</strong></span>を紹介するとともに<span class="marker"><strong>Pythonで関数型スタイルのプログラミングをする方法</strong></span>について解説しました。</p>



<p class="wp-block-paragraph">関数型プログラミングは、プログラムの見通しが良くなるなどのメリットがあるため、Pythonでも関数型プログラミングを意識したコーディングをすることで、プログラムの質が向上する可能性があります。</p>



<p class="wp-block-paragraph">ただし、Pythonが厳密な意味で関数型プログラミングの制約を全面的に課すことができるわけではないことに注意が必要です。本当の意味で関数型プログラミングを追求したい場合は、Haskellなどの関数型プログラミング言語を採用を検討することをおすすめします。</p>


<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-functional-programming/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】reduce関数の使い方の基本 ~要素の畳み込み~</title>
		<link>https://tech.nkhn37.net/python-reduce-basic/</link>
					<comments>https://tech.nkhn37.net/python-reduce-basic/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Thu, 24 Aug 2023 21:00:00 +0000</pubDate>
				<category><![CDATA[functools]]></category>
		<category><![CDATA[reduce]]></category>
		<category><![CDATA[高階関数]]></category>
		<guid isPermaLink="false">https://tech.nkhn37.net/?p=8811</guid>

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



<h2 class="wp-block-heading jinr-heading d--bold">reduce関数で要素を畳み込む</h2>



<p class="wp-block-paragraph"><span class="marker"><strong><code>reduce</code></strong></span> 関数は、関数と処理対象のイテラブルを受け取り、そのイテラブルの要素を指定した関数を使って畳み込むための関数です。</p>



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



<p class="wp-block-paragraph"><code>reduce</code> 関数は、Python 2 では <code>map</code> 関数や <code>filter</code> 関数同様に Python の組み込み関数でした。しかし、Python 3 からは <code>functools</code> モジュールに移動したため、この関数を使用する際には <code>functools</code> のインポートが必要となりました。</p>



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



<p class="wp-block-paragraph">本記事では、リストを使った例を用いて、<span class="marker"><strong><code>reduce</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>reduce</code> 関数と同様に関数型プログラミングに関連のある関数として <code>map</code> 関数、<code>filter</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-filter-basic/" target="_blank" rel="noreferrer noopener">filter関数の使い方の基本 ~条件を満たす要素を抽出~</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>reduce</code> 関数の基本的な使い方</h3>



<p class="wp-block-paragraph"><span class="marker"><strong><code>reduce</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="">from functools import reduce

result = reduce(関数, イテラブル)</pre>



<p class="wp-block-paragraph"><code>reduce</code> 関数は <code>functools</code> モジュール内にあるためインポートが必要です。</p>



<p class="wp-block-paragraph"><code>reduce</code> 関数は、イテラブルの要素を 1 つずつ取得し、それらの要素に累積的に指定した関数を適用して結果を畳み込んでいきます。例えば、関数 <code>func</code> とリスト <code>[a, b, c, d]</code> というものがあった時に <code>reduce(func, [a, b, c, d])</code> は、<code>func(func(func(a, b), c), d)</code> と同じです。</p>



<p class="wp-block-paragraph">よく <code>reduce</code> 関数と一緒に紹介される <code>map</code> 関数や <code>filter</code> 関数は返却値としてイテレータを返すため無限に続くシーケンスでも動作させることができます。もちろん <code>list</code> 等に変換しようとしたり、<code>for</code> でループするようなことをすれば終了しなくなります。</p>



<p class="wp-block-paragraph">一方で、<code>reduce</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>reduce</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="">from functools import reduce


def add_nums(x, y):
    """値を足し算する"""
    return x + y


def multiply_nums(x, y):
    """値を掛け算する"""
    return x * y


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

    # reduce関数でadd_nums関数を適用する
    result = reduce(add_nums, tmp_list)
    print(result)

    # reduce関数でmultiply_nums関数を適用する
    result = reduce(multiply_nums, 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="">【実行結果】
15
120</pre>



<p class="wp-block-paragraph">上記の例では、受け取った値を足し算する <code>add_nums</code> 関数と掛け算をする <code>multiply_nums</code> 関数を用意し、<code>tmp_list</code> の各要素に順に関数を適用しています。</p>



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



<p class="wp-block-paragraph"><code>reduce</code> 関数で <code>add_nums</code> と <code>tmp_list</code> を実行した場合、具体的に計算している内容としては「<code>((((1+2)+3)+4)+5) = 15</code>」です。同様に <code>multiply_nums</code> の場合は、「<code>((((1*2)*3)*4)*5) = 120</code>」となります。</p>



<p class="wp-block-paragraph">このような計算を畳み込みといい <code>reduce</code> 関数を用いることで、リストの要素に順に関数を適用して計算することができます。</p>



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



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



<p class="wp-block-paragraph"><code>add_nums</code> 関数や <code>multiply_nums</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="">from functools import reduce

tmp_list = [1, 2, 3, 4, 5]

# reduce関数でラムダ関数を使って足し算を適用する
result = reduce(lambda x, y: x + y, tmp_list)
print(result)

# reduce関数でラムダ関数を使って掛け算を適用する
result = reduce(lambda x, y: x * y, 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="">【実行結果】
15
120</pre>



<p class="wp-block-paragraph">これまでの例で <code>add_nums</code> 関数を指定した部分で「<code>lambda x, y: x + y</code>」というラムダ関数で置き換えて指定しています。また、同様に <code>multiply_nums</code> の代わりに「<code>lambda x, y: x * y</code>」としています。結果は <code>add_nums</code> 関数や <code>multiply_nums</code> 関数を使った場合と同じです。</p>



<p class="wp-block-paragraph">ラムダ関数は無名関数ともいわれる通り、関数名はありませんが、そのものが関数として扱われるため、<code>reduce</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>reduce</code> 関数を使って要素を畳み込む方法</strong></span>を解説しました。</p>



<p class="wp-block-paragraph"><code>reduce</code> 関数は、関数と処理対象のイテラブルを受け取り、そのイテラブルの要素を指定した関数を使って畳み込むための関数です。<code>reduce</code> 関数は関数型プログラミング言語でも中心的な関数ですが Python でも使用できます。</p>



<p class="wp-block-paragraph"><code>reduce</code> 関数は、Python 3 からは <code>functools</code> モジュールに移動したため、この関数を使用する際には <code>functools</code> のインポートが必要になります。</p>



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



<p class="wp-block-paragraph">場合によっては <code>for</code> 文で書いた方が可読性が上がる可能性もあります。目的に応じて適切に方法を選択できるように <code>reduce</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-libraries/functools/reduce" 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-reduce-basic/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<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>
	</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-14 07:10:09 by W3 Total Cache
-->