zoukankan      html  css  js  c++  java
  • Python之函数式编程

    高阶函数(map/reduce,filter,sorted)

     变量可以指向函数:

    >>> x = abs(-10)
    >>> x

    >>> f = abs
    >>> f(-10)
    10

    函数名也是变量

    >>> abs = 10
    >>> abs(-10)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not callable

    传入函数

    既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    def add(x, y, f):
        return f(x) + f(y)

    当我们调用add(-5,6,abs)时,参数x,y和f分别接收-5,6,和abs,根据函数定义,我们可以推导计算过程为:

    x=-5

    y=6

    f=abs

    f(x)+f(y)==>abs(-5)+abs(6)==>11

    return 11

    >>> add(-5, 6, abs)
    11

    map/reduce

    Python内建了map()和reduce()函数。

    map()函数接收两个参数,一个函数,一个式Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

    一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:

    python代码实现如下:

    >>>def f(x)

        return x*x

    >>>r = map(f, [1,2,3,4,5,6,7,8,9])

    >>>list(r)

    [1, 4, 9, 16, 25, 36, 49, 64, 81]

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

    ['1', '2', '3', '4', '5', '6', '7', '8', '9']

    reduce的用法。reduce把函数作用在一个序列[x1,x2,x3,.....]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

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

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

    >>>from functools import reduce

    >>>def add(x, y):

        reduce x+y

        reduce(add, [1,3,5,7,9])

    25

    filter

    python内建的filter()函数用于过滤序列。

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

    例如,删除一个list中的偶数,只保留奇数,可以这么写:

    def is_odd(n): 

      return n%2==1

    t=list(filter(is_odd,[1,2,3,4,5,6,7,8,9,10,15]))

    print(t)

    sorted

    排序算法:

    Python内置的sorted()函数就可以对list进行排序:

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

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

    >>> sorted([36, 5, -12, 9, -21], key=abs)
    [5, 9, -12, -21, 36]
    字符串排序的例子:
    >>> sorted(['bob', 'about', 'Zoo', 'Credit'])
    ['Credit', 'Zoo', 'about', 'bob']

    sorted传入key函数,即可实现忽略大小写的排序:
    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
    ['about', 'bob', 'Credit', 'Zoo']
    返回函数
  • 相关阅读:
    SD卡测试
    测试人员可能会遇到的问题
    HDU 1024 Max Sum Plus Plus
    HDU 1176 免费馅饼
    HDU 1257 最少拦截系统
    HDU 1087 Super Jumping! Jumping! Jumping!
    poj 1328 Radar Installation
    poj 1753 Flip Game
    HDU 1003 Max Sum
    HDU 5592 ZYB's Premutation(BestCoder Round #65 C)
  • 原文地址:https://www.cnblogs.com/bianyuanzhe/p/6700696.html
Copyright © 2011-2022 走看看