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版本的按任意键继续/退出
Sep 26 Python
Python正则表达式经典入门教程
May 22 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
python @property的用法及含义全面解析
Feb 01 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
对Python 内建函数和保留字详解
Oct 15 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
keras实现多GPU或指定GPU的使用介绍
Jun 17 Python
python中如何设置代码自动提示
Jul 15 Python
如何用python 操作zookeeper
Dec 28 Python
Python页面加载的等待方式总结
Feb 28 Python
Python Django 后台管理之后台模型属性详解
Apr 25 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
dedecms采集中可以过滤多行代码的正则表达式
2007/03/17 PHP
组合算法的PHP解答方法
2012/02/04 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
JS和函数式语言的三特性
2014/03/05 Javascript
浅谈重写window对象的方法
2014/12/29 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
angular ng-repeat数组中的数组实例
2017/02/18 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
2018/04/26 jQuery
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
vue基于v-charts封装双向条形图的实现代码
2019/12/09 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
在vant中使用时间选择器和popup弹出层的操作
2020/11/04 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
python 默认参数问题的陷阱
2016/02/29 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
python爬虫之遍历单个域名
2019/11/20 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
西班牙家用电器和电子产品购物网站:Mi Electro
2019/02/25 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
小学生中国梦演讲稿
2014/04/23 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
银行竞聘报告范文
2014/11/06 职场文书
英语感谢信范文
2015/01/20 职场文书
社区文明创建工作总结2015
2015/04/21 职场文书
优秀大学生申请书
2019/06/24 职场文书
python如何做代码性能分析
2021/04/26 Python
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电