函数本身可以赋值给变量
变量也可以指向函数
在python中有许多内置函数,比如:求绝对值函数abs()
我们以往学习的函数都是可以直接通过名字调用的,那么我们也同样对其进行调用:
发现,abs不能达到调用的效果,反而刚才的abs(-5)是我们需要的调用效果。可见:abs是函数本身,而abs(-5)这才是函数调用
将其赋值:
f = abs()
说明函数本身可以赋值给变量,即变量可以指向函数。
它的实参可以是一个函数名
其函数返回值是一个函数
def fun(x,y,f):
return f(x),f(y)
print(fun(-10,5,abs))
在fun函数中,我们有三个形参:x,y,f,其中f是对应的实参为高阶函数abs
返回值f(x)和f(y)即将x和y分别作用在了abs中,即abs(x),abs(y)
map() 接收两个参数,一个是函数,一个是序列
map将传入的函数依次作用到序列的每个元素,并把结果作为的新的序列返回
示例:有10个2-7之间的随机数,对每个元素求阶乘
def JC(x): ##定义阶乘函数
s = 1
for i in range(1,x+1):
s = s * i
return s
import random
k = []
for i in range(10): ##生成10个随机数
k.append(random.randint(2,7))
print(k)
print(list(map(JC,k))) ##列表输出阶乘结果,调用map高阶函数
格式:reduce(函数+列表)
把一个函数作用在一个序列上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算【累加,累乘,除法,减法等都可以】
python2中内置,python3中需要手动导入
列式说明:
reduce(f,[x1,x2,x3,x4,x5]) = f(f(f(x1,x2),x3),x4)
from functools import reduce ##导入reduce模块
def multi(x,y):
return x*y
print(reduce(multi,range(1,5))) ##得到结果24
在multi函数中定义乘法运算,在reduce高阶函数中,通过reduce(函数+列表)的形式,将列表中的每个数依次作用进函数,达到12345累乘的效果
接收一个函数一个序列
filter把传入的函数依次作用于每个元素,根据返回值是true还是false决定保留还是丢弃该元素
def isodd(num): ##判断是不是偶数
if num % 2 == 0:
return True
else:
return False
print(list(filter(isodd,range(1,101)))) ##得到100以内的偶数
filter(函数+序列),将序列中的所有元素作用于函数中,如果函数返回值为True,则保留该元素,返回值为False,则丢弃该元素。我们在上述示例中对于判定结果为偶数的数给予返回值True,而奇数False,从而达到过滤的效果。
默认sort和sorted由小到大排序,reverse=True由大到小排序
格式:sorted(序列+函数)
排序是根据函数返回值的大小进行排序
info = [
('apple1',200,32),
('apple2',40,12),
('apple3',40,2),
('apple4',1000,23),
('apple5',40,5),
] #第0列名称,第1列个数,第2列价格
print(sorted(info))
#按照商品数量进行排序
def sorted_by_count(x):
return x[1]
#按照商品价格排序
def sorted_by_price(x):
return x[2]
#先按照商品数量由小到大排序,如果商品数量一眼
#则按照商品价格由小到大排序
def sorted_by_count_price(x):
return x[1],x[2]
print(sorted(info,key=sorted_by_count))
print(sorted(info,key=sorted_by_price))
print(sorted(info,key=sorted_by_count_price))
在上述示例中:通过sorted(序列+函数),先将序列带入指定的函数中,比如当按照个数排序是,便将整个序列带入sorted_by_count()这个函数中,通过返回值x[1]来指定排序的规则是根据第而列元素个数来排序。默认的排序方法即从小到大。
没有名字的函数
冒号前面是形参,冒号后面为返回值
print(reduce(lambda x,y:x+y,[1,2,3,4,5,]))
#对序列做累加运算,返回冒号后面的累加结果 ##reduce(函数+序列)
nums = [7,0,5,9,6,4,0,1,0] ##定义一个列表
print(sorted(nums,key=lambda x:2 if x == 0 else 1)) ##将其中的0都排到最后
print(list(filter(lambda x:x%2==0,range(1,51)))) ##筛选0-51中的偶数
在上述示例中:
1.sorted(序列+方法),序列即为nums,方法使用匿名函数,而在匿名函数部分,如果x为0,则将其返回值赋为2,其他均赋为1,在sorted默认排序中,是从小到大排序,因此0的返回值大,会被排在最后。而其他返回值都相等则不进行排序。
2.filter(函数+序列),函数即lambda匿名函数,冒号前面x为形参,冒号后面为返回值,返回值我们取对2取余为0的结果,即偶数。filter判断如果结果为True,则保留。序列即为range(1,51)
大大的小小阳