热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python中特殊函数集锦

这篇文章主要介绍了Python中特殊函数,主要介绍一下四个函数:1过滤函数filter2映射和归并函数mapreduce3装饰器@4匿名函数lamda,需要的朋友可以参考下

以下内容主要针过滤函数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函数的工作原理图:

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

代码如下:


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

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

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

  也就是说每个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中并没有给出一个阶乘的内建函数,我们可以使用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 "" + fn() + ""
 return wrapped
def makeitalic(fn):
 def wrapped():
  return "" + fn() + ""
 return wrapped
@makebold
@makeitalic
def hello():
 return "hello world"
print hello()

  输出结果:

hello world
  为什么是这个结果呢?
  1)首先hello函数经过makeitalic 函数的装饰,变成了这个结果hello world
  2)然后再经过makebold函数的装饰,变成了hello world,这个理解起来很简单。

回到顶部
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和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  •     这里使用自己编译的hadoop-2.7.0版本部署在windows上,记得几年前,部署hadoop需要借助于cygwin,还需要开启ssh服务,最近发现,原来不需要借助cy ... [详细]
author-avatar
usually111131
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有