python函数式编程

python函数式编程

1、高阶函数的定义:

      函数名也是变量,

      传入函数

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

      一个最简单的高阶函数:

  def add(x, y, f):
      return f(x) + f(y)
1)、map/reduce
   map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

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

    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
练习题:
利用mapreduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456

def str2float(s):
counts = s.find('.')
return reduce(lambda x,y:x*10+y,map(int,s[:counts])) + 0.1*reduce(lambda x,y:x*0.1+y,map(int,s[len(s)-1:counts:-1]))
print(str2float('123.456'))

2)、filter

filter函数传入两个参数,传入的函数会作用于序列的每个元素,并将不符合传入函数要求的过滤掉。
filter返回的也是一个迭代器Iterator

  用filter求素数

  计算素数的一个方法是埃氏筛法

      

  def _odd_iter():
n = 1
while True:
n = n + 2
yield n
#注意这是一个生成器,并且是一个无限序列。
#然后定义一个筛选函数:
def _not_divisible(n):
return lambda x: x % n > 0
#最后,定义一个生成器,不断返回下一个素数:
def primes():
yield 2
it = _odd_iter()
while True:
n = next(it)
yield n
it = filter(_not_divisible(n), it)

for n in primes():
if n <1000:
print(n)
else:
pass

  3)、sorted

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

               sorted(L,key=,reverse=)

   练习

  假设我们用一组tuple表示学生名字和成绩:

  L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]

  请用sorted()对上述列表分别按名字排序:

       L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    def by_name(t):
     return t[0]

    def by_score(t):
     return t[1]
    print(sorted(L,key=by_name))
    print(sorted(L,key=by_score,reverse=True))


原文地址:https://www.cnblogs.com/wuchenggong/p/8778729.html