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 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
随机推荐
- 利用Surfingkeys和tampermonkey效率操作网页
tampermonkey可以实现网页载入后自动进行某些操作,适合有规律的操作,实现完全自动化. 而Surfingkeys可以实现用各种按键实现各种功能,功能全部用JavaScript写,自定义性更强.
- 服务器常用命令之 启用/禁用PING状态
启用 echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all (PING的通) 禁用 echo 1 > /proc/sys/net/ipv4/i ...
- 微信小程序国际化
微信小程序国际化 现状 小程序国际化官方没有支持,也没有现成的插件. 网上有人做了国际化的尝试.但是只能替换静态文本,就是简单的键值匹配. vue-i18n 由于是基于html 和 vue, 不同于w ...
- python接口测试-项目实践(五) 实际结果与预期结果对比之 接口对比
五 与开发接口对比 1 分别将三个接口封装成三个函数,传入接口参数,返回提取并处理后的各字段. 拼接字符串作为单独的函数. def api_1(code): 发送请求获取响应 提取响应数据 响应数据转 ...
- HDU 1575 Tr A 【矩阵经典2 矩阵快速幂入门】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1575 Tr A Time Limit: 1000/1000 MS (Java/Others) Me ...
- 使用canvas上传图片+上传进度
实现效果: 速度过快,调式浏览器方式:F12 后台java代码 public String imageshangchuan(@RequestPart("xxx") Multipar ...
- WebGL学习笔记(3)
根据上篇笔记,在对3D对象可进行普通的控制后,以及学习了http://hiwebgl.com的教程第10章内容:世界模型的载入以及控制镜头移动,经过多次调试矩阵代码,已经可以实现在世界中旋转镜头/控制 ...
- [USACO06NOV]玉米田Corn Fields(动态规划,状态压缩)
题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ...
- JVM——Java内存区域
一,概述: Java跟C++不同,在内存管理区域C++程序员拥有着最高权力,但是正是因为如此,所以C++程序员要照顾这个对象的生老病死,从创建到消亡都是由程序员决定的. 但是Java程序员在虚拟机的自 ...
- Linux环境下tomcat如何热部署
1.修改tomcat配置文件 1.1第一步修改tomcat-users.xml <role rolename="manager-gui" /> <role rol ...