如何编写自己的函数来接受并使用函数作为参数?

安格斯坎贝尔

我在标准库和主要第三方库中看到了几个接受函数作为输入的函数(和方法)的例子。

例如,考虑Pandas的apply方法DataFrame该方法的文档建议您可以将另一个函数传递给该函数例如sum()numpy.sqrt()apply(sum)apply(numpy.sqrt)

同样,标准库sorted函数明确记录了

key指定一个参数的函数,用于从iterable中的每个元素中提取比较键(例如,key=str.lower)。

我如何编写自己的函数以这种方式工作,接受一个函数作为输入之一?

hc_dev

接受其他函数作为参数或返回函数的函数称为高阶函数

所以 Panda'sapply()是一个高阶函数它接受另一个函数,如 egsum并在内部调用或调用它作为sum(args).

要定义接受函数作为参数的高阶函数,请使用签名,就像普通函数一样。

在下面的示例中,这将是def md_heading(phrase):.

如何调用功能参数(不带参数)

查看如何调用预期为函数的参数:

def md_heading(phrase):
    return "# " + phrase()

笔记:

  • 该参数在这里被命名为变量名 - 而不是像 Panda 的apply(func).
  • 这个参数仍然phrase应该是一个函数引用,因为它将使用括号(不带参数)调用。
  • md_heading()是包装函数,phrase函数参数。

传递文字

现在尝试将像 `'Hello World' 这样的字符串文字作为参数传递时会发生什么。

result = md_heading('Hello World')  # this would pass it in, then try to call it .. and ?
print(result)

作为参数传递的字符串的调用将引发错误。正是在该声明return "# " + phrase()中:

TypeError: 'str' object is not callable

将函数(引用)作为参数传递

现在您应该将函数作为参数传递,但只是作为参考(不带括号):

def greeting():
   return 'Hi'

result = md_heading(greeting)
print(result)

印刷:Hi

将 lambda 作为参数传递

或者你可以传递一个 lambda 作为参数:

result = md_heading(lambda: "Hello!")
print(result)

印刷:'Hello!

注意: lambda 不能有位置参数。这接近于传递一个常量,就像从头开始的字符串一样。

传递 lambda 时没有(必需)参数

当我们像lambda name: "Hello " + name这里这样使用位置参数定义 lambda 时,它会引发:TypeError: <lambda>() missing 1 required positional argument: 'name'因为在我们的高阶函数中,它是在没有参数的情况下调用的,就像phrase().

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何编写一个scala函数来接受两种类型的参数?

如何编写一个TypeScript函数来接受将接口实现为参数的类?

如何使用泛型作为参数来接收以后应用特定方法的函数?

如何创建一个函数来接受参数并在调用时增加参数?

iOS 如何制作一个函数来接受向 NSCoding 确认的参数

如何发送内嵌表作为参数来接收表函数?

定义一个函数来接受特定的列表参数

如何使用列表作为参数编写函数

如何创建一个函数来接受串联的源值-Excel VBA

如何编写自己的函数来匹配字符串模式?

如何编写接受单个参数的构造函数?

有没有办法声明一个函数参数来接受一个匿名枚举?

Kotlin如何使setOnClickListener接受函数作为参数

如何接受异步函数作为参数?

编写仅接受文字“ 0”或文字“ 1”作为参数的函数

如何在Java中使用接受扩展接口类型的参数的函数来创建接口?

如何编写一个接受列表作为参数并返回列表中值总和的函数?

C ++如何制作接受类函数作为参数的函数重载

使用dict作为函数的输入,但仅接受函数需要的参数

如何在Python中使用函数对象和值作为参数来实现双阶乘

接受模板作为函数参数

无法合并类型为DbContext的DbContext,因为它没有单个公共构造函数来接受类型为DbContextOptions的单个参数

如何编写函数来循环使用ggplot进行变量绘制

如何使用某些函数来避免编写 for 循环?

函数使用智能感知来接受多个枚举

函数接受函数作为模板类型的参数

如何使用回调函数作为参数,其中有自己独立的参数?

如何编写以可变参数作为模板参数的成员函数

如何编写自己的max函数