Python学习随笔八:高阶函数

本文介绍了Python中的高阶函数,包括map、reduce、filter和sorted的使用方法及应用场景,并讲解了匿名函数lambda的基本概念。

写在前面

一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数,本节将整理如下高阶函数:

  • map
  • reduce
  • filter
  • sorted
  • 匿名函数lambda

map

map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,返回一个可迭代的惰性结果

>>> map(f,[1,2,3,4,5,6,7,8,9])
<map object at 0x000000000309BBE0>
>>> I = map(f,[1,2,3,4,5,6,7,8,9])
>>> list(I)
[1, 8, 27, 64, 125, 216, 343, 512, 729]

map实现的功能即是将用一行代码将一个序列转变成为另一个序列
————————————
1.对于函数

def f(x):
    return x*x*x

f(9)是调用函数,f是指向函数

2.对于可迭代的结果next()语句的二次说明
我们常常用for来一个一个读取可迭代元素的对象,如果用for来迭代,当到末尾的时候,就自动结束了,不会报错。

>>> I =  map(f,[1,2,3,4,5,6,7,8,9])
>>> for i in I:
    print(i)

1
8
27
64
125
216
343
512
729

如果用iter()…next()迭代,当最后一个完成之后,它不会自动结束,还要向下继续,但是后面没有元素了,于是就报一个称之为StopIteration的错误。

>>> next(I)
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    next(I)
StopIteration

需要注意的是,当迭代对象被迭代结束,指针就移动到了最后一个元素的后面。如果再访问,指针并没有自动返回到首位置,而是仍然停留在末位置,所以报StopIteration,想要再开始,需要重新再入迭代对象

reduce

map是利用函数将一个序列转换为另一个序列,函数的参数为一个。
而reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

>>> from functools import reduce
>>> reduce(mul,[1,2,3,4,5,6,7,8,9])
362880

——————————————
在Python3.x后,reduce函数已经被从全局名字空间中移除了,被放置在functools,如果想调用必须像上述一样首先引入

利用map和reduce将str类型转换成为int

>>> def char2num(s):
    return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]#对字典的调用
>>> def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(char2num, s))
#匿名函数,该函数接收两个参数,参数做x*10+y运算
>>> str2int('123456')
123456

filter

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

>>> def not_empty(s):
        return s and s.strip()

>>> list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
['A', 'B', 'C']
#过滤掉一个字符串里的空字符

使用filter挑选回文数

def is_palindrome(n):
    vL = str(n) 
    return vL == vL[::-1]
output = filter(is_palindrome, range(1, 1000))
print(list(output))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999]

sorted

sorted是Python内置的排序函数,同时也是一个高阶函数。
我们可以简单的实现排序

>>> sorted([2,3,6,7,9,0,4])
[0, 2, 3, 4, 6, 7, 9]

也可以自定义排序方式

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

还可以在不改动key的基础上,进行反向排序。只要增加一个参数即可

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

匿名函数

前面匿名函数lambda也已经出现过,这里做下具体介绍。

关键字lambda表示匿名函数,冒号前面的x表示函数参数。
——————————————
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值