流畅的python第五章一等函数学习记录
在python中,函数是一等对象,一等对象是满足以下条件的程序实体
1在运行时创建
2能复制给变量或数据结构的元素
3能作为参数传给函数
4能作为函数的返回结果
高阶函数(接受函数作为参数或者把函数作为结果返回的函数),如map和sorted函数
最为人熟知的高阶函数有map,filter,reduce和apply,apply在python3中移除了
map,filter和reduce的替代品
map和filter现在可以使用列表推导来替代
reduce在python2是内置函数,python3中放到functools模块里了。最常用于求和,现在最好使用内置sum函数,可读性和性能更高。
匿名函数
lambda关键字在python表达式内创建匿名函数
除了作为参数传给高阶函数,python很少使用匿名函数,由于句法的限制,非平凡的lambda表达式要么难以阅读要么无法写出
如果lambda表达式导致一段代码难以理解,建议进行以下重构
1编写注释,说明lambda表达式的作用
2研究注释,找出一个名称来概括注释
3把lambda表达式转换成def语句,使用那个名称来定义函数
4删除注释
可调用对象
如果想判断对象能否调用,可以使用内置的callable()函数,python数据模型文档列出了7种可调用对象
1用户定义的函数(使用def语句或lambda表达式创建)
2内置函数(使用c语言或者CPython实现的函数,如len或time.strftime)
3内置方法(使用c语言实现的方法,如dict.get)
4方法(在类的定义体中定义的函数)
5类
6类的实例(如果类定义了__call__方法,那么它的实例可以作为函数调用)
7生成器函数(使用yield关键字的函数或方法,调用生成器函数返回的是生成器对象)
用户定义的可调用类型
只需实现实例方法__call__,任何python对象都可以表现的像函数
函数自省
用dir函数可以查看函数对象有哪些属性或者方法
从定位参数到仅限关键词参数
获取关于参数的信息
函数对象有个__defaults__属性,它的值是一个元组,里面保存着定位参数和关键字参数的默认值。仅限关键字参数的默认值在__kwdefaults__属性中。然而,参数的名称在__code__属性中,它的值是一个code对象引用,自身也有很多属性。
参数名称在__code__.co_varnames中,里面还有函数定义体中创建的局部变量,因此,参数名称是前N个字符串,N的值由__code__.co_argcount确定。顺便说一下,这里不包含前缀为*或** 的变长参数。参数的默认值只能通过他们在__defaults__元组的位置确定,因此要从后向前扫描才能把参数和默认值对应起来
更好的方式
函数注解
这个函数注解目前看来没什么用
支持函数式编程的包
operator模块
operator模块中定义的部分函数
使用functools.partical冻结参数