点我

高阶函数

  • 函数名也是变量
  • 一个函数可以接收另一个函数作为参数,这种函数称为高阶函数

map()

  • 将传入的函数依次作用到Iterable的每个元素,返回Iterator
  • 自定义的函数只有一个参数
#利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字,
#输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']

l = ['adam', 'LISA', 'barT']
def f(x):
    return x[0].upper() + x[1:].lower()

for i in map(f,l):
    print(i)
结果:
Adam
Lisa
Bart

reduce()

  • 把一个函数作用到Iterable上,上一个结果继续和下一个元素计算,返回计算结果
  • 自定义的函数有两个参数(函数和参数)
# 利用reduce()函数,编写一个prod()函数,可以接受一个list并利用  reduce()求积

l = [1,2,3,4,5]
def f(x,y):
    return x *y
from functools import reduce
def prod(l):
    return reduce(f,l)

print(prod(l))

结果:
120

filter()

  • 作用:用于过滤序列
  • 把传入的函数依次作用于每个元素,然后根据返回值True或False决定是否保留该元素
  • 自定义的函数只有一个参数
#例子:在一个列表中,删除偶数,只保留奇数
def is_odd(n):
    return n % 2 == 1
li = [1,2,3,4,5,6,7,8,9,10]
l = list(filter(is_odd,li))
print(l)
结果:
[1, 3, 5, 7, 9]

sorted()

排序,接收一个key 函数来实现自定义的排序

用sorted()排序的关键在于实现一个映射函数。

自定义的函数只有一个参数

max、min类似

#自定义通过绝对值大小进行排序
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

#例子:
#对列表排序,列表中每个元素是一包含学生姓名和成绩的tuple
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

def by_name(t):

    return t[0]

def by_score(t):

    return t[1]

#按姓名升序

L2 = sorted(L, key=by_name)

print(L2)

#按成绩降序

L2 = sorted(L, key=by_score,reverse=True)

print(L2)

匿名函数

有时不需要显式的定义函数,直接传入匿名函数更方便

定义:lambda 表达式

lambda 表达式只可以包含一个表达式,但是在表达式中可以调用其他函数

匿名函数的的计算结果相当于函数的返回值

>>> f = lambda x,y,z:x+y+z #可以赋值
>>> print(f(1,2,3))
6

>>> g = lambda x,y=2,z=5:x+y+z # 支持默认传参

>>> print(g(1))
8
>>> print(g(1,z=2)) #支持调用关键参数
5

返回函数

函数作为返回值

闭包:相关参数和变量都保存在返回的函数中,这种称为闭包

注意:返回函数不要引用任何循环变量或者后续会发生变化的变量

>>> def lazy_sum(*args):
    def sums():
        sum = 0
        for n in args:
            sum = sum + n
        return sum
    return sums

>>> f = lazy_sum(1,2,3,4,5)
>>> f
<function lazy_sum.<locals>.sums at 0x0000027DFF9BF280>
>>> f()
15

装饰器

在不改变函数定义的基础上增加功能

偏函数

函数通常都可以通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点

functools.partial就是帮助我们创建一个偏函数,而不需要用户自定义

作用:把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85
分类: Python

评论

-- 评论已关闭 --

目录