Python入门之闭包,匿名函数,过滤器,映射器,折叠

在学习python函数的过程中,函数的高阶应用包括闭包lambda函数,过滤器等都让我头痛不已.接下来我把课堂中听到的笔记进行整理,再写一遍,希望在提醒自己的同时也能帮助到别人.

首先,我们来看一下什么是闭包,闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。

废话不多说,我们上栗子:

def f1():
    def line(x):
        return 2*x+1
    return line
myline=f1()
print myline(5)
11

在上面f1()的返回结果返回给myline对象,输出11

如果在line()中引入了外部的变量,情况会怎么样呢

def f1():
    b=10
    def line(x):
        return 2*x+b
    return line
b=5
myline=f1()
print myline(5)
20

我们可以看到,line定义的隶属程序块中引用了高层级的变量b,但b信息存在于line的定义之外。我们称b为line的环境变量。事实上,line作为f1的返回值时,line中已经包括b的取值(尽管b并不隶属于line)。

上面的代码将打印20,也就是说,line所参照的b值是函数对象定义时可供参考的b值,而不是使用时的b值。

接下来是匿名函数lambda,lambda用途是指定短小的回调函数.lambda将返回一个函数而不是将函数赋值给参数

lambda arg:expression
lambda x,y:x+y
f2=lambda x,y:x+y
f2(3,4)
7

翻译成普通函数就是

def f2(x,y)
    return x+y
a=f2()
a(3,4)

lambda也支持使用默认参数

f=lambda x,y,z=10 :x+y+z
f(4,5)
19

l3=[(lambda x:x*2),(lambda y :y*3)]
for i in l3:
    print i(4)
8
12

接下来是3个python内置函数 filter(),map(),reduce()

filter()用来过滤,filter的语法是

filter(func,seq)

函数接收一个函数和一个序列,把函数一次用于序列的每个元素,如果为True则保留

l1=[1,2,3,4,42,60]
def f1(x):
    if x>20: return True
    else: return False
filter(f1,l1)
[42, 60]

map()和filter()一样,也接收了一个函数和一个序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回

l1=[1,2,3,4,42,60]
map(lambda x:x*2,l1)
[2, 4, 6, 8, 84, 120]

map中可以跟多个list,

def abc(x,y):
    return x*100+y
list1=[11,22,33]
list2=[44,55,66]
map(abc,list1,list2)
[1144, 2255, 3366]

reduce()迭代器

reduce(func,seq[,init])

对sequence中的item顺序迭代调用function,如果有init,还可以作为初始值调用,例如可以用来对List求和:

def add(x,y):
    return x+y
reduce(add,range(1,11),10)
65

完成从1加到11,最后加上初始值10,最后是65

接下来完成以下马哥在视频中的几个练习

返回/etc/passwd中包含了/bin/bash字串的所有用户名

f1=open('/etc/passwd')
b=filter(lambda i:'/etc/passwd' in i,f1.readlines())
re.search('(\w*):',str(b)).groups(0)

将/etc/passwd中的每一行都分隔为一个列表

 f1=open('/etc/passwd')
f1.readline()

用折叠的方式求阶乘 

l1=[1,2,3,4]
reduce(lambda x,y:x*y,l1)

原创文章,作者:海马,如若转载,请注明出处:http://www.178linux.com/10094

(0)
海马海马
上一篇 2015-12-19 20:56
下一篇 2015-12-21 00:21

相关推荐

  • rsync+inotify实现文件同步

    一、前言 什么是rsync,remote synchronize远程同步简写。Linux系统上由rsync这个软件包提供。rsync有几个特点,镜像保存整个文件目录树或文件系统;有较高的数据传输效率;可以借助ssh实现安全数据传输;支持匿名传输等。rsync同步只是针对变化的文件进行传输,意味着其会在源和目标之间比较文件的异同。相对与scp来说,第一次传输两…

    Linux干货 2015-10-31
  • 网络管理

    一、网络概念     什么是网络     资源共享的功能和优点         数据和应用程序         资源 &…

    Linux干货 2016-09-09
  • 基于Corosync + Pacemaker+DRBD实现MySQL高可用集群

    前言 在众多的高可用集群解决方案中,除了Heartbeat之外,Corosync也能提供类似于Heartbeat一样的功能,而且目前RedHat官方提供的高可用集群解决方案的程序包都以Corosync为主,所以今后Corosync会逐渐取代Heartbeat。本文带来的是基于Corosync + Pacemaker+DRBD的MySQL高可用集群解决方案。 …

    Linux干货 2015-06-12
  • Linux基础小模块

    1.基础知识小块:shell 由shell程序的自带命令:即为内置命令(builtin) 独立的可执行程序文件、文件名 :即为外部命令  [root@localhost~]#ls      ~用户当前所在目录  #:命令提示符(管理员帐号root)  $:普通用户   &nbsp…

    Linux干货 2016-08-05
  • linux文件系统创建

    件系统管理 格式化:低级格式化(分区之前,划分磁道)         高级格式化:在分区之后进行,创建文件系统         元数据(也是放在块上(block)):inode  &nbsp…

    Linux干货 2016-08-29
  • SSH原理与运用:远程登录

    如果本地用户名与远程用户名一致,登录时可以省略用户名。 1 $ ssh host SSH的默认端口是22,也就是说,你的登录请求会送进远程主机的22端口。使用p参数,可以修改这个端口。 1 $ ssh –p 2222 user@host 上面这条命令表示,ssh直接连接远程主机的2222端口。 三、中间人攻击 SSH之所以能够保证安全,原因在于它…

    Linux干货 2017-08-14

评论列表(1条)

  • stanley
    stanley 2015-12-19 21:02

    非常不错。赞