流程的Python 第五章:一等函数

来源:互联网 发布:twitter第三方登录js 编辑:程序博客网 时间:2024/06/07 12:15

前言:
Python函数的一等本性,这意味着,我们可以把函数赋值给变量、传给其他函数、存储在数据结构中,以及访问函数的属性,供框架和一些工具使用。

目录:

  1. 内容回顾
  2. 相关资料
  3. 阅读后感

正文:
一. 内容回顾
1.1 把函数视作对象
通过别的名称使用函数,再把函数作为参数传递,典型的函数式编程。如下:

# -*- coding:utf-8 -*-def factorial(n):    return nfact = factorialprint 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 randomclass 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函数,它可以把被封装函数的namemoduledocdict都复制到封装函数去
3.wraps函数,它将update_wrapper也封装了进来

三. 阅读后感
阅读本章节对函数有了更深的理解,函数不仅仅是平时写的一些静态函数,类成员函数,还可以把函数当作对象,正如Python提倡的一切皆对象。

参考:
1. Python operator 模块简单介绍
2. Python 的函数注释
3. Python可调用对象call方法的用法分析
4. Python的functools模块
5. Python 高阶函数

原创粉丝点击