2020-12-05

间接调用函数

前面调用函数时,使用函数名加参数列表的形式调用。除此之外,还可以将函数名赋值给一个变量,再通过变量名加参数列表的形式间接调用函数,如例所示。在这里插入图片描述
间接调用函数有何用处?这种用法可以使一个函数作为另一个函数的参数,如例所示。
在这里插入图片描述

匿名函数

匿名函数是指没有函数名称的、临时使用的微函数。它可以通过lambda表达式来声明,其语法格式如下:在这里插入图片描述
其中,“[arg1 [, arg2, …, argn]]”表示函数的参数,“表达式”表示函数体。lambda表达式只可以包含一个表达式,其计算结果可以看作是函数的返回值。虽然lambda表达式不允许包含其他复杂的语句,但在表达式中可以调用其他函数。
接下来演示lambda表达式的使用,如例所示。
在这里插入图片描述
在例中,第1行使用lambda表达式声明匿名函数并赋值给sum,相等于这个函数有了函数名sum,该行相当于以下代码:
在这里插入图片描述
使用lambda表达式声明的匿名函数也可以作为自定义函数的实参,如例所示。
在这里插入图片描述
此外,lambda表达式声明的匿名函数还可以作为内建函数的实参,如例所示。
在这里插入图片描述

装饰器的概念

装饰器本质上还是函数,可以让其他函数在不做任何代码修改的前提下增加额外功能。它通常用于有切面需求的场景,例如,插入日志、性能测试、权限校验等。
在讲解装饰器之前,先看一段简单的程序,如例所示。
在这里插入图片描述
运行结果如图所示。
在这里插入图片描述
在例中, 第1行定义了一个带单个参数func的名称为 f2的函数,第2行f1()函数为闭包的功能函数,其中调用了func()函数并将func()函数的返回值加1并返回。这样每次f2()函数被调用时,func的值可能会不同,但不论func()代表何种函数,程序都将调用它。
从程序运行结果可看出,调用函数decorated()的返回值为2,调用func()函数的返回值为1,两者都输出“func()函数”,此时称变量decorated是func的装饰版,即在func()函数的基础上增加新功能,本例是将func()函数的返回值加1。

eval()函数

eval()函数用于对动态表达式求值,其语法格式如下:
在这里插入图片描述
其中,source是动态表达式的字符串,globals和locals是求值时使用的上下文环境的全局变量和局部变量,如果不指定,则使用当前运行上下文。
接下来演示eval()函数的用法,如例所示。
在这里插入图片描述
在例中,通过input()函数输入Python表达式,接着通过eval()函数求出该表达式的值。

exec()函数

exec()函数用于动态语句的执行,其语法格式如下:
在这里插入图片描述
其中,source是动态语句的字符串,globals和locals是使用的上下文环境的全局变量和局部变量,如果不指定,则使用当前运行上下文。
接下来演示exec()函数的用法,如例所示。
在这里插入图片描述
在例中,通过input()函数输入Python语句,接着通过exec()函数执行该语句。

compile()函数

compile()函数用于将一个字符串编译为字节代码,其语法格式如下:
在这里插入图片描述
其中,source为代码语句的字符串,filename为代码文件名称,如果不是从文件读取代码,则传递一些可辨认的值,mode为指定编译代码的种类,其值可以为’exec’、‘eval’、‘single’,剩余参数一般使用默认值。
接下来演示compile()函数的用法,如例所示。
在这里插入图片描述
在例中,通过input()函数输入Python语句,接着通过compile()函数将字符串str转换为字节代码对象。

map()函数

程序中经常需要对列表和其他序列中的每个元素进行同一个操作并把其结果集合起来,具体示例如下:
在这里插入图片描述
上述代码表示将list1中的每个元素加1并添加到list2中。该程序运行后,输出结果如下:
在这里插入图片描述
实际上,Python提供了一个更方便的工具来完成此种操作,这就是map()函数,其语法格式如下:
在这里插入图片描述
其中,function为函数名,其余参数为序列,返回值为迭代器对象,通过list()函数可以将其转换为列表,也可以使用for循环进行遍历操作。
接下来演示map()函数的用法,如例所示。
在这里插入图片描述
在例中,map()函数对列表list1中的每个元素调用func函数并将返回结果组成一个可迭代对象,如图所示。
在这里插入图片描述
此外,map()函数还可以接受两个序列,具体示例如下:
在这里插入图片描述
该程序运行后,输出结果如下:
在这里插入图片描述

filter()函数

filter()函数可以对指定序列进行过滤操作,其语法格式如下:
在这里插入图片描述
其中,function为函数名,它所引用的函数只能接受一个参数,并且返回值是布尔值,sequence为一个序列,filter()函数返回值为迭代器对象。
接下来演示filter()函数的用法,如例所示。
在这里插入图片描述
在例中,filter()函数对列表list中的每个元素调用func函数并返回使得func函数返回值为True的元素组成的可迭代对象,如图所示。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值