python学习——函数式编程——返回函数篇

python——函数式编程——返回函数篇

1:返回函数
  • 一个函数可以返回一个计算结果,也可以返回一个函数。
  • 返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。

2:匿名函数
  • 关键字lambda表示匿名函数,冒号前面的x表示函数参数(例:lambda x: x * x
  • 匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
  • 匿名函数有个好处,因为没有名字,不必担心函数名冲突。匿名函数是一个函数对象,可以把匿名函数赋值给一个变量,再利用变量来调用该函数。
3:装饰器
  • 这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。本质上,decorator就是一个返回函数的高阶函数。
  • 函数对象有一个__name__属性,可以拿到函数的名字。
  • 在面向对象(OOP)的设计模式中,decorator被称为装饰模式。OOP的装饰模式需要通过继承和组合来实现,而Python除了能支持OOP的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数实现,也可以用类实现。

# 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call'的日志。

import functools

def log(func):
    @functools.wraps(func) # wrap '__name__'
    def wrapper(*args, **kw):
        print("begin call [%s]" % (func.__name__))
        func_tmp = func(*args, **kw)
        print("end call [%s]" % (func.__name__))
        return func_tmp
    return wrapper

@log # 借助Python的@语法,把decorator置于函数的定义处
def hello():
    print("hello")

hello()
结果:

begin call [hello]
hello
end call [hello]
>>> 

'''思考一下能否写出一个@log的decorator,使它既支持:@log
                                                def f():
                                                pass
又支持:@log('execute')
        def f():
        pass '''
import functools

def log(text):
    def decorator(func):
        @functools.wraps(func) # wrap '__name__'
        def wrapper(*args, **kw):
            if (None != text):
                print("[%s]begin call [%s]" % (text, func.__name__))
                func_tmp = func(*args, **kw)
                print("[%s]end call [%s]" % (text, func.__name__))
            else:
                print("begin call [%s]" % (func.__name__))
                func_tmp = func(*args, **kw)
                print("end call [%s]" % (func.__name__))
            return func_tmp 
        return wrapper

    if isinstance(text, str):
        return decorator
    else:
        strtmp = text
        text = None
        return decorator(strtmp)

@log
def hello():
    print("hello")
hello()

@log('>>>world')
def hello():
    print("hello")
hello()
结果:

begin call [hello]
hello
end call [hello]
[>>>world]begin call [hello]
hello
[>>>world]end call [hello]
>>> 
4:偏函数
  • 当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

----------------------------------------------------------------------------------------------------------------------------

参考网站:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

----------------------------------------------------------------------------------------------------------------------------


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课程概述教会学员快速学会python数据分析,覆盖python基础,pandas,seaborn,matplotlib,SQL,sqlite,lambda等知识。课程是数据科学家居家必备的军火库。课程定期更新,大部分视频分辨率支持2K超清,学员可以看清每一行代码。 适合人群python数据科学从业人员,数据分析师,统计 学习计划和方法1.每天保证1-2个小时学习时间,预计7-15天左右可以学习完整门课程(不同基础学生时间差异较大)。2.每节课的代码实操要保证,建议不要直接复制粘贴代码,自己实操一遍代码对大脑记忆很重要,有利于巩固知识。3.第二次学习时要总结上一节课内容,必要时做好笔记,加深大脑理解。4.不懂问题要罗列出来,先自己上网查询,查不到的可以咨询老师。 作者介绍Toby,持牌照金融公司担任模型验证专家,国内最大医药数据中心数据挖掘部门负责人!和清华大学出版社,重庆儿科医院,中科院教授,赛柏蓝保持慢病数据挖掘项目合作!管理过欧美日中印巴西等国外药典数据库,马丁代尔数据库,FDA溶解度数据库,临床试验数据库,WHO药物预警等数据库。原创公众号(python风控模型) 课程概述教会学员快速学会python数据分析,覆盖python基础,pandas,seaborn,matplotlib,SQL,sqlite,lambda等知识。课程是数据科学家居家必备的军火库。课程定期更新,大部分视频分辨率支持2K超清,学员可以看清每一行代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值