函数式编程*
一、偏函数
: python 中提供一种用于函数固定属性的函数
定义:
偏函数是将所要承载的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数后续的参数,除非使用关键字参数。
from functools import partial
int3 = partial(int,base=2)
print(int3("1010"))
作用:
把一个函数的某些参数给固定住 (也就是设置默认值),返回一个新函数,调用这个新函数会更简单
实例:
from functools import partial
def mod(n,m):
int2 = n%m
return int2
n = 5
m = 3
int3 = partial(mod,n,m)
mod(5,3)
print(int3())
二、 wraps
作用:
functools.wraps 可以将原函数对象的指定属性复制给包装函数对象,默认有module、name、doc、或者通过参数选择。
使用:
from functools import wraps
def log(func):
@wraps(func)
def with_logging(*args,**kwargs):
print("%s was calling"%func.__name__)
return func(*args,**kwargs)
return with_logging
@log
def test(x):
'''打印一个乘积'''
return x*x
'''
test
打印一个乘积
test was calling
4
'''
print(test.__name__)
print(test.__doc__)
print(test(2))
'''
加了wraps 输出结果:
with_logging
None
test was calling
4
'''
三、Map() 函数
map() 函数会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
函数语法:
map(function,*iterable,...)
#function 是一个函数
#*iterable 可以是一个或者多个序列
运行实例:
from collections.abc import Iterable ,Iterator
list1 = [2,3,4,]
list2 = [5,6,7,8]
def func(x):
return x*2
def fun1(x,y):
return x*y
m1 = map(func,list1)
m2 = map(fun1,list1,list2)
print(isinstance(m1,Iterator))
for i in m1:
print(i,end=' ')
print()
print("------------------")
for i in m2:
print(i,end=' ')
#也可以用 lambda 匿名函数来定义
m3 = map(lambda x:x*2,list1)
m4 = map(lambda x,y:x*y,list1,list2)
print()
print("------------------")
for i in m3:
print(i,end=' ')
print()
print("------------------")
for i in m4:
print(i,end=' ')
四、reduce 函数
reduce函数会对参数序列中元素进行积累。
reduce函数的定义:
reduce(function, sequence ,[initial] ) -> value
function参数是一个有两个参数的函数,reduce依次从sequence中取一个元素,和上一次调用function的结果做参数再次调用function。第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence中的前两个元素做参数调用function。
from functools import reduce
import random
list1 = []
for i in range(5):
rand_num = random.randint(1,100)
list1.append(rand_num)
print(list1)
sum1 = 0
for i in list1:
sum1 += i
print("和为%g"%sum1)
result = reduce(lambda x,y:x+y,list1)
print("和为%d"%result)
reduce()函数就是每一次经过函数表达式输出的结果再代入表达式进行计算。
五、filter() 函数
用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中
语法:
filter(function,iterable)# funchtion 函数,iterable 可迭代对象
实例:
list1 = [1,2,0,34,50,0,80]
it1 = filter(lambda x:x>=50,list1) # 符合条件的 大于等于 50 的保留
for i in it1:
print(i,end=" ")
filter() 函数实际是有过滤功能的,过滤掉不符合条件的。
六、sorted() 函数
sorted() 函数对可迭代的对象进行排序操作。
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
# sorted() 函数语法
sorted(iterable,key=None,reverse = False)
# iterable 是可迭代的对象。
#key--主要是用来进行比较的元素,只有一个参数具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元#素来进行排序。
#reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)
实例说明:
a = [1,0,32,12,45,70,-1,-23,-10,-6]
a.sort()
print(a)
print(a.sort())
print(sorted(a)) #sorted 返回一个值,新列表
#整数从小到大排列,负数从大向小
a2 = sorted(a,key=lambda x:(x<0,abs(x)))
print(a2)
#列表中自定义对象的排序
class Student():
def __init__(self,name,age):
self.name = name
self.age = age
stu1 = Student("aaa",19)
stu2 = Student("ccc",20)
stu3 = Student("bbb",18)
list1 = [stu1,stu2,stu3]
for stu in list1:
print(stu.name,stu.age)
print("------------")
list2 = sorted(list1,key=lambda x:x.age) #以年龄来排序
for i in list2:
print(i.name,i.age)