美文网首页
#0724周二#高阶函数

#0724周二#高阶函数

作者: mark_x | 来源:发表于2019-07-23 18:51 被阅读0次

一、filter()

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

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

def _is_pal(x):
    kk = list[map(int, str(x))]
    return kk == kk[::-1]

def gen_pal(n):
    return list(filter(_is_pal, range(1, n)))

kk = gen_pal(1000)

list(map(int, str(value)))用于将一个数的每一位保存在一个list中,其实这样多余了。更简单的,直接比较字符串形式的数字就可以了。因此可将kk = list[map(int, str(x))]改为kk = str(x)


二、 Lambda表达式

带有一个参数的Lambda表达式和对应的非匿名函数:

def f(n):
    return lambda x: x % n
print (f(1)(2))     # n=1; x=2

参数传入关系是什么?写成下面这种形式方便理解:

def g(n):
    return lambda x: x % n
k = g(1)            # n=1
print ((k(2)))  # x=2

可以看出,执行k = g(1)返回的是一个匿名函数lambda x: x % 1,该匿名函数的功能与

def s(x):
    return x % 1

是相同的。
执行k = g(1)k就指向了这个函数,因此再传入参数x = 2,得到结果。

注意:上面代码中,f(n)只接收一个参数n,是不能写成两个参数形式的f(n, x),如果非匿名函数没有传入参数,调用的时候也必须写成f()(2),不能写成f(2)


三、sorted()

Python内置的sorted()函数可以对list进行排序,此外还可以接收一个key函数来实现自定义排序。如sorted([36, 5, -12, 9, -21], key=abs)
key制定的函数将作用于list的每一个元素上。
因此在设计这个映射函数时,是对每个元素进行处理。

例:假设我们用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()对上述列表分别按名字排序。

def by_name(t):
    return t[0]

def by_score(t):
    return -t[1]

函数by_name(t)的传入元素的结构是这样的:('Bob', 75),是一个tuple,取出tuple的第一个元素并返回,即return t[0]


四、返回函数

利用闭包返回一个计数器函数,每次调用它返回递增整数。

def gen_count():
    def seq():
        n = 0
        while True:
            n = n + 1
            yield n
    f = seq()
    return next(f)

counterA = gen_count()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = gen_count()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('测试通过!')
else:
    print('测试失败!')

输出“测试失败”。分析原因:
seq()是一个自然数无限序列生成器,f = seq()调用生成器,返回next()
当执行counterA = g()后,从调试器可以看出counterA = {int} 1,这是因为函数返回了next(f),这返回的不是一个函数,而是一个值,gen_count()不是一个返回函数。

修改:

def gen_count():
    def seq():
        n = 0
        while True:
            n = n + 1
            yield n
    f = seq()

    def g():
        return next(f)

    return g


counterA = gen_count()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = gen_count()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('测试通过!')
else:
    print('测试失败!')

这样修改后,返回值就变成了函数,每次执行counterA()就相当于执行next(f)

相关文章

  • #0724周二#高阶函数

    一、filter() filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数...

  • python学习(三)函数式编程

    高阶函数 函数也是变量,函数参数为函数的函数,称作高阶函数 自定义高阶函数 内建高阶函数 map/reducema...

  • 11.Lambda和高阶函数(Lambda and Higher

    高阶函数 kotlin_Lambda,高阶函数 *swift_高阶函数

  • Python | 高阶函数基本应用及Decorator装饰器

    一、高阶函数 理解什么是高阶函数?以及高阶函数的基本应用方法 ▲ 高阶函数 在了解什么是高阶函数之前,我们来看几个...

  • 四、函数进阶

    一. 高阶函数 参数类型包含函数类型或返回值类型为函数类型的函数为高阶函数。 常见的高阶函数 高阶函数的调用 二....

  • Kotlin 高阶函数

    什么是高阶函数 将函数作为参数或者返回值的,称高阶函数。 定义高阶函数 action是一个高阶函数,(Int) -...

  • 高阶组件

    高阶组件 先来引入这个概念 高阶函数是什么? 高阶函数就是一个函数返回一个函数eg: 高阶组件 类同 高阶组件就是...

  • [JS函数] (Array)の高阶函数

    JS函数 高阶函数 高阶函数英文叫Higher-order function。那么什么是高阶函数? JavaScr...

  • HOC - High Order Component 高阶组件

    高阶函数 简而言之,可以接收函数作为参数的函数就是一个高阶函数。 上面的hoc函数就是一个高阶函数。 高阶组件 高...

  • Day10. 高阶组件

    1. 认识高阶函数 什么是高阶组件呢?认识高阶函数.png 高阶函数: 接收一个或多个函数作为输入, 输出一个函数...

网友评论

      本文标题:#0724周二#高阶函数

      本文链接:https://www.haomeiwen.com/subject/nshalctx.html