python——高阶函数

高阶函数

实参是一个函数名
函数的返回值是一个函数

函数本身也可以赋值给变量 变量可以指向函数

def double(x):
    return 2*x    # 定义一个函数,
f = double   # 将函数赋值给变量
print(f(2))    # 通过变量可以调用函数
map()

接收两个参数,一个是函数 一个是序列
map将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回。最终的返回值也是一个map对象,map对象是惰性的,无法直接打印所有对象,可以用for … in循环打印或next( )遍历,也可以通过list( )函数转成列表。

需求对于一个序列[-1,3,-4,-5]的每一个元素求绝对值

import random
print(list(map(abs,[-1,3,-4,-5])))

效果展示
[1, 2, 3, 5, 4]

对于每个元素求平方

list1 = [1,2,3,4,5,6,7]
def power(x):    # 定义函数。该函数输入一个参数,返回该参数的平方值
    return x**2
list2 = list(map(power,list1))   # 使用map 函数 将平方函数依次作用于序列中的每一个元素
print(list2)  

需求对于每个元素求阶乘

def factoria(x):   对X求阶乘
    res = 1
    for i in range(1,x+1):
        res = res  * i
    return res
li = [random.randint(2,7) for i in range(10)]
print(list(map(factoria,li)))
reduce():

reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
python2中:reduce是内置函数
python3中:from functools import reduce

from functools import reduce
def mul (x,y):
    return x*y
print(reduce(mul,range(1,5)))         这个的乘积答案为1*2*3*4

效果展示
24
def add(x,y):
    return x+y
print(reduce(add,range(1,6)))          一直相加到5,1+2+3+4+5

效果
15
filter()过滤函数:

和map()类似的,也接收一个函数和一个序列,但是和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True或者False决定保留还是丢弃该元素

  • 找出1-100之间的偶数
def isodd(num):
    if num%2 ==0 :
        return False
    else:
        return True
print(list(filter(isodd,range(100))))
  • 找出1-50之间的质数
def black(x):
    for i in range(2,x):
        if x%i ==0:
            return False
        else:
            return True
print(list(filter(black,range(2,50))))
lambda():

匿名函数,冒号前面是 形参 冒号后面是返回值
lambda函数能实现普通一样的功能,能传入参数,也能返回运算结果;不同的是lambda函数没有函数名,通常只有一行的表达式,函数的复杂程度也有限。

如果使用lambda(匿名)函数,map( )函数和reduce( )函数还能进一步简化

简化reduce函数,求阶乘

from functools import reduce
print(reduce(lambda x,y:x*y,range(1,6)))

简化map函数,将输入字符串的小写改成大写

str1 = 'loko'
str2 = map(lambda x:x.upper(),str1)
print(''.join(list(str2)),type(str2))

效果展示
LOKO <class 'map'>

简化sorted函数,按照学生成绩排名:

stu = [('westos',90),('koko',99),('dodo',77)]
stu_sort = sorted(stu,key=lambda x:x[1])
print(stu_sort)

练习
1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字

def low_name(n):
    def lower_n(a):
        return a.lower()
    return n[0].upper() + ''.join(map(lower_n,n[1:]))
      #n[0] 表示第一个字母后边加上upper 第一个大写,连接后边的其余除了第一个是大写全部是小写
print(low_name('westos'))

效果展示
Westos

2.利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456

from functools import reduce
def str2float(s):
    s1 = s.split('.')[0]
    s2 = s.split('.')[1][::-1]
    b2 = {str(i):i for i in range(1,10)}
    def num(x):
        return b2[x]
    def before_b2(x,y):
        return x*10+y
    def after_b2(x,y):
        return x*0.1+y
    return reduce(before_b2,map(num,s1))+ 0.1*reduce(after_b2,(map(num,s2)))
print(str2float('123.456'))


123.456

3.回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数

def hui(n):
    n = str(n)
    return n ==n[::-1]
li = [123, 121,45654,131]
print(list(filter(hui,li)))


[121, 45654, 131]

有一个整数列表(10个元素),要求调整元素的顺序
把奇数放在前面 偶数放在后面

import random
li = [random.randint(1,10) for i in range(10)]
print(sorted(li,key=lambda  x:2 if x%2 == 0 else 1))

[9, 9, 5, 9, 3, 7, 10, 8, 2, 6]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值