码迷,mamicode.com
首页 > 编程语言 > 详细

Python笔记3#Python函数式编程

时间:2015-01-28 19:29:54      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

▲函数式编程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

Python笔记3#Python函数式编程

标签:

原文地址:http://www.cnblogs.com/wddoer/p/4256641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!