0Pricing
Python Academy · レッスン

部分関数

functools.partialを使用します

「部分関数」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

partialとは何ですか?

functools.partialは、既存の関数の一部の引数をあらかじめ埋めた新しい関数を作成します。引数を事前に設定しておくことで、呼び出し時に少ない引数で実行できるようにする仕組みです。

from functools import partialでインポートします。

from functools import partial
def power(base, exp):
    return base ** exp
square = partial(power, exp=2)
print(square(5))

位置引数を固定する

partialに渡した位置引数は、関数のパラメーターを左から順に埋めます。残りの引数は、partialを呼び出すときに指定します。

from functools import partial
def multiply(a, b):
    return a * b
double = partial(multiply, 2)
print(double(10))
print(double(50))

キーワード引数を固定する

partialに指定したキーワード引数はデフォルト値になりますが、呼び出し時に上書きすることもできます。

from functools import partial
def greet(name, greeting='Hello'):
    return greeting + ', ' + name
hola = partial(greet, greeting='Hola')
print(hola('Ada'))
print(hola('Bob', greeting='Hey'))

組み込み関数でpartialを使う

組み込み関数にもpartialを適用できます。ここでは、intから2進数用の整数パーサーを作成します。

from functools import partial
binary = partial(int, base=2)
print(binary('1010'))
print(binary('1111'))

コールバックをすっきりさせる

引数を取らない関数や1つの引数を取る関数を渡す必要があり、コンテキストをあらかじめ設定しておきたい場合に、partialは役立ちます。

from functools import partial
def log(level, message):
    return '[' + level + '] ' + message
error = partial(log, 'ERROR')
print(error('disk full'))

mapでpartialを使う

partialはmapのような高階関数に自然に組み込めます。一方の引数を固定し、もう一方を項目ごとに変化させます。

from functools import partial
def add(a, b):
    return a + b
add10 = partial(add, 10)
print(list(map(add10, [1, 2, 3])))

partialを調べる

partialオブジェクトでは、ラップされた関数を.funcで、固定された位置引数を.argsで、固定されたキーワード引数を.keywordsで取得できます。

from functools import partial
def f(a, b, c):
    return (a, b, c)
p = partial(f, 1, c=3)
print(p.func.__name__)
print(p.args)
print(p.keywords)

partialを重ねる

別のpartialからpartialを作成し、固定する引数を段階的に追加できます。

from functools import partial
def volume(l, w, h):
    return l * w * h
base = partial(volume, 2)
slab = partial(base, 3)
print(slab(4))

partialとlambdaの違い

lambdaでも同じことができますが、引数の固定にはpartialのほうがわかりやすいことが多く、内省のためにラップされた関数も公開されます。

from functools import partial
def power(base, exp):
    return base ** exp
cube_p = partial(power, exp=3)
cube_l = lambda b: power(b, 3)
print(cube_p(2), cube_l(2))

実例:丸め処理

組み込みのroundにpartialを適用して、小数点以下2桁に丸める関数を作成します。

from functools import partial
round2 = partial(round, ndigits=2)
print(round2(3.14159))
print(round2(2.71828))

クラス用のpartialmethod

関連するfunctools.partialmethodは、クラス定義内のメソッドに対して同じ処理を行い、メソッドの引数をあらかじめ埋めます。

from functools import partialmethod
class Light:
    def set(self, state):
        self.state = state
        return state
    on = partialmethod(set, True)
    off = partialmethod(set, False)
l = Light()
print(l.on())
print(l.off())

クイックチェック

functools.partialは何をしますか?

復習:部分適用関数

functools.partialについて、次のことを学びました。

  • 一部の引数(位置引数またはキーワード引数)があらかじめ設定された新しい関数を作成します。
  • 設定済みのキーワード引数のデフォルト値を、呼び出し時に上書きできます。
  • コールバック、map、重複の削減に適しています。
  • .func、.args、.keywordsを公開し、メソッド版としてpartialmethodもあります。
from functools import partial
add = lambda a, b: a + b
plus1 = partial(add, 1)
print(plus1(41))

よくある質問

「部分関数」レッスンは無料ですか?

はい。「部分関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「部分関数」で何を学びますか?

functools.partialを使用します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「部分関数」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 第一級関数
  2. クロージャと自由変数
  3. nonlocalと可変状態
  4. 部分関数
← Python Academyに戻る