函数式编程:匿名,高阶,装饰器

目录

 

匿名函数

map 

map与lambda表达式

reduce

filter

 装饰器


匿名函数

lambda parameter_list(参数列表):expressions(表达式)

(表达式的计算结果作为函数的返回结果)

f = lambda x,y:x+y
f(1,2)   
# 3

三元(表达式)
格式:条件为真的返回结果 if 判断语句 else 条件为假时的返回结果。 

map 

map(func, *iter)

对可迭代的iter中的每一项都执行func函数,返回每项值组成的map对象。

list_x = [1, 2, 3, 4, 5]

def square(x):
	return x * x

y = map(square, list_x)
print(y)
# <map object at 0x0174EC50>
print(list(y))
# [1, 4, 9, 16, 25]

map与lambda表达式

list_x = [1, 2, 3, 4, 5]
list_y = [1, 2, 3]

p = map(lambda x, y: x+y, list_x, list_y)
print(list(p))
# [2, 4, 6]

reduce

from functools import reduce

list_x = [1, 2, 3, 4, 5]

# reduce(function, sequence, initial)
# reduce(函数,序列,初始值)
# 连续计算,连续调用lambda
f = reduce(lambda x, y: x*y, list_x)
#(如果给定第三个参数,比如10,首先乘10,即(10*1))
# ((((1*2)*3)*4)*5)
print(f)
# 120

filter

filter(function, iter)
其中function必须是一个能够返回真假的条件函数,对应于lambda的条件表达式,如果返回真,保存序列中的内容,否则剔除序列中的内容。

list_x = [1, 0, 2, 3, 0]

f = filter(lambda x: True if x else False, list_x)
# 如果x为真,返回True,即保留列表中的值,反之,剔除列表值。
# 返回的f是一个filter对象。
print(list(f)) 
# [1, 2, 3]

 装饰器

当项目发生变更或有新需求时,遵循的原则之一是:对修改关闭,对拓展开放,即开闭原则。

import time

def f1():
	print("Hello!")

def decorator(func):
	def wrapper():
		print(time.time())
		func()

	return wrapper

# 像不像一个闭包,不同之处是,func不是一个环境变量,而是一个函数。
f = decorator(f1)
# 返回的f是一个function类型的装饰器
# <function decorator.<locals>.wrapper at 0x02EC2030>
print(f)
f()
# 1549806921.7158382
# Hello!

#(这种方法内聚性更高,但并没有解决原函数和新业务逻辑的关联性问题。)

 (划重点:语法糖)

@decorator
def f1():
	print("Hello!")

f1()
# ::输出
# 1549806921.7158382(当然时间戳会增加)
# Hello!

(完整的装饰器,直接调用f1(),就可以增加新功能。)

(如果函数有参数呢,装饰器应该能够被多个函数应用,如果f1有一个参数,f2有3个参数呢,答案是采用可变参数。*args)
(f3有个关键字参数,**kw,kw返回一个包含所有关键字及其值的字典,--> 采用关键字参数)

import time

def decorator(func):
	def wrapper(*args, **kw):
		print(time.time())
		func(*args, **kw)

	return wrapper

@decorator
def f1(name):
	print("Hello! " + name)

f1("alice")
# 1549808908.4930415
# Hello! alice

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值