函数进阶

来源:互联网 发布:积分商城java源代码 编辑:程序博客网 时间:2024/06/02 03:02

高阶函数

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

>>> x = abs(-10)>>> x10>>> f = abs>>> f<built-in function abs>>>> f = abs>>> f(-10)10

函数名也是变量。
传入函数:
定义:既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数
例:

def add(x, y, f):    return f(x) + f(y)   # 当我们调用add(-5, 6, abs)时。x ==> -5y ==> 6f ==> abs # 此为传入的函数f(x) + f(y) ==> abs(-5) + abs(6) ==> 11# 即:>>> add(-5, 6, abs)11

map:

例:
有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上。

>>> def f(x):...     return x * x...>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])[1, 4, 9, 16, 25, 36, 49, 64, 81]

表达式:map(函数对象, list)

把这个list所有数字转为字符串:

>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])['1', '2', '3', '4', '5', '6', '7', '8', '9']

reduce:

reduce定义:必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

表达式:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

对一个序列求和,就可以用reduce实现:

>>> def add(x, y):...     return x + y...>>> reduce(add, [1, 3, 5, 7, 9])25

把序列[1, 3, 5, 7, 9]变换成整数13579

>>> def fn(x, y):...     return x * 10 + y...>>> reduce(fn, [1, 3, 5, 7, 9])13579

写出把str转换为int的函数:

>>> def fn(x, y):...     return x * 10 + y...>>> 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]...>>> reduce(fn, map(char2num, '13579'))13579

filter

在一个list中,删掉偶数,只保留奇数:

def is_odd(n):    return n % 2 == 1filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])# 结果: [1, 5, 9, 15]

把一个序列中的空字符串删掉:

def not_empty(s):    return s and s.strip()filter(not_empty, ['A', '', 'B', None, 'C', '  '])# 结果: ['A', 'B', 'C']

关键在于正确实现一个“筛选”函数。

尝试用filter()删除1~100的素数。

def notsushu(s):    for i in range(2,s):        if s % i == 0:            return sprint filter(notsushu,range(1,101))

sorted

默认从小到大排序:

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

sorted()函数也是一个高阶函数。
实现倒序排序:

def reversed_cmp(x, y):    if x > y:        return -1    if x < y:        return 1    return 0>>> sorted([36, 5, 12, 9, 21], reversed_cmp)[36, 21, 12, 9, 5]

格式:sorted(列表, 函数)

字符串排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'])['Credit', 'Zoo', 'about', 'bob']

默认情况下,对字符串排序,是按照ASCII的大小比较的,由于’Z’ < ‘a’,结果,大写字母Z会排在小写字母a的前面。

忽略大小写,按照字母序排序:

#定义一个忽略大小写的比较方法。def cmp_ignore_case(s1, s2):    u1 = s1.upper()    u2 = s2.upper()    if u1 < u2:        return -1    if u1 > u2:        return 1    return 0>sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)['about', 'bob', 'Credit', 'Zoo']