Python中特殊函数集锦


Posted in Python onJuly 27, 2015

以下内容主要针过滤函数filter , 映射和归并函数map/reduce , 装饰器@ 以及 匿名函数lamda,具体内容如下:

1. 过滤函数filter

定义:filter 函数的功能相当于过滤器。调用一个布尔函数bool_func来迭代遍历每个列表中的元素;返回一个使bool_func返回值为true的元素的序列。

a=[0,1,2,3,4,5,6,7]

b=filter(None, a)

print b

输出结果:[1, 2, 3, 4, 5, 6, 7]

回到顶部
2. 映射和归并函数map/reduce

这里说的map和reduce是Python的内置函数,不是Goggle的MapReduce架构。

2.1 map函数

map函数的格式:map( func, seq1[, seq2...] )

Python函数式编程中的map()函数是将func作用于列表中的每一个元素,并用一个列表给出返回值。如果func为None,作用等同于一个zip()函数。

下图是当列表只有一个的时候,map函数的工作原理图:

Python中特殊函数集锦

举个简单的例子:将列表中的元素全部转换为None。

map(lambda x : None,[1,2,3,4])

输出:[None,None,None,None]。

当列表有多个时,map()函数的工作原理图:

Python中特殊函数集锦

也就是说每个seq的同一位置的元素在执行过一个多元的func函数之后,得到一个返回值,这些返回值放在一个结果列表中。

下面的例子是求两个列表对应元素的积,可以想象,这是一种可能会经常出现的状况,而如果不是用map的话,就要使用一个for循环,依次对每个位置执行该函数。

print map( lambda x, y: x * y, [1, 2, 3], [4, 5, 6] )  # [4, 10, 18]

上面是返回值是一个值的情况,实际上也可以是一个元组。下面的代码不止实现了乘法,也实现了加法,并把积与和放在一个元组中。

print map( lambda x, y: ( x * y, x + y), [1, 2, 3], [4, 5, 6] )  # [(4, 5), (10, 7), (18, 9)]

还有就是上面说的func是None的情况,它的目的是将多个列表相同位置的元素归并到一个元组,在现在已经有了专用的函数zip()了。

print map( None, [1, 2, 3], [4, 5, 6] )  # [(1, 4), (2, 5), (3, 6)]

print zip( [1, 2, 3], [4, 5, 6] )  # [(1, 4), (2, 5), (3, 6)]

注意:不同长度的多个seq是无法执行map函数的,会出现类型错误。

2.2 reduce函数

reduce函数格式:reduce(func, seq[, init]).

reduce函数即为化简,它是这样一个过程:每次迭代,将上一次的迭代结果(第一次时为init的元素,如没有init则为seq的第一个元素)与下一个元素一同执行一个二元的func函数。在reduce函数中,init是可选的,如果使用,则作为第一次迭代的第一个元素使用。

简单来说,可以用这样一个形象化的式子来说明:

reduce(func, [1,2,3])=func(func(1,2), 3)

reduce函数的工作原理图如下所示:

Python中特殊函数集锦

举个例子来说,阶乘是一个常见的数学方法,Python中并没有给出一个阶乘的内建函数,我们可以使用reduce实现一个阶乘的代码。

n = 5

print reduce(lambda x, y: x * y, range(1, n + 1))  # 120

那么,如果我们希望得到2倍阶乘的值呢?这就可以用到init这个可选参数了。

m = 2

n = 5

print reduce( lambda x, y: x * y, range( 1, n + 1 ), m )  # 240

回到顶部
3. 装饰器@

3.1 什么是装饰器(函数)?

定义:装饰器就是一函数,用来包装函数的函数,用来修饰原函数,将其重新赋值给原来的标识符,并永久的丧失原函数的引用。

3.2 装饰器的用法

先举一个简单的装饰器的例子:

#-*- coding: UTF-8 -*-

import time

def foo():

    print 'in foo()'

# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法

def timeit(func):

    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
   

def wrapper():

        start = time.clock()

        func()

        end =time.clock()

        print 'used:', end - start
   

# 将包装后的函数返回
   

return wrapper
foo = timeit(foo)

foo()

输出:

in foo()

used: 2.38917518359e-05

python中专门为装饰器提供了一个@符号的语法糖,用来简化上面的代码,他们的作用一样。上述的代码还可以写成这样(装饰器专有的写法,注意符号“@”):

#-*- coding: UTF-8 -*-

import time

# 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法

def timeit(func):

    # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
   

def wrapper():

        start = time.clock()

        func()

        end =time.clock()

        print 'used:', end - start

    # 将包装后的函数返回

    return wrapper

@timeit

def foo():

    print 'in foo()'

#foo = timeit(foo)

foo()

其实对装饰器的理解,我们可以根据它的名字来进行,主要有三点:

   1)首先装饰器的特点是,它将函数名作为输入(这说明装饰器是一个高阶函数);

   2)通过装饰器内部的语法将原来的函数进行加工,然后返回;

   3)原函数通过装饰器后被赋予新的功能,新函数覆盖原函数,以后再调用原函数,将会起到新的作用。

说白了,装饰器就相当于是一个函数加工厂,可以将函数进行再加工,赋予其新的功能。

装饰器的嵌套:

#!/usr/bin/python
# -*- coding: utf-8 -*-
def makebold(fn):
 def wrapped():
  return "<b>" + fn() + "</b>"
 return wrapped
def makeitalic(fn):
 def wrapped():
  return "<i>" + fn() + "</i>"
 return wrapped
@makebold
@makeitalic
def hello():
 return "hello world"
print hello()

输出结果:

<b><i>hello world</i></b>

为什么是这个结果呢?

1)首先hello函数经过makeitalic 函数的装饰,变成了这个结果<i>hello world</i>

2)然后再经过makebold函数的装饰,变成了<b><i>hello world</i></b>,这个理解起来很简单。

回到顶部
4. 匿名函数lamda

4.1 什么是匿名函数?

在Python,有两种函数,一种是def定义,一种是lambda函数。

定义:顾名思义,即没有函数名的函数。Lambda表达式是Python中一类特殊的定义函数的形式,使用它可以定义一个匿名函数。与其它语言不同,Python的Lambda表达式的函数体只能有唯一的一条语句,也就是返回值表达式语句。

4.2 匿名函数的用法

lambda的一般形式是关键字lambda,之后是一个或者多个参数,紧跟的是一个冒号,之后是一个表达式:

lambda argument1 argument2 ... :expression using arguments

lambda是一个表达式,而不是一个语句。

lambda主体是一个单一的表达式,而不是一个代码块。

举一个简单的例子,假如要求两个数之和,用普通函数或匿名函数如下:

1)普通函数: def func(x,y):return x+y

2)匿名函数: lambda x,y: x+y

再举一例:对于一个列表,要求只能包含大于3的元素。

1)常规方法:

L1 = [1,2,3,4,5]

L2 = []

for i in L1:

    if i>3:

        L2.append(i)

2)函数式编程实现: 运用filter,给其一个判断条件即可

def func(x): return x>3

filter(func,[1,2,3,4,5])

3)运用匿名函数,则更加精简,一行就可以了:

filter(lambda x:x>3,[1,2,3,4,5])

总结: 从中可以看出,lambda一般应用于函数式编程,代码简洁,常和reduce,filter等函数结合使用。此外,在lambda函数中不能有return,其实“:”后面就是返回值。

为什么要用匿名函数?

1) 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。

2) 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。

3) 使用lambda在某些时候让代码更容易理解。

以上内容就是针对Python中特殊函数详细介绍,希望对大家有所帮助。

Python 相关文章推荐
Python入门_浅谈逻辑判断与运算符
May 16 Python
python模块之time模块(实例讲解)
Sep 13 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
Tensorflow中的dropout的使用方法
Mar 13 Python
python 安装移动复制第三方库操作
Jul 13 Python
浅谈python出错时traceback的解读
Jul 15 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
python 实现批量图片识别并翻译
Nov 02 Python
解决Python字典查找报Keyerror的问题
May 26 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 Python
Python实现截屏的函数
Jul 26 #Python
Python计算已经过去多少个周末的方法
Jul 25 #Python
Python基于动态规划算法计算单词距离
Jul 25 #Python
Python中Django框架利用url来控制登录的方法
Jul 25 #Python
Python实现模拟登录及表单提交的方法
Jul 25 #Python
Python基于有道实现英汉字典功能
Jul 25 #Python
Python实现简单的代理服务器
Jul 25 #Python
You might like
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
在ASP.NET中使用JavaScript脚本的方法
2013/11/12 Javascript
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
基于javascript的拖拽类封装详解
2019/04/19 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
2020/08/10 Javascript
[01:04:02]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第二场 1月24日
2021/03/11 DOTA
Python单链表简单实现代码
2016/04/27 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
Python中import机制详解
2017/11/14 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
尼克松手表官网:Nixon手表
2019/03/17 全球购物
教学实验楼管理制度
2014/02/01 职场文书
材料员岗位职责
2014/03/13 职场文书
省级优秀毕业生主要事迹
2014/05/29 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
周末问候语大全
2015/11/10 职场文书
2016公司新年问候语
2015/11/11 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
JS封装cavans多种滤镜组件
2022/02/15 Javascript
Python简易开发之制作计算器
2022/04/28 Python