Python 高阶函数

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

>>> f = abs
>>> f(-10)
10

f 在已指向了 abs 函数本身。 直接abs() 函数和f() 完全相同。

函数名也是
函数名其就是指向函数的量!abs() 个函数,
完全可以把函数名
abs 看成量, 它指向一个可以绝对值的函数!
>>> abs = 10
>>> abs(-10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
abs 指向 10 后, 就无法通abs(-10) 函数了!因abs
不指向求绝对值函数而是指向一个整数 10
入函数
既然量可以指向函数, 函数的参数能接收量, 那么一个函数就可以接收一个
函数作
参数, 种函数就称之函数。
一个最简单的高函数:
def add(x, y, f):
    return f(x) + f(y)

>>> add(-5, 6, abs)
11

把函数作参数入, 这样的函数称函数, 函数式程就是指种高度抽象的程范式。
map/reduce

Python内建了 map() reduce() 函数。

map() 函数接收个参数, 一个是函数, 一个是 Iterable map 入的函数依次作用到序列的每个元素, 并把果作

Iterator 返回。

在, 我Python码实现

def f(x):
    return x * x
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)

[1, 4, 9, 16, 25, 36, 49, 64, 81] 

reduce 把一个函数作用在一个序列 [x1, x2, x3,...] 上, 个函数必接收个参数, reduce 继续和序列的下一个元素
做累
积计算, 其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
比方说对一个序列求和, 就可以用 reduce 实现

from functools import reduce
def add(x, y):
       return x + y
>>> reduce(add, [1, 3, 5, 7, 9])

25

写一个 prod() 函数, 可以接受一个list并利用 reduce()
def prod(L):
    from functools import reduce
    def subprod(x,y):
        return int(x) * int(y)
    return reduce(subprod,L)
>>>print('3*5*7:',prod([3,5,7]))

3*5*7: 105

filter

Python内建的 filter() 函数用于过滤序列 .

map() 似, filter() 也接收一个函数和一个序列。 和 map() 不同的filter() 入的函数依次作用于每个元素, 然后根据返回True False 决定保留元素。

例如, 在一个list中, 掉偶数, 只保留奇数, 可以么写:

def is_odd(n):
    return n % 2 == 1
>>>list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
#
: [1, 5, 9, 15]
filter() 函数返回的是一个 Iterator , 也就是一个惰性序列, 所以要 filter() 完成 果, 需要用 list() 函数 得所有 果并返回 list

filter() 的作用是从一个序列中出符合条件的元素。 由于 filter() 使用了惰性算, 所以只有在取 filter() 果的候, 才会真正筛选并每次返回下一个出的元素。

sorted :排序算法

Python内置的 sorted() 函数就可以list行排序:

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

们给 sorted key函数, 即可实现忽略大小写的排序: 

sorted() 函数也是一个高函数, 它可以接收一个 key 函数来实现自定的排序, 例如按绝对值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
再看一个字符串排序的例子:
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
情况下, 字符串排序, 是按照 ASCII 的大小比 的, 由于 'Z' < 'a' 果, 大写字母 Z 会排在小写字母 a 的前面。
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
行反向排序, 不必改 key 函数, 可以 入第三个参数 reverse=True
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

sorted() 列表分按名字排序:

>>>L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
>>>L2 = sorted(L)
>>>print(L2)
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88),]
用  sorted()  列表分 按成绩排序:
>>>L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
>>>sorted(L,key = lambda l:l[1])
>>>print(L2)
[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]
def is_odd(n): return n % 2 == 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值