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来创建一个偏函数来固定一些参数,使得我们在使用新函数的时候更加方便。
posted @ 2017-11-23 20:13  美美王子  阅读(225)  评论(0编辑  收藏  举报