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用户和用户组

    一、用户和组 1、用户账号类型 在Linux系统中,根据系统管理的需要将用户账号分为不同的类型,其拥有的权限、担任的角色也各不相同。主要包括超级用户、普通用户和程序用户。 【超级用户】:root用户是Linux系统中默认的超级用户账号,对本主机拥有最高的权限,类似于Windows系统中的Administrator用户。只有当进行系统管理、维护任务时,才建议使…

    Linux干货 2017-07-22
  • N25_第一周作业_leon

    第一周博客作业 1.       描述计算机的组成及其功能 计算机主要有五大部分组成:控制器;运算器;存储器;输入设备;输出设备。   功能: 控制器:计算机的指挥系统。控制器通过地址访问存储器,从存储器中取出指令,经译码器分析后,根据指令分析结果产生相应的操作控制信号作用于其他部件,使得…

    Linux干货 2016-12-01
  • SELinux

    软件的安全性 提高软件的安全性 选择安全系数较高的系统 提高现有系统的安全性 计算机的安全等级 D:最低的安全级别,提供最少的安全防护,系统访问无限制。DOS C:访问控制的权限,能够实现可控的安全防护,个人账户管理,审计和资源隔离 Unix Linux windowNT B:支持多级安全,通过硬件对安全数据进行保护 A:最高级别,提供验证设计,要求数据从生…

    Linux干货 2017-05-21
  • 互联网安全之sudo使用指南

    一、前言 sudo是什么? sudo是系统管理指令;由于root用户权限过大,在实际生产过程中很少使用root用户直接登录系统,而是使用普通用户登录系统;但是如果普通用户要对系统进行日常维护操作时需要su到root用户,为了提高安全性,可以使用sudo授权某一用户在某一主机以某一用户身份运行某些命令;从而减少root用户密码知晓人,提高系统安全性。 &nbs…

    2015-06-23
  • 第三周作业

    1、列出1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。[root@localhost ~]# who | cut -d ‘ ‘ -f1 | sort -u 2、取出最后登录到当前系统的用户的相关信息。[root@localhost ~]# who | tail -1 | export &am…

    Linux干货 2017-12-16
  • Linux开学一周的学习心得

    Linux,这个名字第一次听到是通过张超老师给我讲解,因为我在学校学的是金融数学,平时对这方面没有太多接触。当时对Linux就知道是个系统,随后在网上搜了搜,了解也不太多。 直到今天已经来马哥教育一星期了,刚入学的这一星期上课,都是一些基本的命令,感觉学着还蛮有意思,教学的安排也非常合理,我们大家学一天还能自己动手操作一天,既能专心听课,又能把学到的知识巩固…

    2017-07-15

评论列表(1条)

  • stanley
    stanley 2015-12-19 21:02

    非常不错。赞