目录
匿名函数
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