函数式编程:

特点:允许传递的参数是函数,且允许返回一个函数。

由于Python允许使用变量,因此,Python不是纯函数式编程语言,同样的输入可能输出不同,有副作用。纯函数式编程语言没有变量,输入和输出是确定的,无副作用。

1.高阶函数(Higher-order function):

特点:高阶函数可以接受另一个函数作为参数,还可以把函数作为结果值返回。

变量可以指向函数,函数名也是变量, 所以可以作为参数传入函数。

  1.1 内置的函数:函数作为参数

    1%. map(func, *iterables) 【映射】

   2%. reduce(function, sequence, initial=None) 【累计】

  1.   # 将迭代器经函数的处理返回一个新的迭代器,是一种映射。
  2.   list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
  3. # 返回 ['1', '2', '3', '4', '5', '6', '7', '8', '9']
  4.  
  5. #累计计算:把序列[1, 3, 5, 7, 9]变换成整数13579
  6. from functools import reduce
  7. def fn(x, y):
  8. return x * 10 + y
  9.   reduce(fn, [1, 3, 5, 7, 9])
  10. # 13579
  11.  
  12. # map()和reduce()合用:str’13579‘ 转化为int:13579
  13. def char2num(s):
  14. return {'': 0, '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9}[s]
  15. reduce(fn, map(char2num, ''))
  16. # 整理为一个函数str2int,这些函数因为就一句也可以用匿名函数写
  17. from functools import reduce
  18.  
  19. def str2int(s):
  20. def fn(x, y):
  21. return x * 10 + y
  22. def char2num(s):
  23. return {'': 0, '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9}[s]
  24. return reduce(fn, map(char2num, s))

# 实现筛选功能

    3%. filter(function, iterable)   【返回值是True则保留】

  1. # 迭代的值
  2. def _odd_iter():
  3. n = 1
  4. while True:
  5. n = n + 2
  6. yield n
  7.  
  8. def _not_divisible(n):
  9. return lambda x: x % n > 0
  10.  
  11. # 定义一个生成器,不断返回下一个素数
  12. def primes():
  13. yield 2
  14. it = _odd_iter() # 初始序列
  15. while True:
  16. n = next(it) # 返回序列的第一个数
  17. yield n
  18. it = filter(_not_divisible(n), it) # 构造新序列
  19.  
  20. # 打印30以内的素数:
  21. for n in primes():
  22. if n < 30:
  23. print(n)
  24. else:
  25. break
  26.  
  27. # 找到回数
  28. def is_palindrome(n):
  29. start = 0
  30. end = -1
  31. while start < len(str(n))/2:
  32. if str(n)[start] != str(n)[end]:
  33. return False
  34. else:
  35. start += 1
  36. end -= 1
  37. return True
  38. output = filter(is_palindrome, range(100, 200))
  39. print(output)

# 排序

4%. sorted(iterable, key=None, reverse=False)

  1. # 按照绝对值排序,key传入函数
  2. sorted([36, 5, -12, 9, -21], key=abs)
  3. # [5, 9, -12, -21, 36]
  4.  
  5. # 忽略大小写反向排序
  6. sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
  7. ['about', 'bob', 'Credit', 'Zoo']

2 返回函数

  闭包:在函数内嵌套另一个函数,嵌套函数可以引用外部函数的参数和局部变量。而相关的参数和变量保存在返回函数。

  1. # 结果都一样
  2. def count():
  3. fs = []
  4. for i in range(1, 4):
  5. def f():
  6. return i*i
  7. fs.append(f)
  8. return fs
  9.  
  10. f1, f2, f3 = count()
  11.  
  12. #一个函数可以返回一个计算结果,也可以返回一个函数。
  13. #返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
  14.  
  15. # 结果1,2,3
  16. def count():
  17. def f(j):
  18. def g():
  19. return j*j
  20. return g
  21. fs = []
  22. for i in range(1, 4):
  23. fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
  24. return fs
  25. f1, f2, f3 = count()
  26. f1()
  27. # 2次结果的不同

3 匿名函数 (lambda 传入: 返回)

特点:

  无名匿名函数,不必担心函数名冲突

应用场景:
  1. 函数很小,一句话的事情
  2. 使用函数变量调用函数时, 如在触发事件需要传入参数的时候

  1. # 1把匿名函数赋值给一个变量,再利用变量来调用该函数:
  2. f = lambda x: x * x
  3.  
  4. # 2把匿名函数作为返回值返回,比如:
  5. def build(x, y):
  6. return lambda: x * x + y * y

4  装饰器

  向一个现有的对象添加新的功能,同时又不改变其结构

  使用场景:

  • 参数检查(Agrument checking)
  • 缓存(Caching)
  • 代理(Proxy)
  • 提供上下文(Context Provider)

  

  1. import functools
  2.  
  3. def log(text):
  4. def decorator(func):
  5. @functools.wraps(func)
  6. def wrapper(*args, **kw):
  7. print('%s %s():' % (text, func.__name__))
  8. return func(*args, **kw)
  9. return wrapper
  10. return decorator
  11.  
  12. @log('execute')
  13. def now():
  14. print('2015-3-25')
  15.  
  16. now()
  17. # 等价于
  18. now = log('execute')(now)

5 偏函数

使用场景:当函数的参数个数太多,需要简化时

  使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分默认参数。

  通过设定参数的默认值,可以降低函数调用的难度

  1. # 把一个函数的某些参数给固定住(也就是设置默认值)
  2. # 进行二进制的转换
  3. def int2(x, base=2):
  4. return int(x, base)
  5.  
  6. print('1000000 =', int2(''))
  7. print('1010101 =', int2(''))
  8.  
  9. # 等价为
  10. import functools
  11. int2 = functools.partial(int, base=2)
  12.  
  13. print('1000000 =', int2(''))
  14. print('1010101 =', int2(''))

  

python,函数式编程的更多相关文章

  1. Python函数式编程:从入门到走火入魔

    一行代码显示"爱心" >>> print]+(y*-)**-(x**(y*<= ,)]),-,-)]) Python函数式编程:从入门到走火入魔 # @fi ...

  2. python函数式编程,列表生成式

    1.python 中常见的集中存储数据的结构: 列表 集合 字典 元组 字符串 双队列 堆 其中最常见的就是列表,字典. 2.下面讲一些运用循环获取字典列表的元素 >>> dic={ ...

  3. (转)Python函数式编程——map()、reduce()

    转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...

  4. python 函数式编程学习笔记

    函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...

  5. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  6. Python函数式编程(进阶2)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6411915.html 本文出自:[Edwin博客园] Python函数式编程(进阶2) 1. python把 ...

  7. Python函数式编程——map()、reduce()

    文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...

  8. python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

    python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...

  9. Python函数式编程简介

    参考原文 廖雪峰Python函数式编程 函数 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程 ...

  10. Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted

    1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...

随机推荐

  1. nginx封IP脚本

    #!/bin/bash max= confdir=/etc/nginx/conf.d/blockips.conf logdir=/var/log/nginx/access.log echo " ...

  2. May 14th 2017 Week 20th Sunday

    A smooth sea never made a skillful mariner. 平静的海洋练不出熟练的水手. A smooth sea never made a skillful marine ...

  3. javascript 面向对象(实现继承的几种方式)

     1.原型链继承 核心: 将父类的实例作为子类的原型 缺点:  父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了 function Person (name) { this.name ...

  4. 【9.29 模拟】T3 小清新最优化(easy)

    [题目描述] 给出一个长度为 n 的序列,序列的每个元素为一个二元组,代表一种单目运算: • \((0,x)\): 对于一个数\(a\),将其变为 \(a\&x\).\((\&=x)\ ...

  5. Django:ORM关系字段

    一,ForeignKey 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方. ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系 ...

  6. 【[JLOI2014]松鼠的新家】

    //第一次A掉紫题就来写题解,我是不是疯了 //说实话这道题还是比较裸的树上差分 //对于树上的一条路径(s,t),我们只需要把ch[s]++,ch[t]++,ch[LCA(S,T)]--,再把lca ...

  7. 使用ToString方法格式化日期

    实现效果: 关键知识: Environment类的NewLine属性  //用于获取为此环境定义的换行字符串,程序执行过程中方便对字符串进行换行 Environment类的EXIT方法     //用 ...

  8. servlet 与 tomcat版本不匹配的问题

    严重: Failed to process JAR found at URL [/StudentLeave] for ServletContainerInitializers for context ...

  9. intellij idea下载安装以及创建项目(输出Hello World)

    主题一:下载 第一:可以百度下载 第二:直接进行官网链接下载地址:http://www.jetbrains.com/idea/ 第一步: 第二步: 下载完成后进行安装 主题二:安装 点击Next速度可 ...

  10. Android学习笔记_46_Android的intent之间Object、List、List<Object>和全局变量数据的传递(Parcelable Serializable)

    转http://blog.csdn.net/pku_android/article/details/7456305 一.传递List<String>和List<Integer> ...