0Pricing
Python Academy · レッスン

第一級オブジェクトとしての関数

クロージャーと、関数を引数として渡す方法を理解します。

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

導入

Pythonでは、関数は第一級オブジェクトです。引数として渡したり、返り値として返したり、データ構造に格納したりできます。

関数はオブジェクト

def double(x): return x*2は関数オブジェクトを作成します。doubleは単なる名前です。fn = doubleのように代入でき、fn(5)も実行できます。
def double(x): return x * 2
fn = double
print(fn(5))
print(type(fn))

関数を引数として渡す

def apply(func, val): return func(val)では、funcが呼び出し可能な引数です。これは高階プログラミングの一例です。
def apply(func, val): return func(val)
print(apply(abs, -7))
print(apply(str, 42))

関数をコンテナに格納する

ops = [add, sub, mul]は関数オブジェクトをリストに格納します。for op in ops: op(a, b)のように反復して呼び出せます。
ops = [str.upper, str.lower, str.strip]
for op in ops:
    print(op('  Hello  '))

関数を返す

関数は別の関数を返せます。def make_adder(n): def adder(x): return x+n; return adderのように記述します。
def make_adder(n):
    def adder(x): return x + n
    return adder
add10 = make_adder(10)
print(add10(5), add10(20))

クロージャ

クロージャは、外側のスコープにある変数を取り込みます。内側の関数は、make_adder内のnを「閉じ込めて」参照します。
def counter(start=0):
    count = [start]
    def inc():
        count[0] += 1
        return count[0]
    return inc
c = counter()
print(c(), c(), c())

無名関数としてのラムダ

lambda x: x*2は、1つの式で構成された無名関数です。短いコールバックに便利ですが、ロジックが複雑な場合は名前を付けてください。
nums = [3, 1, 4, 1, 5]
print(sorted(nums, key=lambda x: -x))

map()とfilter()

map(func, iterable)は各要素にfuncを適用します。filter(pred, iterable)はpredがTrueになる要素だけを残します。
nums = [1, 2, 3, 4, 5]
print(list(map(lambda x: x**2, nums)))
print(list(filter(lambda x: x%2==0, nums)))

functools.reduce()

reduce(func, seq)はシーケンスを畳み込みます。reduce(lambda a,b: a+b, [1,2,3,4])の結果は10です。
from functools import reduce
print(reduce(lambda a,b: a*b, [1,2,3,4,5]))

呼び出し可能性の確認

callable(obj)は、objを呼び出せる場合にTrueを返します。関数、クラス、__call__を持つオブジェクトは呼び出し可能です。
print(callable(print))
print(callable(42))
class C:
    def __call__(self): pass
print(callable(C()))

関数のイントロスペクション

func.__name__、func.__doc__、func.__annotations__、inspect.signature(func)を使うと、関数のメタデータを取得できます。
import inspect
def greet(name: str) -> str:
    '''Returns a greeting.'''
    return f'Hi {name}'
print(greet.__name__, greet.__annotations__)
print(inspect.signature(greet))

クイックチェック

Pythonにおけるクロージャとは何ですか?

復習

関数は第一級オブジェクトです。引数として渡したり、関数から返したり、コンテナに格納したりできます。クロージャは外側のスコープを取り込みます。単純な1行処理にはlambdaを使います。

学習を続ける

素晴らしい進み具合です。次の概念を身につけるために、このまま学習を続けてください。

よくある質問

「第一級オブジェクトとしての関数」レッスンは無料ですか?

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

「第一級オブジェクトとしての関数」で何を学びますか?

クロージャーと、関数を引数として渡す方法を理解します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「第一級オブジェクトとしての関数」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. 第一級オブジェクトとしての関数
  2. カスタムデコレーターの作成
  3. @property デコレーター
  4. @classmethod と @staticmethod
← Python Academyに戻る