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

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

目录:

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

正文:
一. 内容回顾
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函数,它可以把被封装函数的namemoduledocdict都复制到封装函数去
3.wraps函数,它将update_wrapper也封装了进来

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值