zoukankan      html  css  js  c++  java
  • 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
    

  • 相关阅读:
    sfs2x 连接 mongodb
    java websocket
    webstorm 4.0 注册码
    解决 sfs2 admin tool 找不到扩展
    window 注册表五大类
    opengl 学习第二日
    java google Protobuf
    扩展 java sencha touch PhonegapPlugin
    sencha touch2 kryonet socket phonegap 通信 作者:围城
    sencha touch2 layout 笔记
  • 原文地址:https://www.cnblogs.com/ulrica/p/9017254.html
Copyright © 2011-2022 走看看