Python学习笔记五函数式编程(一)

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000

函数式编程

一、高阶函数

所谓高阶函数就是函数可以以另外一个函数作为参数。

首先需要了解在Python中变量是可以指向函数的,如下例子:

>>> abs(-5)
5
>>> f=abs
>>> f
<built-in function abs>
>>> abs
<built-in function abs>
>>> f(-5)
5

可以看到当变量f指向函数名abs后,f也成为了一个求绝对值的函数名,并且可以通过f调用。

函数名的本质也是变量,只是在Python中直接设置了该变量就指向函数。

>>> abs=‘abc‘
>>> abs
‘abc‘
>>> abs(-1)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    abs(-1)
TypeError: ‘str‘ object is not callable

上例中把内置函数名abs指向了一个字符串,那它的本质就变化了,无法再调用其计算绝对值的方法了。(只有在下一次启动Python运行环境后才重置)。

看一个最简单的高阶函数(即以函数名作为参数):

>>> def funa(a):
    return a*a

>>> def funb(a,b,f):
    return f(a)+f(b)

>>> funb(3,4,funa)
25

>>> funb(-6,-10,abs)16

(一)map/reduce

1、map

map函数接受两个参数,一个是函数,一个是Iterable(可迭代对象)。map将传入的函数依次作用到序列的每个元素,并把结果作为一个新的Iterator(迭代器)返回。

例如,用Python实现一个函数f(x)=x^2,作用到一个列表上。

>>> def fx(n):
    return n**2

>>> map(fx,[1,2,3,4,5,6,7,8,9])
<map object at 0x0000000002DA8D30>

注意这里结果是一个map对象,实质上是一个迭代器(Iterator),从前面章节了解到迭代器都是惰性的,要把结果转为Iterable来输出。

>>> list(map(fx,[1,2,3,4,5,6,7,8,9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> from collections import Iterator
>>> x=map(fx,[1,2,3,4,5,6,7,8,9])
>>> isinstance(x,Iterator)
True

虽然通过其他的方法也可以实现上述生成一个结果列表的效果,但map作为一个高阶函数,过程中把运算规则抽象化处理,在应用中可以处理更复杂的函数,比如下例把一个list所有数字转为字符串只需要一行代码:

>>> list(map(str,[1,2,3,4,5]))
[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘]

2、reduce

reduce同样把一个函数作用在一个序列上,但其内部的过程却和map不同,reduce是把函数的结果继续和序列的下一个元素继续计算,同时这个函数必须接受两个参数,所以效果就是:

reduce(f,[a,b,c,d])=f(f(f(a,b)+c)+d)

一个简单的求和示例:

>>> from functools import reduce
>>> def myadd(a,b):
    return a+b

>>> reduce(myadd,list(range(1,101)))
5050

另外一个示例,把一个数字序列变成一个数:

>>> def myadd(a,b):
    return a*10+b

>>> reduce(myadd,[1,3,7,9])
1379

配合使用map和reduce可以把一个数字字符串转换为数值:

>>> def funa(nstr):
    return int(nstr)

>>> reduce(myadd,map(funa,‘12345‘))
12345

练习:

‘‘‘
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
输入:[‘adam‘, ‘LISA‘, ‘barT‘],输出:[‘Adam‘, ‘Lisa‘, ‘Bart‘]
‘‘‘
def fun1(stra):
    return stra.capitalize()
name_list=[‘adam‘, ‘LISA‘, ‘barT‘]
print(list(map(fun1,name_list)))
‘‘‘
Python提供的sum()函数可以接受一个list并求和,
请编写一个prod()函数,可以接受一个list并利用reduce()求积:
‘‘‘
def fun2(a,b):
    return a*b
def prod(lista):
    return reduce(fun2,lista)
print(‘3 * 5 * 7 * 9 =‘, prod([3, 5, 7, 9]))
if prod([3, 5, 7, 9]) == 945:
    print(‘测试成功!‘)
else:
    print(‘测试失败!‘)
from functools import reduce
‘‘‘
利用map和reduce编写一个str2float函数,把字符串‘123.456‘转换成浮点数123.456
‘‘‘
#思路:先把原始字符串分成两部分:整数和小数部分分别处理

#处理整数部分的转换
#1、先把字符转换成数值
def strTonumbera(char):
    mydic={‘0‘:0,‘1‘:1,‘2‘:2,‘3‘:3,‘4‘:4,‘5‘:5,‘5‘:5,‘6‘:6,‘7‘:7,‘8‘:8,‘9‘:9}
    return mydic[char]
#2、定义整数部分reduce的函数参数
def myfunca(a,b):
    return a*10+b
#3、通过reduce/map将整数字符串转换为整数数值
def funca(strx):
    return reduce(myfunca,list(map(strTonumbera,list(strx))))

#处理小数部分的转换
#1、定义小数部分reduce的函数参数
def myfuncb(a,b):
    return a/10+b

#2、通过reduce/map将整数字符串转换为整数数值
def funcb(strx):
    #小数部分的处理与整数相比有个难点就是reduce推算中的处理,这里可以先把序列倒序
    stry=list(strx)
    stry.reverse()
    print(stry)
    x=reduce(myfuncb,list(map(strTonumbera,stry)))
    #这时候还不是最终得数,需要再除以10
    return x/10

def str2float(strx):
    #整数部分
    X=funca(strx.split(‘.‘)[0])
    #小数部分
    Y=funcb(strx.split(‘.‘)[1])
    return X+Y

print(str2float(‘123.589‘))
print(‘str2float(\‘123.456\‘) =‘, str2float(‘123.456‘))
if abs(str2float(‘123.456‘) - 123.456) < 0.00001:
    print(‘测试成功!‘)
else:
    print(‘测试失败!‘)

原文地址:https://www.cnblogs.com/tsembrace/p/8504654.html

时间: 2024-10-09 23:40:25

Python学习笔记五函数式编程(一)的相关文章

Python学习笔记五函数式编程(二)

参考教程:廖雪峰官网https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 一.返回函数 高阶函数除了可以接受函数作为参数之外,还可以把函数作为返回值. 通常我们也可以通过以下方式求和: def calc_sum(*args): sum=0 for n in args: sum=sum+n return sum 但如果有一种情况 ,不需要立刻得出求和结果,而是在后续的代码中根据需要再计

python学习笔记(四) - 函数式编程

一. 高阶函数 高阶函数:把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式 def add(x, y, f): return f(x) + f(y) print add(-5, 6, abs) # 11 二.返回函数 aaa 三.匿名函数 aaa 四.装饰器 aaa 五.偏函数 aaa

python学习笔记011——函数式编程

1 函数式编程 面向对象 ,面向过程 ,函数式编程 侧重函数的作用,注重函数结果的传递 函数可以被赋值,也可以接受其他的值 2 函数式编程特点 1.函数是一等公民 与其他变量一样,可以赋值和被赋值,可以作为参数传递 2.只用表达式不用语句 表达式是一个单纯的运算过程,总有返回值,语句是执行某种操作,没有返回值.即每一步运算要单纯,有明确结果. 函数式编程是为运算产生的而不是IO 3. 没有副作用 尽量不使用全局内容也不修改系统变量 4.引用透明 函数运行结果因为参数而发生变化,而不是因为系统的状

Python学习十一:函数式编程

这也是我第一接触函数式编程这个概念,并不知道是干嘛的?好奇心驱使下学习了一下,有了大致的了解: 函数式编程自己的理解:就跟说话一样写程序,这个程序写出来可以直白的告诉人是要干嘛的. 以下是我读到的关于函数式编程的文章的描述: 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数![1] 函数式编程的准则:不依赖于外部的数据,而且也不改变外部数据的值,而是返回一个新的值给你.[2] 函数式编程的理念:把函数当成变量来用,关注于描述问题而不是怎么实现,这样可以让代码更易

python学习笔记(七):面向对象编程、类

一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一个功能.举个例子,你要做饭,可以用电磁炉,也可以用煤气灶.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分别是面向过程编程和面向对象编程. 提到面向对象,就不得不提到另一种编程思想,面向过程:什么是面向过程呢,面向过程的思想是把一个项目.一件事情按照一定的顺

Clojure学习笔记(二)——函数式编程

定义 “函数式编程”是一种编程范式(programming paradigm),即如何编写程序的方法论.主要思想是把运算过程尽量写成一系列嵌套的函数调用. 举例来说,现在有这样一个数学表达式: (1 + 2) * 3 - 4 传统的过程式编程,可能这样写: var a = 1 + 2; var b = a * 3; var c = b - 4; 函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样: var result = subtract(multiply(add(1

python学习笔记之面向对象编程特性(二)

面向对象程序设计中的术语对象(Object)基本上可以看做数据(特性)以及由一系列可以存取.操作这些数据的方法所组成的集合.传统意义上的"程序=数据结构+算法"被封装"掩盖"并简化为"程序=对象+消息".对象是类的实例,类的抽象则需要经过封装.封装可以让调用者不用关心对象是如何构建的而直接进行使用. 首先说明一下python编程规范: #!/usr/bin/env python #coding=utf-8 #编程规范,示例如下:   class 

python 学习笔记7 面向对象编程

一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 二.创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 "类" 和 "对象" 来实现,所以,面向对象编程其实就是对 "类" 和 "对象" 的使用. 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能 对象

python学习笔记(五):装饰器、生成器、内置函数、json

这周学习了装饰器和生成器,写下博客,记录一下装饰器和生成器相关的内容. 一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面每个函数都加一个功能,用来统计每个函数的运行时间是多少,找出来运行比较慢的函数,来优化代码,就需要添加一个新的功能,来统计程序的运行时间,那这样的话,就得修改每个函数了,需要改代码,但是代码特别多,改完了公司倒闭了,这时候装饰