python学习22之函数式编程
''''''
'''
1.高阶函数:将函数作为参数传递到另一个函数中,作为这个函数的参数,这样的方式叫高阶函数
(1)map:两个参数,一个是函数,一个是iterator,将函数依次作用于Iterator中的每一个元素,结果返回一个Iterator
'''
#高阶函数举例
a=abs(-10) #abs()是python内置的取绝对值的函数
print(a)
f=abs #将函数abs本身赋值给变量f,也可以理解为将函数abs的函数名更改为f,这样就可以调用f来取代abs的功能
b=f(-10)
print(b)
#10
def add(x,y,f):
return f(x)+f(y)
s=add(-5,6,abs)
print(s)
#当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为:f(x) + f(y) ==> abs(-5) + abs(6) ==>11 #map
def f(x):
return x*x
L=map(f,[1,2,3,4,5,6])
print(L)
#<map object at 0x00000173F1012358> map()传入的第一个参数是f,即函数对象本身。由于结果L是一个Iterator(map),Iterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。
print(list(L))
#[1, 4, 9, 16, 25, 36] L1=list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
print(L1)
#['1', '2', '3', '4', '5', '6', '7', '8', '9'] '''
(2)reduce函数:它把一个函数作用在一个序列[x1, x2, x3, ...]上,
这个函数必须接收两个参数,比如参数函数f作用是乘积操作,reduce会把结果继续和序列的下一个元素做f乘积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
注意使用时先导包:from functools import reduce
'''
from functools import reduce
#应用:对一个数列(1到100的列表)求和
def add(x,y):
return x+y
L2=[]
for i in range(1,101):
L2.append(i)
sum=reduce(add,L2)
print(sum) def normalize(LST):
# def lower(s):
# return s.lower() #全部小写函数 upper()全部大写函数 def capitalize(s):
return s.capitalize() #首字母大写函数,其余小写 return map(capitalize,LST)
L=['adam', 'LISA', 'barT'] r=normalize(L)
print(list(r)) '''
(3)filter:Python内建的filter()函数用于过滤序列。
filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。 '''
def odd(i):
return i%2 != 0
li=[]
for i in range(1,101):
li.append(i)
li2=list(filter(odd,li))
print(li2) #应用:用filter求素数
def _odd_iter(): #创建一个从3开始的初始序列
n = 1
while True:
n = n + 2
yield n '''
yield:
作用:首先起到return的作用,函数结束,返回结果
其次起到生成器的作用:在Python中,这种一边循环一边计算的机制,称为生成器:generator。
最后带yield的函数才是真正的迭代器。
'''
g = (x * x for x in range(10))
#g就是一个生成器,我们想要得到g的每一个值,可以通过next()函数获得generator的下一个返回值:
print(next(g))
print(next(g))
print('*'*50)
#generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
#如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
#generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
#可以直接作用于for循环的对象统称为可迭代对象:Iterable.可以使用isinstance()判断一个对象是否是Iterable对象:
#而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
#可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
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) # 构造新序列
# 打印100以内的素数:
for n in primes():
if n < 100:
print(n)
else:
break
'''
(4)sorted():
'''
#升序排列
L=[11,-15,22,9,35,-1,-5,79]
print(sorted(L))
#降序排列
print(sorted(L,reverse=True))
#可以当做高阶函数,传入函数为参
print(sorted(L,key=abs)) #按照绝对值大小去比较
#假设我们用一组tuple表示学生名字和成绩,请用sorted()对上述列表分别按名字排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
return t[0]
print(sorted(L,key=by_name))
#再按成绩从高到低排序
def by_score(t):
return t[1]
print(sorted(L,key=by_score))
'''
2.返回函数——闭包
在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,
这种称为“闭包(Closure)”的程序结构拥有极大的威力。
'''
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
f=lazy_sum(1,2,3,4,5,6)
print(f)
print(f())
'''
<function lazy_sum.<locals>.sum at 0x0000020C2F455730>
21
'''
#利用闭包返回一个计数器函数,每次调用它返回递增整数。
def createCounter():
m = 0
def counter():
nonlocal m
m += 1
return m
return counter
cnt=createCounter()
print(cnt())
print(cnt())
print(cnt())
'''
global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,
而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误 global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,
而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误
'''
'''
3.匿名函数
4.装饰器:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
5.偏函数:functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。
'''
python学习22之函数式编程的更多相关文章
- python学习笔记011——函数式编程
1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可 ...
- Python学习笔记之函数式编程
python中的高阶函数 高阶函数就是 变量名指向函数,下面代码中的变量abs其实是一个函数,返回数字的绝对值,如abs(-10) 返回 10 def add(x,y,f): return f(x) ...
- python学习笔记(六) 函数式编程
一 函数对象 函数同样可以作为对象复制给一个变量,如下: f = abs; print(f(-10)) f = 'abs'; print(f) def add(a,b,f): return f(a) ...
- Python学习笔记6 函数式编程_20170619
廖雪峰python3学习笔记: # 高阶函数 将函数作为参数传入,这样的函数就是高阶函数(有点像C++的函数指针) def add(x, y): return x+y def mins(x, y): ...
- python学习笔记1 -- 函数式编程之高阶函数 sorted排序
python提供了很强大的内置排序函数,妈妈再也不担心我不会写冒泡排序了呀,sorted函数就是这个排序函数,该函数参数准确的说有四个,sorted(参数1,参数2,参数3,参数4). 参数1 是需要 ...
- python学习笔记1 -- 函数式编程之高阶函数 map 和reduce
我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def fw(参数)这种方式定义一个函数 python有很多的内置函 ...
- python学习笔记1 -- 函数式编程之高阶函数 使用函数作为返回值
使用函数作为返回值,看起来就很高端有木有,前面了解过函数名本身就是一个变量,就比如abs()函数,abs只是变量名,而abs()才是函数调用,那么我们如果把ads这个变量作为返回值返回会怎么样呢,这就 ...
- python学习笔记1 -- 函数式编程之高阶函数 filter
filter 函数用于过滤序列,与map 和reduce函数类似,作为高阶函数,他们也是同样的使用方法,filter(参数1, 参数2),参数1是一个函数,而参数2是一个序列. filter的作用是根 ...
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
随机推荐
- Python——NumPy库入门
1.数据的纬度 维度:一组数据的组织形式 1.1 一维数据 一维数据由对等关系的有序或无序数据构成,采用线性方式组织 ,对应列表.数组和集合等概念 列表:数据类型可以不同 ,如 3.1413, 'pi ...
- SWUST OJ1065 无向图的连通分量计算
无向图的连通分量计算 5000(ms) 10000(kb) 2555 / 5521 假设无向图G采用邻接矩阵存储,编写一个算法求连通分量的个数. 输入 第一行为一个整数n,表示顶点的个数(顶点编号为0 ...
- JS数据结构与算法——栈
JS数据结构与算法--栈 1.栈结构概念 栈(Stack)是一种先进后出(LIFO Last in First out)的线性表,先进栈的将会比后进栈的先出栈. 栈的限制是仅允许在一端进行插入和删除运 ...
- Nginx知多少系列之(一)前言
目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.Linux下.NET Core项目Nginx+ ...
- 打开scratch后蓝屏怎么办
1.试试开机,百出完电脑品牌后,按F8,安全模式,光标选定:最后一次正确配置,回车,回车,按下去,[度关键一步]2.再不行,问进安全模式,回车,到桌面后,用杀毒软件腾讯电脑管家,全盘杀毒,“隔离区”的 ...
- java集合中的一个移除数据陷阱(遍历集合自身并同时删除被遍历数据)
下面是网上的其他解释,更能从本质上解释原因:Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁. Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量 ...
- Centos7_Root密码重置
原因: 最近出去见女朋友,竟然忘了Root用户的密码,此时考验linux基础扎不扎实的时候到了... 操作步骤: 解释补充: mount -o remountr,w / #修改根目录文件系统的权限,实 ...
- vue 全局自定义组件
1.vue文件 <template> <div style="position: absolute;bottom: 10px;text-align: center;widt ...
- AJ学IOS 之微博项目实战(12)发送微博自定义工具条代理实现点击事件
AJ分享,必须精品 一:效果 二:封装好的工具条 NYComposeToolbar.h 带代理方法 #import <UIKit/UIKit.h> typedef enum { NYCom ...
- 使用原生js实现选项卡功能实例教程
选项卡是前端常见的基本功能,它是用多个标签页来区分不同内容,通过选择标签快速切换内容.学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础. 先来完成html部分 ...