作为一等对象的函数
了解闭包,以及如何将函数作为参数传递。
作为一等对象的函数 是 CoddyKit 上的免费 Python Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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
lambda x: x*2 是一个只包含一个表达式的匿名函数。它适合用作简短的回调,但如果逻辑并不简单,请为其命名。
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 中,什么是闭包?
回顾
函数是一等对象。您可以将函数作为参数传递、从函数中返回函数,或将函数存储在容器中。闭包会捕获外层作用域。lambda 适合简单的单行函数。
继续学习
进步非常出色!请继续学习,掌握下一个概念。
常见问题解答
「作为一等对象的函数」课时是免费的吗?
是的 — 「作为一等对象的函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「作为一等对象的函数」这节课中我会学到什么?
了解闭包,以及如何将函数作为参数传递。 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「作为一等对象的函数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。