Python 函数式编程
Posted 北风吹沙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 函数式编程相关的知识,希望对你有一定的参考价值。
函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
1.高阶函数
一个函数可以接收另一个函数作为参数,这种函数称之为高阶函数
abs(-10) 是函数调用 abs是函数本身 abs函数名其实是一个变量名
变量可以指向函数,函数名也是变量名
map()
map(func,seq)
函数接收两个参数,一个是函数,一个是Iterable(可迭代对象,序列)
,map
将传入的函数func()依次作用到序列seq的每个元素,并把结果作为新的Iterator(迭代器)
返回,之后可转为lis或其他类型t输出。
1 #!/usr/bin/python3 2 3 def f(x): 4 return x*x 5 6 r = map(f, [ 1, 2, 3, 4, 5, 6 ]) 7 print(list(r)) 8 #由于结果r是Iterator(惰性序列),因此通过list()函数计算整个序列
reduce()
reduce(func,seq)
把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce()
把结果继续和序列的下一个元素做累积计算,
意即一次取序列两个元素放到函数,函数结果和下一个函数结果(取下两个元素放到函数得到的函数结果)相加,依次类推。
1 #!/usr/bin/python3 2 from functools import reduce 3 4 def f(x,y): 5 return x+y 6 7 r = reduce(f, [ 1, 2, 3, 4, 5, 6 ]) 8 print(r)
filter()
filter(func,seq)
函数用于过滤序列,调用一个布尔函数func()来迭代遍历每个seq中的元素,返回一个使func返回值为True的元素的序列
和map()
类似,filter()
也接收一个函数和一个序列。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
筛选回文 回数是指从左向右读和从右向左读都是一样的数
1 #!/usr/bin/python3 2 3 def is_palindrone(n): 4 return str(n) == str(n)[::-1] #[::-1]是倒切 从右往左 5 6 print( list( filter( is_palindrone, range(11,200) ) ) )
sorted()
排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。
sorted(seq,key=func)
函数也是一个高阶函数,它可以接收一个key
函数来实现自定义的排序,例如按绝对值大小排序
不是同一种类型数据相比较,key决定比较大小的标准:
匿名函数与lambda
lambda表达式返回可调用的函数对象
1 def add(x,y):return x+y 2 sum1 = add(2,3) 3 #等价于 4 add = lambda x,y:x+y 5 add(2,3)
Python简单的句法限制了lambda函数的定义体只能使用纯表达式。即不能赋值,也不能使用while和try等Python语句
除了作为参数传给高阶函数之外,Python很少使用匿名函数
2.返回函数
把函数作为结果返回
1 #!/usr/bin/python3 2 3 def lazy_sum(*args): 4 def sum(): 5 #闭包 sum可以引用外部函数lazy_sum的参数和局部变量 6 ax = 0 7 for n in args: 8 ax = ax+n 9 return ax 10 return sum 11 12 f = lazy_sum(1, 3, 5, 7, 9) #不需要立即求和,而是在后面的代码中根据需要计算 13 #返回的函数并没有立刻执行,而是直到调用了f()才执行 14 print(f())
返回值与函数类型
返回的对象数目 Python实际返回的对象类型
0 None
1 object
>1 tuple
3.装饰器
不修改原函数的定义,在代码运行期间动态增加功能的方式(如在调用前后自动打印日志,但又不修改函数的定义),称之为“装饰器”(Decorator),装饰器就是函数,借助@调用。
1 #!/usr/bin/python3 2 3 def log(func): 4 def printInfo(*arge, **kw): #*不定长参数 **关键字参数 5 print(\'call %s()\' % func.__name__) #在调用func之前打印一些信息 6 return func(*arge, **kw) 7 return printInfo 8 9 #log是一个装饰器,接收函数返回函数,借助@语法把装饰器置于函数的定义外 10 @log #相当于执行了 now = log(now) 11 def now(): 12 print(\'2019-4-20\') 13 14 #现在同名now()指向了新的函数,调用now()返log()中的printInfo()函数 15 print(now())
4.偏函数
当函数参数过多,需简化时,使用 functools.partial() 可以创建一个新的函数,这个函数可以固定住原函数的部分参数
1 #!/usr/bin/python3 2 import functools 3 4 int2 = functools.partial(int, base = 2) 5 print(int2(\'1000000\')) #现在只需传一个序列, 不需传指定的进制
以上是关于Python 函数式编程的主要内容,如果未能解决你的问题,请参考以下文章