• Python进阶(二)


    高阶函数

    1.把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。

    2.Python内建了map( )和reduce( ) 函数

    map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
    reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

    3.filter()函数用于过滤序列

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

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

    回数

    def is_palindrome(n):
               return n==int(str(n)[::-1])
    
    output = filter(is_palindrome, range(1, 1000))
    print('1~1000:', list(output))
    if list(filter(is_palindrome, range(1, 200))) == [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]:
        print('测试成功!')
    else:
        print('测试失败!')
    

    注意:先整数变字符串,再字符串倒序,然后变成整数,最后比较原来的数。这里变为整数的原因,是因为你传入的n是整数,而倒叙之后的是str类型。整数和str无法作比较。此处也可修改为:return str(n) == str(n)[::-1]。

    4.sorted 排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。

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

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

    要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True:


    返回函数

    闭包(比较好的两个例题对比)

    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count()
    ***
    >>> f1()
    9
    >>> f2()
    9
    >>> f3()
    9
    

    原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。

    返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。

    def count():
        def f(j):
            def g():
                return j*j
            return g
        fs = []
        for i in range(1, 4):
            fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
        return fs
    ***
    >>> f1, f2, f3 = count()
    >>> f1()
    1
    >>> f2()
    4
    >>> f3()
    9
    

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

    def createCounter():
        i = 0
        def counter():
            print(i)
            i += 1
            return i
        return counter
    

    def createCounter():
        i = [0]
        def counter():
            i[0] += 1
            return i
        return counter
    

    也可以使用生成器

    def createCounter():
        def num():
            n = 1
            while 1:
                yield n
                n = n + 1
    
        n = num()
        def counter():
            return next(n)
        return counter
    

  • 相关阅读:
    网络流
    随机化
    sw抄来的主席树
    牛客SQL题解-统计各个部门的工资记录数
    牛客SQL题解-查找所有员工自入职以来的薪水涨幅情况
    牛客SQL题解-查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成
    牛客SQL题解-查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
    牛客SQL题解-获取薪水第二多的员工的emp_no以及其对应的薪水salary
    牛客SQL题解-统计出各个title类型对应的员工薪水对应的平均工资avg
    牛客SQL题解-查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
  • 原文地址:https://www.cnblogs.com/ulrica/p/9017254.html
Copyright © 2020-2023  润新知