函数式编程:

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

由于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,函数式编程的更多相关文章

  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. May 10th 2017 Week 19th Wednesday

    Imagination is the source of creation. 想象是创作之源. Sometimes, creation and innovation are very simple, ...

  2. NO.001-2018.02.06《木兰花·拟古决绝词柬友》清代:纳兰性德

    木兰花·拟古决绝词柬友原文.翻译及赏析_纳兰性德_古诗文网   木兰花·拟古决绝词柬友 清代:纳兰性德 人生若只如初见,何事秋风悲画扇.与意中人相处应当总像刚刚相识的时候,是那样地甜蜜,那样地温馨,那 ...

  3. leetcode 198、打家劫舍

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  4. IOS MapKit框架的使用(专门用于地图显示)

    ● MapKit框架使用前提 ● 导入框架 ● 导入主头文件#import <MapKit/MapKit.h>   ●  MapKit框架使用须知 ●  MapKit框架中所有数据类型的前 ...

  5. Django运行访问项目出现的问题:Invalid HTTP_HOST header: '192.168.114.25:8001'. You may need to add u'192.168.114.25' to ALLOWED_HOSTS.

    当运行python manage.py runserver 0.0.0.0:8001时候,出现Invalid HTTP_HOST header: '192.168.114.25:8001'. You ...

  6. Fy's dota2 题解

    题目描述 Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于 是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等 到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水.但 是 ...

  7. umlの类图

    版权声明:本文为博主原创文章,若要转载请注明出处!^_^ https://blog.csdn.net/u010892841/article/details/24844825 类图class diagr ...

  8. 【luogu P3371 单源最短路径】 模板 dij + heap

    题目链接:https://www.luogu.org/problemnew/show/P3371#sub 堆优化迪杰斯特拉,留着以后复习用 #include <iostream> #inc ...

  9. 常用的linux指令整理

    ls 列出文件目录 -a全部文件,连同隐藏文件一起列出 -d仅列出目录本身,而不是列出目录内的文件数据 -l 连同权限一同列出 cd 切换文件目录的命令 pwd显示目前所在的目录 mkdir 创建新的 ...

  10. center os 创建用户、设置密码、修改用户、删除用户命令

    参考:https://www.linuxidc.com/Linux/2017-06/144916.htm useradd testuser  创建用户testuserpasswd testuser  ...