Python 函数对象本质上是 function 类的实例。

1 从示例说起

def factorial(n):
'''return n!'''
return 1 if n < 2 else n * factorial(n - 1) r = factorial(42)
logging.info('r -> %s', r)
logging.info('__doc__ -> %s', factorial.__doc__)
logging.info('type(factorial) -> %s', type(factorial))
复制代码

运行结果:

INFO - r -> 1405006117752879898543142606244511569936384000000000
INFO - __doc__ -> return n!
INFO - type(factorial) -> <class 'function'>
复制代码

这个示例首先定义了一个计算斐波那契数列的函数,可以看到 type(factorial) 的返回值是 <class 'function'>。也就验证了函数对象是 function 类的实例。

示例中还使用函数的 __doc__ 属性输出了函数定义中的注释。这一点比 Java 强大,Java 必须把注释定义在注解中才能通过代码获取到。

2 help 函数

python 中还有一个 help 函数,它可以接受一个自定义函数作为入参,然后输出该函数的说明文档。形如:

help(factorial)
复制代码

运行结果:

Help on function factorial in module __main__:

factorial(n)
return n!
复制代码

3 函数别名与函数传参

函数可以赋值给变量,也可以作为其他函数的入参。

f = factorial
logging.info('f -> %s', f)
logging.info('f(5) -> %s', f(5)) r = map(factorial, range(11))
logging.info('r -> %s', r) r = list(map(f, range(11)))
logging.info('r -> %s', r)
复制代码

运行结果:

INFO - f -> <function factorial at 0x0000027278917798>
INFO - f(5) -> 120
INFO - r -> <map object at 0x000002727893F588>
INFO - r -> [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
复制代码

示例中首先把之前定义的斐波那契数列函数赋值给变量 f;可以看到这个变量本身就是 factorial 函数的引用。还可以像使用 factorial 函数一样,直接给 f 函数传参,计算出想要的斐波那契数列结果。

接着把 factorial 函数传入 Python 的 map() 函数。map() 函数的语法为:map(function, iterable, ...),它会以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表2

因为在 Pyhon 3.x 中 map() 函数只返回迭代器,所以示例中对其进行 list 转换。这样就输出了从 0 到 11 作为入参的各自斐波那契结果列表。因为 range() 函数的语法为:range(start, stop[, step]),默认从 0 开始3,所以范围是从 0 到 11。

函数与整数、字符串与字典一样,它们都是 Python 世界中的一等公民。

交流基地:630390733

Python 函数对象的本质的更多相关文章

  1. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

  2. Python函数对象

    秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也是一个对象,具有属性(可以使用dir()查询).作为对象,它还可以赋值给其它对象名,或者作为参数传递. lambda函数 在展开 ...

  3. Python -- 函数对象

    转自:http://www.cnblogs.com/vamei/archive/2012/07/10/2582772.html 秉承着一切皆对象的理念,我们再次回头来看函数(function).函数也 ...

  4. python函数对象和闭包

    关于函数对象和闭包 闭包(closure)是函数式编程的重要的语法结构.不同的语言实现闭包的方式不同.Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看 ...

  5. python 函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def fo ...

  6. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  7. python函数对象-命名空间-作用域-02

    函数对象 函数是第一对象: # 函数名指向的值可以被当做参数传递 函数对象的特性(*****灵活运用,后面讲装饰器会用到) 函数名可以像变量一样被传递 # 变量可以被传递 name = 'jason' ...

  8. python 函数对象、函数嵌套、名称空间与作用域

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素二 利用该特性,优雅的取代多分支的if def ...

  9. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

随机推荐

  1. Redis多线程原理详解

    本篇文章为你解答一下问题: 0:redis单线程的实现流程是怎样的? 1:redis哪些地方用到了多线程,哪些地方是单线程? 2:redis多线程是怎么实现的? 3:redis多线程是怎么做到无锁的? ...

  2. Forethought Future Cup - Final Round (Onsite Finalists Only) C. Thanos Nim 题解(博弈+思维)

    题目链接 题目大意 给你n堆石子(n为偶数),两个人玩游戏,每次选取n/2堆不为0的石子,然后从这n/2堆石子中丢掉一些石子(每一堆丢弃的石子数量可以不一样,但不能为0),若这次操作中没有n/2堆不为 ...

  3. Java基础教程——封装

    面向对象的三大特征 封装:encapsulation 继承:inheritance 多态:polymorphism 封装 类是一个最基本的封装 封装的好处: 数据安全:保证数据安全 方便调用:提供清晰 ...

  4. golang实现mysql udf

    UDF(user-defined function) 当mysql提供的内置函数(count,min,max等)无法满足需求时,udf用于扩展自定义函数,满足特定查询需求. 在这里,假定一种db应用场 ...

  5. Beta冲刺随笔——Day_Three

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Beta冲刺 作业正文 正文 其他参考文献 无 今日事今日毕 林涛: ...

  6. 学习abp vnext框架到精简到我的Vop框架

    学习目标 框架特点 基于.NET 5平台开发 模块化系统 极少依赖 极易扩展 ....... 框架目的 学习.NET 5平台 学习abp vnext 上图大部分功能已经实现,多数是参考(copy)ab ...

  7. 掌握 Promise 的逻辑方法

    Promise 是 ES2015 新增的对象 Promise 对象有几个组合方法,可以将多个承诺合并成一个进行处理 分别是 Promise.all, Promise.race, Promise.all ...

  8. 【手把手学习flutter】Flutter打Android包的基本配置和包体积优化策略

    [手把手学习flutter]Flutter打Android包的基本配置和包体积优化策略 关注「松宝写代码」,回复"加群" 加入我们一起学习,天天向上 前言 因为最近参加2020FE ...

  9. PyQt(Python+Qt)学习随笔:QDockWidget停靠部件的setTitleBarWidget方法

    setTitleBarWidget方法用于给停靠窗口设置个性化的标题栏,调用语法如下: setTitleBarWidget(QWidget widget) 说明: widget参数可以是任意一个QWi ...

  10. PyQt(Python+Qt)学习随笔:QTreeWidget的columnCount属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 树型部件中的每个项有一个或多个文字标签或其他装饰符(如图标),这些内容每个显示为一列.QTreeWi ...