Python 函数对象的本质
2024-09-01 19:41:42
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
最新文章
- java之多线程 一
- js获取浏览器前缀
- PHP 检测变量是否为空
- C++单元测试 之 gtest -- 组合数计算.
- Spring入门(3)-Spring命名空间与Bean作用域
- 【技术贴】note8 N5100刷机 双清 落雨
- 3 视频里weekend05、06、07的可靠性 + HA原理、分析、机制 + weekend01、02、03、04、05、06、07的分布式集群搭建
- python-线程、进程、协程
- CSS3 font-face使用
- HTML5元素标记释义
- Android 图片高级绘图效果---高斯模糊
- Windows Azure中国版试用
- (5)Java数据结构--有继承图,用途分析
- phpcms栏目点击选中
- 一个简单的加载动画,js实现
- 我的TDD实践---TDD概念篇
- AIX上打包排除某些文件/文件夹
- pandas绘图总结
- antd在线换肤定制功能
- tomcat-架构原理
热门文章
- PHP 获取本周、今日、本月的起始时间戳
- .Net Core官方的 JWT 授权验证
- vs2019 Com组件初探-简单的COM编写以及实现跨语言调用
- Alpha冲刺-第五次冲刺笔记
- charles 常用功能(七)简易接口压力测试(repeat advance 功能)
- MongoEngine模块
- c++11-17 模板核心知识(十三)—— 名称查找与ADL
- Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法
- Android夜神模拟器
- Python中错误之 TypeError: object() takes no parameters、TypeError: this constructor takes no arguments