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

相关推荐

  • 给linux系统添加新的磁盘

    虚拟化环境中,我们经常会遇到需要增加磁盘容量的情况,通常有两种方式,第一种是添加一块新的硬盘,另一种是扩容原有磁盘,以下是添加新磁盘至linux系统的操作规范。注:具体磁盘信息可能有所不同。 ##查看新增加磁盘/dev/sdb的信息 [root@CentOS7 ~]# fdisk -l /dev/sdb   Disk /dev/sdb: 5368 …

    Linux干货 2016-11-11
  • RAID简述和Linux软RAID配置

    RAID简述和Linux软RAID配置 PS:仅为课程练习,原理和配置可能有误,仅供参考,谢谢; 1.RAID功能简述     RAID,全称(Redundant Arrays of Inexpensive Disk或Redundant Arrays of Independent Disk),现在一般多用于后面那个称呼,独立磁盘冗余阵列。RAID的基础概念大…

    Linux干货 2016-07-17
  • 正则表达式

    grep:Global search REgular expression and Print out the line         文本搜索工具,根据用户指定的”模式“对目标文本逐行进行匹配检查;打印匹配到的行        模式:由正则表达式字符及文本字符所编写的过滤条件…

    Linux干货 2016-08-08
  • #招聘福利#饿了么/运维核心岗位/上海

    饿了么/运维核心岗位/上海 待遇面谈 具体岗位:         应用运维,核心岗位,负责商家订单系统,有之前的学长带着成长 要求:     1、1-2年以上工作经验,     2、熟悉shell和python,    &nbsp…

    Linux干货 2016-03-18
  • 实验:路由、bonding、team

    实验:路由实验 路由表构成目标网络:网络ID 子网掩码接口:到达目标网络,从哪个接口出来,此接口网关:gateway,下一个邻近路由器的邻近接口的IP地址,如果目标网络和本路由器直接,网关的地址为接口的IP centos6 关闭NetworkManager服务chkconfig NetworkManagerservice NetworkManager sto…

    Linux干货 2017-05-06
  • sed

    sed Stream EDitor, 行编辑器 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。 Sed主要用来自动…

    Linux干货 2017-04-26

评论列表(1条)

  • stanley
    stanley 2015-12-19 21:02

    非常不错。赞