python基础-函数式编程
python基础-函数式编程
高阶函数:map , reduce ,filter,sorted
匿名函数: lambda
1.1函数式编程
面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。
函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来,得出想要的结果,只要是输入时确定的,输出就是确定的。
1.2高阶函数
能把函数作为参数传入,这样的函数就称为高阶函数。
1.2.1函数即变量
以python的内置函数print()为列,调用该函数一下代码

>>> print("hello world")
hello world
#只写print
>>> print
<built-in function print>
#可见print("hello world")是函数调用,而print是函数本身

要获得函数调用执行的结果,我们把结果赋值给变量:
>>> aa = abs(-20)
>>> aa
20
如果把函数本身赋值给变量
>>> p = print
>>> p
<built-in function print> #函数本身可以赋值给变量,变量可以指向函数
我们通过变量来调用这个print函数,验证结果如下
>>> p("check")
check
总结:函数名也是变量,对于print()这个内置函数,完全可以把函数名print看成变量,它指向一个可以打印任何东西的函数
注:实际程序代码绝不能这么写,上面只是为了举例说明,要恢复print函数,请重启python的交互环境
1.2.2传入函数
变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一函数作为函数,这种函数就称为高阶函数,
函数的返回值是一个函数名,也是高阶函数。
例如:一个简单的高阶函数

def add(x,y,z):
return abs(x)+abs(y)
aa = add(12,23,abs) #函数执行的结果 赋值给 aa
print(aa) #查看aa的值
#35 #注,abs()函数是求一个整数的绝对值

1.3匿名函数
什么是匿名函数:
在python中有一个匿名函数lambda,匿名函数就是指:无需定义标识符(函数名)的函数或子程序。
定义lambda表达式:

lambda arguments:express #arguments 参数(可以有多个参数)
#express 表达式 #lambda返回值是一个函数的地址,也就是函数对象
aa = lambda arguments:express #把的到lambda函数地址,赋值给变量aa 查看这个lambda函数地址 ,用aa(argument) 查看这个函数的值

PS1:
普通函数定义,求数字平方
def pf(x=0):
return x**2
print(pf(3))
PS2:
lambda函数,求数字平方
aa = lambda x:x**2
print(aa(4))
#
总结:
1.lambda函数可以参数可以有多个,包含的表达式不能超过一个,不要试图向lambda函数中塞入太多东西,如果你需要做复杂的功能,应该定义一个普通函数,想定义什么就定义什么。
2.lambda函数用在需要封装特殊的,非重用代码上,避免令我们的代码充斥大量的单行函数。
1.4map函数
map()函数,map映射
map(func,iterable)
map()函数接受两个参数,一个是函数,一个可迭代的对象(iterable),map将传入的函数依次作用到序列的每个元素,并把结果作为新的 可迭代的对象 的结果返回
例:有个函数,f(x) = x+1 把得到的数字 加1 要把这个函数作用在一个[1,2,3,4,5,6]上

number = [1,2,3,4,5,6]
#1.用普通函数定义方法
def add_one(x):
return x+1
def map_test(func,arrey):
res = []
for i in arrey:
i = func(i)
res.append(i)
return res
print(map_test(add_one,number))
#[2, 3, 4, 5, 6, 7] #2.用lambda函数定义的得到结果,借助1定义的map_test函数
print(map_test(lambda x:x+1,number))
#[2, 3, 4, 5, 6, 7] #3.用map()本身函数去定义
print(list(map(lambda x:x+1 ,number)))
#[2, 3, 4, 5, 6, 7] #注:map()得出的结果是一个iterator ,需要用list()函数让它个整个序列都计算出来返回一个list

我们可能会想,写一个循环,也可以计算出结果,但要实现多个功能,是不是也要写多个循环 例:得出每个列表中元素的平方或则n次方
map()作为高阶函数,事实上把运算规则抽象了,不但可以计算简单的 f(x) = x+1 ,也能计算更复杂的函数。
总结:map() 处理序列中的每个元素,得到的结果是一个 iterator ,需通过list(iteratro),该list元素个数,与原来位置一样。
1.5reduce函数
在python2可以直接用reduce()函数
在python3需要调用reduce模块
from functools import reduce
reduce(function, sequence, initial=None) #该函数的默认用法
reduce函数,将function作用sequence序列的元素,每次携带一对(先前的结果以及下一序列的元素),连续的将现有的结果和下一个作用在获得的随后的结果上,最后得到我们的序列为一个最终结果的返回值。
PS1:
number1 = [2,3,4,10]
#1.普通函数定义
def chengfa(x,y):
return x*y #返回得到两个数相乘的结果
def reduce_test(func,seq,init=None):
if init is None:
res = seq.pop(0) #seq删除第一个元素,并获取删除这个元素 赋值给res
else:
res = init
for i in seq:
res = func(res,i) #循环一次,执行func这个函数
return res
print(reduce_test(chengfa,number1))
#
print(reduce_test(chengfa,number1,10))
# #如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果 #2.lambda函数,借助reduce_test()函数定义
print(reduce_test(lambda x,y:x*y,number1,init=3))
# #3.使用reduce(),结合lambda()
print(reduce(lambda x,y:x*y, number1))
# 得到列表所有元素,相乘的结果 number1 = [2,3,4,10]
#1.普通函数定义
def chengfa(x,y):
return x*y #返回得到两个数相乘的结果
def reduce_test(func,seq,init=None):
if init is None:
res = seq.pop(0) #seq删除第一个元素,并获取删除这个元素 赋值给res
else:
res = init
for i in seq:
res = func(res,i) #循环一次,执行func这个函数
return res
print(reduce_test(chengfa,number1))
#
print(reduce_test(chengfa,number1,10))
# #如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果 #2.lambda函数,借助reduce_test()函数定义
print(reduce_test(lambda x,y:x*y,number1,init=3))
# #3.使用reduce(),结合lambda()
from functools import reduce
print(reduce(lambda x,y:x*y, number1))
# 得到列表所有元素,相乘的结果
PS2:
得到1-100的和
print(reduce(lambda x,y:x+y,range(1,101)))
1.6filter函数
filter()函数用于过滤序列和map()类似,filter()也接受一个函数和一个序列(可迭代的对象,也就是能被for循环),和map()不同的是,fillter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
示例:
aa = ['A', '', 'B', None, 'C', ' ']
#1.自定义函数测试
def not_empty(s):
return s and s.strip()
def filter_test(func,iter):
res = []
for i in iter:
i = func(i)
if i:
res.append(i)
return res
print(filter_test(not_empty,aa)) #['A', 'B', 'C'] #2.filter内置函数测试
print(list(filter(not_empty,aa)))
#['A', 'B', 'C'] #把列表中空字符串,空元素,都去掉
filter()这个函数,关键在于正确实现一个筛选函数,
注:filter()函数返回的是一个iterator,内存地址,需要看内存地址的值, 用list()函数或得该地址的值
1.7sorted函数
sorted()函数也是一个高阶函数,它可以接收key
sorted排序,排序是比较元素的大小,如果是数字可以直接比较,如果是字符串或则两个dict(字典)?
sorted()传入的参数是可迭代的对象,返回值的对象是一个列表
示例:数字默认排序
aa = [11,-10,20,21,30,-40]
print(sorted(aa))
备注:接收一个key函数来实现自定义排序
示例:根据绝对值大小来进行排序
aa = [11,-10,20,21,30,-40]
print(sorted(aa,key=abs))
#[-10, 11, 20, 21, 30, -40]
示例:字符串排序
print(sorted("hello"))
#['e', 'h', 'l', 'l', 'o']
print(sorted(["hello","ho","haha"]))
# ['haha', 'hello', 'ho']
备注:默认情况下,对字符串排序是按照ASCII编码表的大小进行比较的
最后总结:
python内置的几个高阶函数:map() ,reduce(),filter,sorted()
python基础-函数式编程的更多相关文章
- python基础——面向对象编程
python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...
- 可爱的 Python : Python中函数式编程,第一部分
英文原文:Charming Python: Functional programming in Python, Part 1 摘要:虽然人们总把Python当作过程化的,面向对象的语言,但是他实际上包 ...
- python 基础网络编程2
python 基础网络编程2 前一篇讲了socketserver.py中BaseServer类, 下面介绍下TCPServer和UDPServer class TCPServer(BaseServer ...
- python 基础网络编程1
python 基础网络编程1 Source code: Lib/socketserver.py lib的主目录下有一个sockserver.py文件, 里面是python基本的网络编程模型 共有一个b ...
- Python的函数式编程: map, reduce, sorted, filter, lambda
Python的函数式编程 摘录: Python对函数式编程提供部分支持.由于Python允许使用变量,因此,Python不是纯函数式编程语言. 函数是Python内建支持的一种封装,我们通过把大段代码 ...
- python 10函数式编程
函数式编程 函数是Python内建支持的一种封装, ...
- python基础-面向对象编程
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...
- Python进阶 函数式编程和面向对象编程等
函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...
- 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC
1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...
随机推荐
- iOS 线程安全之@synchronized的用法
@synchronized(self)的用法: @synchronized 的作用是创建一个互斥锁,保证此时没有其它线程对self对象进行修改.这个是objective-c的一个锁定令牌,防止self ...
- MVC缺点
MVC的不足之处表现在以下几个方面: (1) 增加了系统结构和实现的复杂性.对于简单的界面,严格遵循MVC,使模型.视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率. (2 ...
- Linux文件和目录权限详细讲解
转载请标明出处: http://www.cnblogs.com/why168888/p/5965180.html 本文出自:[Edwin博客园] Linux文件和目录权限解读 如何设置Linxu文件和 ...
- Django model.py表单的默认值 默认允许为空
Field.null 默认是null=False,这时不能传入NULL型数据,但是可以是空字符. 如果BooleanField中想要null数据类型,可以选择NullBooleanField Fi ...
- Sql--order by、desc降序、top
---------通过order by 语句进行排序: --1.降序order by 列名desc --2.升序order by 列名 或order by 列名asc --3.order by语句 ...
- ORA-00604: error occurred at recursive SQL level 1
在测试环境中使用某个账号ESCMOWNER对数据库进行ALTER操作时,老是报如下错误: ORA-00604: error occurred at recursive SQL level 1 ORA- ...
- Oracle数据库迁移
1 在数据迁移时,用户首先有权限修改数据库,并且进行表空间创建.删除等权利 例如: select * from dba_tab_privs where grantee='SCOT'; ---查看SCO ...
- PHP笔记(PHP初级篇)
学习完HTML和CSS后,终于要开始学习PHP啦!前面的铺垫只为后路的畅顺! PHP环境搭建: 企业中常用到的环境是:Linux+Apache+MySQL+PHP 学习环境是:Windows+Apac ...
- hive建表与数据的导入导出
建表: create EXTERNAL table tabtext(IMSI string,MDN string,MEID string,NAI string,DestinationIP string ...
- SQL SERVER 2014 各个版本支持的功能
转自:https://technet.microsoft.com/library/cc645993 转换箱规模限制 功能名称 Enterprise Business Intelligence Stan ...