前言:
Python函数的一等本性,这意味着,我们可以把函数赋值给变量、传给其他函数、存储在数据结构中,以及访问函数的属性,供框架和一些工具使用。
目录:
- 内容回顾
- 相关资料
- 阅读后感
正文:
一. 内容回顾
1.1 把函数视作对象
通过别的名称使用函数,再把函数作为参数传递,典型的函数式编程。如下:
# -*- coding:utf-8 -*-
def factorial(n):
return n
fact = factorial
print fact(2)
1.2 高阶函数
接受函数为参数,或者把函数作为结果返回的函数是高阶函数。如下:
# -*- coding:utf-8 -*-
def call_function(func):
print ("callFunc.")
func()
def function():
print ("call function")
call_function(function)
1.3 匿名函数
lambda关键字在python表达式内创建匿名函数
1.4 可调用对象
Python中有各式各样可调用的类型,因此判断对象能否调用,最安全的方法是使用内置的callable()函数
1.5 用户定义的可调用类型
不仅python函数是真正的对象,任何python对象都可以表现得像函数,为此,只需实现实例方法_ call _。
# -*- coding:utf-8 -*-
import random
class BingoCage:
def __init__(self, items):
self._items = list(items)
random.shuffle(self._items)
def pick(self):
try:
return self._items.pop()
except IndexError:
raise LookupError("pick from empty BingoCage")
def __call__(self, *args, **kwargs):
return self.pick()
bingo = BingoCage(range(3))
print callable(bingo)
1.6 函数内省
除了doc,函数对象还有很多属性。使用dir函数可以探知
1.7 从定位参数到仅限关键字参数
1.8 获取关于参数的信息
1.9 函数注解
1.10 支持函数式编程的包
Python的目标不是变成函数式编程语言,但是有益于operator和functools等包的支持,函数式编程风格也可以信手拈来。
二. 相关资料
2.1 高阶函数
要理解“函数本身也可以作为参数传入”,可以从Python内建的map/reduce函数入手。
2.2 可调用函数
class route(object):
def __init__(self, res)
self.resource = res
@classmethod
def factory(cls):
print 'factory'
return cls()
@webob.dec.wsgify
def __call__(self,req):
print 'route __call__'
return self.resource()
class resource(object):
@webob.dec.wsgify
def __call__(self,req):
print 'resource __call__'
class API(route):
def __init__(self):
res = resource()
super(API, self).__init__(res)
wsgi.server(eventlet.listen(('', 80)), API.factory())
2.3 函数注解
Python 3.x 引入了函数注释,以增强函数的注释功能,下面是一个普通的自定义函数:
def dog(name, age, species):
return (name, age, species)
添加了注释的自定义函数:
def dog(name:str, age:(1, 99), species:'狗狗的品种') -> tuple:
return (name, age, species)
如上,可以使用:对参数逐个进行注释,注释内容可以是任何形式,比如参数的类型、作用、取值范围等等,返回值使用->标注,所有的注释都会保存至函数的属性。
2.4 operator模块
operator模块是python中内置的操作符函数接口,它定义了一些算术和比较内置操作的函数。operator模块是用c实现的,所以执行速度比python代码快。
相关运算符: https://docs.python.org/2/library/operator.html
2.5 functools模块
这个模块提供了3个有趣的函数:
1.partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象
2.update_wrapper函数,它可以把被封装函数的name、module、doc和 dict都复制到封装函数去
3.wraps函数,它将update_wrapper也封装了进来
三. 阅读后感
阅读本章节对函数有了更深的理解,函数不仅仅是平时写的一些静态函数,类成员函数,还可以把函数当作对象,正如Python提倡的一切皆对象。
参考:
1. Python operator 模块简单介绍
2. Python 的函数注释
3. Python可调用对象call方法的用法分析
4. Python的functools模块
5. Python 高阶函数