python,函数式编程
函数式编程:
特点:允许传递的参数是函数,且允许返回一个函数。
由于Python允许使用变量,因此,Python不是纯函数式编程语言,同样的输入可能输出不同,有副作用。纯函数式编程语言没有变量,输入和输出是确定的,无副作用。
1.高阶函数(Higher-order function):
特点:高阶函数可以接受另一个函数作为参数,还可以把函数作为结果值返回。
变量可以指向函数,函数名也是变量, 所以可以作为参数传入函数。
1.1 内置的函数:函数作为参数
1%. map(func, *iterables) 【映射】
2%. reduce(function, sequence, initial=None) 【累计】
- # 将迭代器经函数的处理返回一个新的迭代器,是一种映射。
- list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
- # 返回 ['1', '2', '3', '4', '5', '6', '7', '8', '9']
- #累计计算:把序列[1, 3, 5, 7, 9]变换成整数13579
- from functools import reduce
- def fn(x, y):
- return x * 10 + y
- reduce(fn, [1, 3, 5, 7, 9])
- # 13579
- # map()和reduce()合用:str’13579‘ 转化为int:13579
- def char2num(s):
- return {'': 0, '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9}[s]
- reduce(fn, map(char2num, ''))
- # 整理为一个函数str2int,这些函数因为就一句也可以用匿名函数写
- from functools import reduce
- def str2int(s):
- def fn(x, y):
- return x * 10 + y
- def char2num(s):
- return {'': 0, '': 1, '': 2, '': 3, '': 4, '': 5, '': 6, '': 7, '': 8, '': 9}[s]
- return reduce(fn, map(char2num, s))
# 实现筛选功能
3%. filter(function, iterable) 【返回值是True则
保留】
- # 迭代的值
- 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) # 构造新序列
- # 打印30以内的素数:
- for n in primes():
- if n < 30:
- print(n)
- else:
- break
- # 找到回数
- def is_palindrome(n):
- start = 0
- end = -1
- while start < len(str(n))/2:
- if str(n)[start] != str(n)[end]:
- return False
- else:
- start += 1
- end -= 1
- return True
- output = filter(is_palindrome, range(100, 200))
- print(output)
# 排序
4%. sorted(iterable, key=None, reverse=False)
- # 按照绝对值排序,key传入函数
- sorted([36, 5, -12, 9, -21], key=abs)
- # [5, 9, -12, -21, 36]
- # 忽略大小写反向排序
- sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
- ['about', 'bob', 'Credit', 'Zoo']
2 返回函数
闭包:在函数内嵌套另一个函数,嵌套函数可以引用外部函数的参数和局部变量。而相关的参数和变量保存在返回函数。
- # 结果都一样
- def count():
- fs = []
- for i in range(1, 4):
- def f():
- return i*i
- fs.append(f)
- return fs
- f1, f2, f3 = count()
- #一个函数可以返回一个计算结果,也可以返回一个函数。
- #返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。
- # 结果1,2,3
- 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()
- # 2次结果的不同
3 匿名函数 (lambda 传入: 返回)
特点:
无名匿名函数,不必担心函数名冲突
应用场景:
1. 函数很小,一句话的事情
2. 使用函数变量调用函数时, 如在触发事件需要传入参数的时候
- # 1把匿名函数赋值给一个变量,再利用变量来调用该函数:
- f = lambda x: x * x
- # 2把匿名函数作为返回值返回,比如:
- def build(x, y):
- return lambda: x * x + y * y
4 装饰器
向一个现有的对象添加新的功能,同时又不改变其结构
使用场景:
- 参数检查(Agrument checking)
- 缓存(Caching)
- 代理(Proxy)
- 提供上下文(Context Provider)
- import functools
- def log(text):
- def decorator(func):
- @functools.wraps(func)
- def wrapper(*args, **kw):
- print('%s %s():' % (text, func.__name__))
- return func(*args, **kw)
- return wrapper
- return decorator
- @log('execute')
- def now():
- print('2015-3-25')
- now()
- # 等价于
- now = log('execute')(now)
5 偏函数
使用场景:当函数的参数个数太多,需要简化时
使用functools.partial
可以创建一个新的函数,这个新函数可以固定住原函数的部分默认参数。
通过设定参数的默认值,可以降低函数调用的难度
- # 把一个函数的某些参数给固定住(也就是设置默认值)
- # 进行二进制的转换
- def int2(x, base=2):
- return int(x, base)
- print('1000000 =', int2(''))
- print('1010101 =', int2(''))
- # 等价为
- import functools
- int2 = functools.partial(int, base=2)
- print('1000000 =', int2(''))
- print('1010101 =', int2(''))
python,函数式编程的更多相关文章
- Python函数式编程:从入门到走火入魔
一行代码显示"爱心" >>> print]+(y*-)**-(x**(y*<= ,)]),-,-)]) Python函数式编程:从入门到走火入魔 # @fi ...
- python函数式编程,列表生成式
1.python 中常见的集中存储数据的结构: 列表 集合 字典 元组 字符串 双队列 堆 其中最常见的就是列表,字典. 2.下面讲一些运用循环获取字典列表的元素 >>> dic={ ...
- (转)Python函数式编程——map()、reduce()
转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...
- python 函数式编程学习笔记
函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...
- python 函数式编程:高阶函数,map/reduce
python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...
- Python函数式编程(进阶2)
转载请标明出处: http://www.cnblogs.com/why168888/p/6411915.html 本文出自:[Edwin博客园] Python函数式编程(进阶2) 1. python把 ...
- Python函数式编程——map()、reduce()
文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...
- python函数式编程之返回函数、匿名函数、装饰器、偏函数学习
python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...
- Python函数式编程简介
参考原文 廖雪峰Python函数式编程 函数 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程 ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
随机推荐
- nginx封IP脚本
#!/bin/bash max= confdir=/etc/nginx/conf.d/blockips.conf logdir=/var/log/nginx/access.log echo " ...
- May 14th 2017 Week 20th Sunday
A smooth sea never made a skillful mariner. 平静的海洋练不出熟练的水手. A smooth sea never made a skillful marine ...
- javascript 面向对象(实现继承的几种方式)
1.原型链继承 核心: 将父类的实例作为子类的原型 缺点: 父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了 function Person (name) { this.name ...
- 【9.29 模拟】T3 小清新最优化(easy)
[题目描述] 给出一个长度为 n 的序列,序列的每个元素为一个二元组,代表一种单目运算: • \((0,x)\): 对于一个数\(a\),将其变为 \(a\&x\).\((\&=x)\ ...
- Django:ORM关系字段
一,ForeignKey 外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方. ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系 ...
- 【[JLOI2014]松鼠的新家】
//第一次A掉紫题就来写题解,我是不是疯了 //说实话这道题还是比较裸的树上差分 //对于树上的一条路径(s,t),我们只需要把ch[s]++,ch[t]++,ch[LCA(S,T)]--,再把lca ...
- 使用ToString方法格式化日期
实现效果: 关键知识: Environment类的NewLine属性 //用于获取为此环境定义的换行字符串,程序执行过程中方便对字符串进行换行 Environment类的EXIT方法 //用 ...
- servlet 与 tomcat版本不匹配的问题
严重: Failed to process JAR found at URL [/StudentLeave] for ServletContainerInitializers for context ...
- intellij idea下载安装以及创建项目(输出Hello World)
主题一:下载 第一:可以百度下载 第二:直接进行官网链接下载地址:http://www.jetbrains.com/idea/ 第一步: 第二步: 下载完成后进行安装 主题二:安装 点击Next速度可 ...
- Android学习笔记_46_Android的intent之间Object、List、List<Object>和全局变量数据的传递(Parcelable Serializable)
转http://blog.csdn.net/pku_android/article/details/7456305 一.传递List<String>和List<Integer> ...