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
下一篇 2015-12-21

相关推荐

  • X86平台系统启动流程 (Blog 9)

    POST –> BootSeqence(BIOS) –> Bootloader(MBR) –> Kernel(initrd) –> init(/etc/inittab)

    2017-11-27
  • 新的篇章

    第一天,linux,努力,奋斗!

    Linux干货 2017-07-11
  • 文本三剑客—sed 基础

    文本三剑客—sed 基础        sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式的插入、删除或者替换数据中的文本。流编辑器则会自爱编辑器处理数据之前基于预习提供的一组…

    Linux干货 2017-05-15
  • 网络基础

    什么是计算机网络? 是指将地理位置不同的具有独立功能的多台计算机及外部设备,借助于某种网络介质连接起来,实现资源共享和信息传递的计算机系统 计算机网络的特点? 1、能实现数据信息的快速传输和集中处理 2、可共享计算机系统资源 3、提高了计算机的可靠性及可用性 4、能均衡负载互相协作 常见的网络应用程序 Web 浏览器(Chrome、IE、Firef…

    Linux干货 2016-09-09
  • 磁盘配额管理

    磁盘配额管理    设定文件系统配额 配置逻辑卷设定LVM快照 配置配额系统综述在内核中执行以文件系统为单位启用对不同组或用户的策略不同根据块或者节点进行限制   执行软限制(soft linmit)   硬限制(hard limit)初始化分区挂载选项:usrquota, ge…

    Linux干货 2017-05-22
  • 最简单也最难:运维监控的最后1公里

    谈运维我们不得不提监控,监控是运维的起点,也是难点。随着IT架构逐渐复杂化,从前端到IT底层,中间涉及浏览器、网络、服务器、操作系统、中间件、应用、数据库等,每个环节厂商不尽相同。当出现异常需要定位哪个环节出了问题的时候,排查就耗时耗力,若使用优云监控产品,以上难题不再是问题。优云全栈运维监控覆盖了所有环节的监控,真正做到监控无盲区,运维无隐患。 运维最后一…

    系统运维 2017-01-09

评论列表(1条)

  • stanley
    stanley 2015-12-19 21:02

    非常不错。赞