python—高阶函数

什么是内置高阶函数
一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。
Python中内置了几个常用的高阶函数,比如map( )函数、reduce( )函数、filter( )函数和sorted( )函数。
abs函数:
abs() 函数返回数字的绝对值。

>>> a = -1
>>> print(abs(a))
1
>>> print(abs(-15))
15
>>> f = abs
>>> print(f(-10))
10

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

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

map函数
map()函数接收的是两个参数,一个函数,一个序列(列表),其功能是将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回。
1 . 对于一个序列[-1,3,-4,-5]的每一个元素求绝对值

li1 = [-1,3,-4,-5]
li2 = map(abs,li1)   # 将abs 函数依次作用于序列了li1中的每一个元素,并将处理后的结果返回序列
print(list(li2))

运行结果:
[1,3,4,5]

2 . 对于每个元素求阶乘

import random
def factoria(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
#import functools
#functools.reduce()
def multi(x,y):
    return x*y
print(reduce(multi,range(1,5)))

def add(x,y):
    return x+y
print(reduce(add,range(1,6)))

运行结果:
24
15

filter函数

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

def isodd(num):
    if num % 2  == 0:
        return True
    else:
        return False

print(list(filter(isodd,range(100))))

运行结果:
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 
32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60,
62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 
92, 94, 96, 98]

lambda匿名函数
lambda()匿名函数是指一类无需定义标识符(函数名)的函数或子程序。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
匿名函数的关键字为 lambda。
冒号前面是形参,冒号后面是返回值。

示例:分别打印元素的累加、平方、范围内的所有偶数

from functools import reduce
# def add(x,y):
#     return  x+y
# print(reduce(add,range(10)))
print(reduce(lambda x,y:x+y,range(10)))
# def mypow(x):
#     return x**2
print(list(map(lambda x:x**2,range(5))))
# def isood(num):
#     return num%2 ==0
print(list(filter(lambda x:x%2==0,range(100))))

运行结果:
45
[0, 1, 4, 9, 16]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 
32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 
62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 
92, 94, 96, 98]

sorted( )函数
sorted( )函数是用来对可迭代对象排序的,与列表的list( )函数不同,后者是在原位置上进行排序的,排序后原列表的元素顺序会发生改变,而前者是将排序后的结构生成到一个新的列表中。

a = [1,3,8,4,9,2,6]
a.sort()
print(a)
b = [9,3,6,8,2,7,4]
c = sorted(b)
print(b)
print(c)

运行结果:
[1, 2, 3, 4, 6, 8, 9]        a的原列表元素顺序发生改变
[9, 3, 6, 8, 2, 7, 4]        b 列表顺序没有改变
[2, 3, 4, 6, 7, 8, 9]        新生成的列表中存放排序之后的元素

练习:
1 . 将一个字符串转换成整型 ‘332.31321’

from functools import reduce

def str2int(s):
    def char2int(ch):
        c = {str(x): x for x in range(10)}
        return c[ch]
    def fun(n1, n2):
        return n1 * 10 + n2
    return reduce(fun, map(char2int, s))

num = str2int('12345')
print(type(num), num)

运行结果:
<class 'int'> 12345

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

def zz(x):
   return x.capitalize()
name = input('请输入英文名字:')
print(list(map(zz, name.split())))

运行结果:
请输入英文名字:faker
['Faker']

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

from functools import reduce
def str2float(s):
    s1 = s.split('.')[0]
    s2 = s.split('.')[1][::-1]
    c2n = {str(i):i for i in range(1,10)}
    def number(x):
        return c2n[x]
    def before_c2n(x,y):
        return x*10+y
    def after_c2n(x,y):
        return x*0.1+y
    return reduce(before_c2n,map(number,s1)) + 0.1*reduce(after_c2n,(map(number,s2)))
print(str2float('345.678'))

运行结果:
345.678

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

def huishu(s):
    s = str(s)
    return s == s[::-1]
li = [123,23432,121,4567,12421]
print(list(filter(huishu,li)))

运行结果:
[23432, 121, 12421]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值