python最常用七大函数(三)之返回函数和匿名函数

简介: python最常用七大函数(三)之返回函数和匿名函数

一、返回函数


Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数!

例如,定义一个函数 f(),我们让它返回一个函数 g,可以这样写:

def f():
    print 'call f()...'
    # 定义函数g:
    def g():
        print 'call g()...'
    # 返回函数g:
    return g
复制代码

仔细观察上面的函数定义,我们在函数 f内部又定义了一个函数 g。由于函数 g也是一个对象,函数名 g就是指向函数 g的变量,所以,最外层函数 f可以返回变量 g,也就是函数 g本身。

调用函数 f,我们会得到 f返回的一个函数:

>>> x = f()   #调用f()

call f()...

>>> x   #变量x是f()返回的函数:

<function g at 0x1037bf320>
复制代码

>>> x()   # x指向函数,因此可以调用

call g()...   #调用x()就是执行g()函数定义的代码

请注意区分返回函数和返回值:

def myabs():
    return abs   # 返回函数
def myabs2(x):
    return abs(x)   # 返回函数调用的结果,返回值是一个数值
复制代码

返回函数可以把一些计算延迟执行。例如,如果定义一个普通的求和函数:

def calc_sum(lst):
    return sum(lst)
复制代码

调用calc_sum()函数时,将立刻计算并得到结果:

>>> calc_sum([1, 2, 3, 4])

但是,如果返回一个函数,就可以“延迟计算”:

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum
复制代码

#调用calc_sum()并没有计算出结果,而是返回函数:

>>> f = calc_sum([1, 2, 3, 4])

>>> f

<function lazy_sum at 0x1037bfaa0>

#对返回的函数进行调用时,才计算出结果:

>>> f()

10

由于可以返回函数,我们在后续代码里就可以决定到底要不要调用该函数。

请编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。

def calc_prod(lst):
    def lazy_prod():
        def f(x, y):
            return x * y
        return reduce(f, lst, 1)
    return lazy_prod
f = calc_prod([1, 2, 3, 4])
print f()
复制代码

二、匿名函数


高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便。

在Python中,对匿名函数提供了有限支持。还是以map()函数为例,计算 f(x)=x2时,除了定义一个f(x)的函数外,还可以直接传入匿名函数:

map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])
复制代码

[1, 4, 9, 16, 25, 36, 49, 64, 81]

通过对比可以看出,匿名函数 lambda x: x * x实际上就是:

def f(x):
    return x * x
复制代码

关键字lambda表示匿名函数,冒号前面的 x表示函数参数。

匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。

使用匿名函数,可以不必定义函数名,直接创建一个函数对象,很多时候可以简化代码:

sorted([1, 3, 9, 5, 0], lambda x,y: -cmp(x,y))
复制代码

[9, 5, 3, 1, 0]

返回函数的时候,也可以返回匿名函数:

myabs = lambda x: -x if x < 0 else x
myabs(-1)
复制代码

利用匿名函数简化以下代码:

def is_not_empty(s):
    return s and len(s.strip()) > 0
filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
复制代码

定义匿名函数时,没有return关键字,且表达式的值就是函数返回值。

参考代码:

print filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', '  ', 'END'])


作者:zhulin1028

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
14天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
25 3
|
18天前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
28 2
|
3天前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
7 0
|
1月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
57 18
|
1月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
73 8
|
8月前
|
算法 Python 容器
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
100 0
|
4月前
|
算法 Python
Python编程的函数—内置函数
Python编程的函数—内置函数
24 0
|
8月前
|
算法 Python
Python编程实验四:函数的使用
Python编程实验四:函数的使用
122 0
|
8月前
|
存储 程序员 Shell
Python 进阶指南(编程轻松进阶):十、编写高效函数
Python 进阶指南(编程轻松进阶):十、编写高效函数
74 0
|
8月前
|
存储 Shell C++
零基础学会python编程——输入 / 输出函数与变量
零基础学会python编程——输入 / 输出函数与变量
168 0