Python学习 —— 函数式编程

版权声明:转载注明出处 https://blog.csdn.net/qq_19428987/article/details/86583695

lambda 表达式

lambda表示是一个匿名函数,仅仅是一个表达式,可以一个或者多个参数(中间采用逗号隔开),lambda表达式没有返回值

	fun=lambda x:x**3 #求x的三次方
	print(fun(3))
	>>27

高阶函数

把函数作为参数的使用的函数叫高阶函数(类似C#中多重函数调用)

def funA(x):
    return x*10
def funB(n,fun):
    return fun(n)*3
print(funB(5,funA))
>>> 150

上列中将函数funA作为参数传入,在funB中可以直接调用,不用直接去访问函数

系统高阶函数-map

map函数(映射),把集合或者列表中的每一个元素按照一定规则操作,并返回新的列表或者集合。map(函数或lambda表达式,可迭代对象)。例如:将一个列表中的每个元素乘以10,并得到新的列表:

l=[i for i in range(10)]
l_2=map(lambda x:x*10,l)
for i in l_2:
    print(i)

系统高阶函数-reduce

  • 把一个迭代对象归并成一个结果
  • 对于作为参数的函数必须要有两个参数,必须要有返回值
  • 需要导入functools包。
    例子:
from functools import reduce
def add(x,y):
    return x+y
l=[i for i in range(10)]
sum=reduce(add,l)
print(sum)
>>> 45

filter 过滤函数

对一组数据进行过滤,符合条件的数据会生成一个新的数据

  • 返回值为布尔类型
  • 调用格式:filter(f,data),其中f为过滤函数,data为数据
def isEven(n):
    return n%2==0
l=[i for i in range(10)]
even=filter(isEven,l)
for i in even:
    print(i)
# 这里将会依次打印0~8

高阶函数-排序

把一个序列按照给定的算法来进行排序

  • 对每个函数进行key函数运算,按照key函数定义的逻辑来排序
  • 特别注意Python2和Python3差别很大
#按照绝对值大小排序
l=[-12,58,-65,78,80]
b=sorted(l,key=abs,reverse=False)
print(b)
>>> [-12, 58, -65, 78, 80]

闭包-closure

  • 当一个函数在函数内部定义函数,内部的函数应用外部的函数参数或者局部变量,当内部函数被当做返回值时,相关参数和返回值保存在相关函数中,这种结果叫闭包
def count():
    def f(j):
        def g():
            return j*j
        return g
    fs=[]
    for i in range(1,4):
        fs.append(f(i))
    return fs
fun=count()
for i in fun:
    print(i())
# 输出 1\n 4\n 9

装饰器-Decorator

  • 在不改动代码的情况下,无限制扩展函数功能的机制,本质上讲是返回函数的高阶函数
  • 装饰器的使用:在每次要到扩展函数前使用@+函数名
def debug(func):
    def wrapper(*args, **kwargs):  # 指定宇宙无敌参数
        print("[DEBUG]: enter {}()".format(func.__name__))
        return func(*args, **kwargs)
    return wrapper  # 返回
@debug
def say(something):
    print("hello {}!".format(something))
say("Box")
>>>[DEBUG]: enter say()
hello Box!

偏函数

  • 参数固定,相当于一个特定参数的函数体
  • 需要引入 functools. partial,相当于把函数的参数固定
from functools import partial
int16=partial(int,base=16)
print(int16("255"))
>>> 597

猜你喜欢

转载自blog.csdn.net/qq_19428987/article/details/86583695