流畅的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冻结参数

 

posted @ 2018-01-25 10:09  菲菲菲菲菲常新的新手  阅读(167)  评论(0编辑  收藏  举报