Python笔记3#Python函数式编程

▲函数式编程Function Programming

函数时Python内建支持的一种封装。我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程也可以归结到面向过程的程序设计,但它的思想更接近数学计算。

函数式编程就是一种抽象度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回另一个函数。

Python对函数式编程提供部分支持。由于Python允许使用变量,因此Python不是纯函数式编程语言。

▲高阶函数Higher-order function

变量可以指向函数。函数名也是变量,其实就是指向函数的变量。

变量可以指向函数,函数的参数也能接受变量。那么一个函数就可以接收另一个函数作为参数,这种函数就称为高阶函数。

如果把Python内置的函数名指向其他对象,就无法通过变量名调用函数而出错。示例代码如下:

>>> abs(-10)
10
>>> abs
<built-in function abs>
>>> f = abs
>>> f(-12)
12
>>> f
<built-in function abs>
>>> def add(x, y, f):
...     return f(x) + f(y)
...
>>> add(-10, 12, abs)
22

▲map/reduce

map()函数接收两个参数,一个function和一个list。map将传入的function依次作用到list的每个元素,并把结果作为新的list返回。示例代码如下:

>>> def f(x):
...     return x * x
...
>>> map(f, list(range(1,11)))
<map object at 0x017C0ED0>
>>> list(map(f, list(range(1, 11))))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> list(map(str, list(range(1, 11))))
[‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘10‘]

reduce把一个函数作用在一个list上,这个函数必须接收两个参数。reduce把结果继续和序列的下一个元素做累计计算。示例代码如下:

>>> def f(x, y):
...     return x * 10 + y
...
>>> import functools
>>> functools.reduce(f, [1, 3, 5, 7, 9])
13579
#将char转换为int类型
>>> def chartoint(s):
...     return {‘0‘:0, ‘1‘:1, ‘2‘:2, ‘3‘:3, ‘4‘:4, ‘5‘:5, ‘6‘:6, ‘7‘:7, ‘8‘:8, ‘9‘:9}[s]
...
>>> functools.reduce(f, map(chartoint, ‘13579‘))
13579

▲filter

Python内建的filter()函数用于过滤序列。filter也接收一个函数和一个序列。和map()不同的是,filter()根据函数作用于每个元素的返回值是true还是false来决定保留还是丢弃该元素。示例代码如下:

>>> def is_odd(n):
...     return n % 2 == 1
...
>>> filter(is_odd, list(range(20)))
<filter object at 0x017C0F70>
>>> list(filter(is_odd, list(range(20))))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

▲sorted

对于数字,我们可以直接比较大小。但对于,字符串或者dict,直接比较数学上的大小无意义。因此,比较的过程必须通过函数抽象出来。通常规定,x<y返回-1,x=y返回0,x>y返回1。

对字符串排序,默认按照ASCII的大小比较。

示例代码如下:

>>> sorted([12, 23, 4, 34, 6])
[4, 6, 12, 23, 34]
>>> sorted([‘wddoer‘, ‘IBM‘, ‘apple‘, ‘MIUI‘])
[‘IBM‘, ‘MIUI‘, ‘apple‘, ‘wddoer‘]
#不区分大小写排序
>>> sorted([‘wddoer‘, ‘IBM‘, ‘apple‘, ‘MIUI‘], key = str.lower)
[‘apple‘, ‘IBM‘, ‘MIUI‘, ‘wddoer‘]

▲返回函数

高阶函数除了可以接受函数作为参数传递外,还可以把函数作为结果值返回。示例代码如下:

>>> def lazy_sum(*args):
...     def sum():
...         i = 0
...         for n in args:
...             i = i + n
...         return i
...     return sum
...
>>> f = lazy_sum(1, 2, 3, 4, 5)
>>> f
<function lazy_sum.<locals>.sum at 0x017C43D8>
>>> f()
15

▲匿名函数lambda

匿名函数有个限制,就是只能有一个表达式,不用谢return,返回值就是该表达式的结果。匿名函数也是一个函数对象。示例代码如下:

>>> map(lambda x : x * x, list(range(1, 11)))
<map object at 0x017CA090>
>>> list(map(lambda x : x * x, list(range(1, 11))))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> f = lambda x : x * x
>>> f
<function <lambda> at 0x01808B28>

▲装饰器Decorator

在代码运行期间动态增加功能的方式,就是decorator。Python除了能支持面向对象(OOP)的decorator外,直接从语法层次支持decorator。Python的decorator可以用函数来实现,也可以用类来实现。

函数对象有一个__name__属性,可以拿到函数名

借助Python的@语法,我们可以把decorator至于函数的定义外

示例代码如下:

>>> def now():
...     print(‘2015-1-28‘)
...
>>> now()
2015-1-28
>>> f = now
>>> f()
2015-1-28
>>> f.__name__
‘now‘
#定义一个能打印日志的decorator
>>> def log(func):
...     def wrapper(*args, **kw):
...         print(‘call %s():‘ % func.__name__)
...         return func(*args, **kw)
...     return wrapper
...
#用@语法将decorator至于函数的定义之外
>>> @log
... def now():
...     print(‘2015-01-28‘)
...
>>> now()
call now():
2015-01-28
>>> log(now)
<function log.<locals>.wrapper at 0x01808A50>
>>> now.__name__
‘wrapper‘

▲偏函数Partial function

Python的functools模块提供了很多有用的功能,其中一个就是偏函数。

偏函数的作用就是,把一个函数的某些参数固定住(设默认值),返回一个新的函数。调用这个新函数会更简单。

创建偏函数时,实际上可以接受函数对象,*args,**kw(keywords)这三个参数。

示例代码如下:

#将字符串做二进制转换
>>> int(‘1111‘, base=2)
15
>>> int(‘1111‘, base=8)
585
>>> int(‘1111‘, base=10)
1111
>>> int(‘1111‘, base=16)
4369
#导入functools模块
>>> import functools
#定义一个偏函数int2,将传入的字符串参数按二进制转换
>>> int2 = functools.partial(int, base = 2)
>>> int2(‘1111‘)
15
时间: 2024-12-05 22:36:03

Python笔记3#Python函数式编程的相关文章

python笔记三:函数式编程

1.概念: 函数式编程就是一种抽象程度很http://i.cnblogs.com/EditPosts.aspx?opt=1高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用.而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作 用的. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部

python笔记5:函数式编程

5 函数式编程(即高阶函数,将函数作为参数传入) map(): map()函数接收两个参数,一个是传入函数,一个是Iterable,map将传入函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. 如:map(f, [x1, x2, x3, x4]) = [f(x1),f(x2),f(x3),f(x4)] -->把f(x)作用在list的每一个元素并将结果生成一个新的list reduce(): 如:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1,

PYTHON修饰器的函数式编程

转自:http://coolshell.cn/articles/11265.html Python修饰器的函数式编程 Python的修饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能

python笔记 - day7-1 之面向对象编程

python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: sele是什么? self是一个python自动会给传值得参数: 哪个对象执行方法,self就是哪个对象: 构造方法: 类中有一个特殊的方法,__init__,类()自动执行: 面向对象,三大特性: 封装,继承,多态:  

Python学习十一:函数式编程

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

2015/9/18 Python基础(14):函数式编程

这篇写了忘发.现在补上. Python不是也不大可能成为一种函数式的编程语言,但是它支持许多有价值的函数式编程语言构建.也有些表现的像函数式编程机制但是从传统上也不能认为是函数式编程语言的构建.Python提供的以四中内建函数和lambda表达式的形式出现. 匿名函数与lambda lambda [arg1, [arg2, ... argN]]:expression Python允许用lambda关键字创造匿名函数.匿名是因为不需要以标准的方式来声明.然而,作为函数,它们也能有参数.一个完整的l

[原创]Python入门学习之函数式编程

一 前言 初次接触函数式编程是在学习分布式计算的时候,那时候对map/reduce是不明觉厉,也没有懂多少原理方面的东西.Python中的函数式编程也算是初步了解一下map/reduce.所谓函数式编程,本质上是可以归结为面向过程的程序设计,但是它的思想很接近数学计算.它比一般的编程范式要更抽象,而且纯粹的函数式编程语言编写的函数是没有变量的,只要确定了输入,那也就确定了输出.它的另外一个特点就是把函数本身作为参数传入到另一个函数中,允许返回一个函数. 二 高阶函数(High-order Fun

python面向过程与函数式编程

周六闲暇的午后,看到博客园众多大神的技术贴.作为一个什么都不懂的小学生,也开通了自己的博客,以后可以对外装×成伪大神了.第一篇记录下今天下午学的python基础: 1.面向过程编程:在python中,所说的过程其实和函数差别不大,也需要def进行定义,但是过程是没有返回值的. def guocheng(): print('我是过程') 上面定义的就是一个过程,没有返回值,只有函数内部的相关逻辑. 调用上面的过程:a=guocheng(),这样即可调用,如果在面板上打印a,会显示NONE,因为过程

Python进阶(迭代,函数式编程,Collections类)

PYTHON进阶 PYTHON迭代 @生成器(Generator) 列表生成器产生的列表很占用内存空间,我们每次在计算使用的时候都是对单个元素进行操作,这样其它元素占用的空间就白白浪费了.所以如果列表内的元素可以按照某种算法推算出来,这样我们就可以在循环过程中不断的推算下一个元素(一次只推算一个),从而避免创建完整的列表而占用大量内存. 在Python中我们把一边循环一边计算的机制称为生成器:generator. 生成器创建的语法 列表生成器中括号[]包裹改为小括号()包裹 # 列表生成器 da