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

12-1 lambda表达式。

# 12-1 lambda表达式。
# 匿名函数
def add(x,y):#这是非匿名函数
    return x+y

# 如何把上述非匿名函数转换成匿名函数?
lambda parameter_list:expression  #这是匿名函数的标准形式
lambda x,y: x+y#对应标准形式填写参数列表跟函数表达式(注意是表达式,而不是代码块)

#看看完整的书写格式

def add(x,y):
    return x+y
print(add(1,2))

f = lambda x,y: x+y
print(f(1,2))
# 打印结果如图1所示

image

12-2 三元表达式

# 三元表达式(表达式版本的if  else  语句)
# Q1:两个数字,x , y,哪个值大取哪个!!!使用三元表达式
# Python版本的三元表达式代码
# 条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果
x if x > y else y #这仅仅是个表达式
# 要想有打印结果,必须用变量接收,比如:r = x if x > y else y ,看看完整代码
x = 2
y = 1
r = x if x > y else y
print (r)
# 如图2所示

image

12-3 map

# 12-3 map类
# 看看map这个类用在什么场景下!!!
# Q1:求下面列表的数字的平方,组成的新列表
list_x = [1,2,3,4,5,6,7,8]
def square():
    return x * x

#方法1:
for x in list_x:
    square(x)

# 方法2
list_x = [1,2,3,4,5,6,7,8]
def square(x):
    return x * x

r = map(square,list_x)
print(list(r))
#打印结果如图1

image

12-4 map与lambda

# 12-4 map与lambda
# 看看两者的应用

list_x = [1,2,3,4,5,6,7,8]

r = map(lambda x: x*x ,list_x)
print(list(r))
# 打印结果如图1 

# 再看几个稍微复杂点的例子
list_x = [1,2,3,4,5,6,7,8]
list_y = [1,2,3,4,5,6,7,8]
r = map(lambda x,y: x*x+y,list_x,list_y)
print(list(r))
# 打印结果如图2

list_x = [1,2,3,4,5,6,7,8]
list_y = [1,2,3,4,5,6,]
r = map(lambda x,y: x*x+y,list_x,list_y)
print(list(r))
# 打印结果如图2

list_x = [1,2,3,4,5,6]
list_y = [1,2,3,4,5,6,7,8]#打印结果取决于列表较短的那个
r = map(lambda x,y: x*x+y,list_x,list_y)
print(list(r))
# 打印结果如图2

image
image

12-5 reduce

# 12-5 reduce
# reduce使用方法
from functools import reduce
list_x = [1,2,3,4,5,6,7,8]
# 连续计算,连续调用lambda,reduce中,没有传入y,也能有计算结果的原因就是因为可以连续计算
r = reduce(lambda x,y:x+y,list_x)
print(r)
# 打印结果如图1
# (((1+2)+3)+4)这就是计算的过程

# 看看reduce的最后一个参数
from functools import reduce
list_x = [1,2,3,4,5,6,7,8]
# 连续计算,连续调用lambda,reduce中,没有传入y,也能有计算结果的原因就是因为可以连续计算
r = reduce(lambda x,y:x+y,list_x,10)#最后一个参数是初始值
print(r)
# 打印结果如图2
# 运行结果如下:(((10+1)+2)+3)

# 用下面的参数更好的看出结果:
from functools import reduce
list_x = ['1','2','3','4','5','7','8']
r = reduce(lambda x,y:x+y,list_x,'a')#最后一个参数是初始值
print(r)
# 打印结果如图3

image
image
image

12-8 装饰器 一

# 12-8 装饰器 一
import time 
def f1():
    print(time.time())
    print('this is a function')
f1()
# 打印结果如图1

# 如果有一百个函数需要打印出时间怎么办?
# 对修改是封闭的,对扩展是开放的。需求如果改变,尽量不要去修改函数,要去修改扩展,适应需求变更
# 看看下面的代码!

import time 
def f1():
    print('this is a function')

def f2():
    print('this is a function')

def print_current_time(func):
    print(time.time())
    func
print_current_time(f1)
print_current_time(f2)
# 打印结果如图2
# 不用装饰器还是有缺点的

image
image

12-9 装饰器 二

# 12-9 装饰器 二
import time

def decorator(func):#定义装饰器的外部函数
    def wrapper():#装饰器内部定义一个函数(被封装的)
        print(time.time())
        func()
    return wrapper 

def f1():
    print('this is a function')

f = decorator(f1)
f()

# 打印结果如图1

# 注意与上一节对比,发现没有什么大的不同

image
# 12-10 装饰器 二
import time

def decorator(func):#定义装饰器的外部函数
    def wrapper():#装饰器内部定义一个函数(被封装的)
        print(time.time())
        func()
    return wrapper 

def f1():
    print('this is a function')

f = decorator(f1)
f()

# 打印结果如图1

# 注意与上一节对比,发现没有什么大的不同


import time

def decorator(func):#定义装饰器的外部函数
    def wrapper():#装饰器内部定义一个函数(被封装的)
        print(time.time())
        func()
    return wrapper 
@decorator
def f1():
    print('this is a function')

# f = decorator(f1)加上@语法糖以后,这部分可以省略了
f1()#直接调用f1 ,这个就是装饰器的优势!!

# 打印结果如图1
···
#12-11 装饰器 四

12-10 装饰器 二

import time

def decorator(func):#定义装饰器的外部函数
    def wrapper():#装饰器内部定义一个函数(被封装的)
        print(time.time())
        func()
    return wrapper 

def f1():
    print('this is a function')

f = decorator(f1)
f()

# 打印结果如图1

# 注意与上一节对比,发现没有什么大的不同

import time

def decorator(func):#定义装饰器的外部函数
    def wrapper():#装饰器内部定义一个函数(被封装的)
        print(time.time())
        func()
    return wrapper 
@decorator
def f1():
    print('this is a function')

# f = decorator(f1)加上@语法糖以后,这部分可以省略了
f1()#直接调用f1 ,这个就是装饰器的优势!!

# 打印结果如图1

# 12-11 装饰器 四

import time

def decorator(func):#定义装饰器的外部函数
    def wrapper():#装饰器内部定义一个函数(被封装的)
        print(time.time())
        func()
    return wrapper 
@decorator
def f1():#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function')

# f = decorator(f1)加上@语法糖以后,这部分可以省略了
f1()#直接调用f1 ,这个就是装饰器的优势!!

import time

def decorator(func):#定义装饰器的外部函数
    def wrapper(func_name):#装饰器内部定义一个函数(被封装的)
        print(time.time())
        func(func_name)
    return wrapper 
@decorator
def f1(func_name):#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function named' + func_name)

# f = decorator(f1)加上@语法糖以后,这部分可以省略了
f1('test func')#直接调用f1 ,这个就是装饰器的优势!!

# 打印结果如图2

# 传入多个参数的情况
import time

def decorator(func):#定义装饰器的外部函数
    def wrapper(*args):#可变参数
        print(time.time())
        func(*args)
    return wrapper 
@decorator
def f1(func_name):#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function named' + func_name)

@decorator
def f2(func_name1,func_name2):#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function named' + func_name1)
    print('this is a function named' + func_name2)

f1('test func')
f2('test func1','test func2')

# f = decorator(f1)加上@语法糖以后,这部分可以省略了
f1('test func')#直接调用f1 ,这个就是装饰器的优势!!

# 打印结果如图3

image

12-12 装饰器 五

# 12-12 装饰器 五

import time

def decorator(func):#定义装饰器的外部函数
    def wrapper(*args):#可变参数
        print(time.time())
        func(*args)
    return wrapper 
@decorator
def f1(func_name):#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function named' + func_name)

@decorator
def f2(func_name1,func_name2):#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function named' + func_name1)
    print('this is a function named' + func_name2)

@decorator#若将这个屏蔽,打印结果是正确的,若不屏蔽是错误的,如何修改?!!
def f3(func_name1,func_name2,**kw):#定义一个关键字参数
    print('this is a function named' + func_name1)
    print('this is a function named' + func_name2)
    print(kw)
f1('test func')
f2('test func1','test func2')
f3('test func1','test func2',a = 1,b = 2,c = '123')

# f = decorator(f1)加上@语法糖以后,这部分可以省略了
f1('test func')#直接调用f1 ,这个就是装饰器的优势!!




import time

def decorator(func):#定义装饰器的外部函数
    def wrapper(*args,**kw):#可变参数
        print(time.time())
        func(*args,**kw)
    return wrapper 
@decorator
def f1(func_name):#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function named' + func_name)

@decorator
def f2(func_name1,func_name2):#此时的f1没有传入任何参数,那么如果有参数传入装饰器需要做哪些改变?
    print('this is a function named' + func_name1)
    print('this is a function named' + func_name2)

@decorator#若将这个屏蔽,打印结果是正确的,若不屏蔽是错误的,如何修改?!!
def f3(func_name1,func_name2,**kw):#定义一个关键字参数
    print('this is a function named' + func_name1)
    print('this is a function named' + func_name2)
    print(kw)
f1('test func')
f2('test func1','test func2')
f3('test func1','test func2',a = 1,b = 2,c = '123')

# f = decorator(f1)加上@语法糖以后,这部分可以省略了
f1('test func')#直接调用f1 ,这个就是装饰器的优势!!

作者:buaishengqi
链接:https://www.jianshu.com/p/43e20d56299d
来源:
著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(12函数式编程: 匿名函数、高阶函数、装饰器)