• python函数式编程之返回函数、匿名函数、装饰器、偏函数学习



    python函数式编程之返回函数

    高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回。

    • 函数作为返回值

        def laxy_sum(*args):
        	def sum():
        		ax = 0;
        		for n in args:
        			ax = ax + n;
        		return ax;
        	return sum;
        
        print(laxy_sum(1, 3, 5, 7));
        # <function laxy_sum.<locals>.sum at 0x000001F2E3272F28>返回一个函数而不是一个值
      

    在这个函数中,内部函数sum可以引用外部函数laxy_sum的参数和局部变量,当外部函数返回函数sum时,相关参数和变量都保存在返回的函数中,这种情况称为“闭包”个人觉得和JavaScript的闭包很相似,这种程序结构拥有极大的威胁。
    当我们调用lazy_sum时,每次调用都会返回新的函数,即使传入相同的参数。

    • 闭包
      当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回的函数并没有立即执行,而是直到调用了外部函数才执行

    python函数式编程之匿名函数

    当我们在传入函数时,有时候不需要显式的定义函数,而是直接传入匿名函数。
    匿名函数就是没有函数名的函数,python用关键字lambda表示匿名函数,冒号前面的x表示函数的参数

    #匿名函数
    p = list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6]));
    print(p);
    # [1, 4, 9, 16, 25, 36]
    

    匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

    python函数式编程之装饰器

    由于函数也是一个对象,函数对象也可以赋值给变量,所以我们可以通过变量也能调用函数。

    def now():
    	print('2017-11-22');
    	
    f = now;
    print(f());# 2017-11-22
    

    函数对象有一个属性__name__属性,可以拿到函数的名字:像上面的例子就可以用 f.__name__取到函数的名字now

    在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。如,在函数now调用前后自动打印日志,但又不希望修改now()函数的定义。装饰器本质上是一个干返回函数的高阶函数。

    def log(func):
    	def wrapper(*args, **kw):
    		print('call %s():' % func.__name__);
    		return func(*args, **kw);
    	return wrapper;
    
    @log
    def now():
    	print('2017-11-22');
    
    print(now());
    # call now():
    # 2017-11-22
    

    Python的@语法后续

    python函数式编程之偏函数

    • 简单理解
      如int()函数可以把字符串转换成整数形式:

        print(int("1234"));#字符串转换成整数
      

    int函数还提供了base参数,用来把字符串转换成N进制的数,默认是10.

    	print(int("12345", base=8));
    

    但是当我们要进行很多的值转换的时候,一个个传入函数的话,就会很低效,那么我们就可以编写一个这样的函数,让他能实现我们的想法。

    	def int2(x, base=2):
    		return int(x, base)
    	
    	print(int2("100001"));#33
    	print(int2("1101110"));#110
    

    向上面这样我们就不用多次输入int(x, base=n),python的functools.partial就帮我们创建了一个偏函数,不需要我们编写函数int2,可以直接创建一个int2函数:

    	#偏函数
    	import functools;
    	int2 = functools.partial(int, base=2);
    	print(int2("11101"));#29
    

    所以,functools.partial的作用就是,把一个函数的某些参数设置默认值,返回个新的函数,调用这个新函数会更简单。但也可以传入其他的值,如:int2("10010", base=10);

    • 总结
      当我们函数参数个数很多,需要简化时,我们可以使用python的functools.partial来创建一个偏函数来固定一些参数,使得我们在使用新函数的时候更加方便。
  • 相关阅读:
    java并发
    jvm虚拟机
    L2Dwidget二次元前端添加人物插件
    MySQL数据库之rowid
    MySql支持emoji表情设置
    zookeeper不能正常启动问题(转)
    jd-gui-windows-1.6.6.zip反编译工具
    为什么es集群至少需要三个节点(转)
    超好用的uniapp弹出层
    netcore5.0 使用新的Microsoft.Data.SqlClient
  • 原文地址:https://www.cnblogs.com/yehui-mmd/p/7886767.html
Copyright © 2020-2023  润新知