【第十六天】函数作为参数和返回值

7.2

1.函数作为参数和返回值

在函数式编程中,函数是第一级对象,所谓‘第一级对象’
即函数能像普通对象一样来使用,因此,函数的使用变得更加自由
对于‘一切皆对象’的py来说,这是自然而然的结果
既然如此,那么函数可以像一个普通对象一样,成为其他函数的参数
比如下面的程序,函数就充当了参数:

def square_sum(a,b):
    return a**2 + b**2
def cubic_sum(a,b):
    return a**3 + b**3
def argument_demo(f,a,b):
    return f(a,b)

print(argument_demo(square_sum,3,5))    #打印34
print(argument_demo(cubic_sum,3,5))     #打印152

函数argument_demo()的第一个参数f就是一个函数对象
按照位置传参,square_sum()传递给函数argument_demo()
对应参数列表中的f,f会在argument_demo()中被调用,我们可以把其他函数
如cubic_sum()作为参数传递给argument_demo()

很多语言都能把函数作为参数使用,例如C语言,在图形化界面编程时
这样一个作为参数的函数经常起到回调(Callback)的作用
当某个事件发生时,比如界面上的一个按钮被按下,回调函数就会被调用
下面是一个GUI回调的例子:

import tkinter as tk

def callback()
    """
    callback function for button click
    """
    listbox.insert(tk.END,"hello world!")

if __name__ == "__main__":
    master = tk.Tk()
    button = tk.Button(master,text = "OK",command=callback)
    button.pack()
    
    listbox = tk.Listbox(master)
    list.pack()
    tk.mainloop()

py内置了tkinter的图形化功能,在上面的程序中
回调函数将在列表栏中插入”hello world!”
回调函数作为参数传给按钮的构造器
每当按钮被点击时,回调函数就会被调用

《【第十六天】函数作为参数和返回值》

2.函数作为返回值

既然函数是一个对象,那么它就可以成为另一个函数的返回结果

def line_conf():
    def line(x):
        return 2*x+1
    return line     #返回一个函数表达式

my_line = line_conf()
print(my_line(5))   #打印11

上面的代码可以成功运行,line_conf()的返回结果被赋给line对象
上面的代码将打印11

在上面的例子中,我们看到了在一个函数内部定义的函数
和函数对象一样,函数对象也有存活范围,也就是函数对象的作用域
py的缩进形式很容易让我们看到函数对象的作用域
函数对象的作用域与它的def的缩进层级相同,比如下面的代码
我们在line_conf()函数的隶属范围内定义的函数line()
就只能在line_conf()的隶属范围内调用

def line_conf():
    def line(x):
        return 2*x+1
    print(line(5))       #作用域内
 
if __name__ == "__main__":
    line_conf()
    print(line(5))       #作用域外,报错
11
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-d80d15301af2> in <module>()
      6 if __name__ == "__main__":
      7     line_conf()
----> 8     print(line(5))

NameError: name 'line' is not defined

函数line()定义了一条直线(y=2x+1),可以看到
在line_conf()中可以调用line()函数
而在作用域之外调用line()函数将会有下面的错误:

NameError: name 'line' is not defined

这说明已经超出了函数line()的作用域,py对该函数的调用失败

    原文作者:人生苦短_我用Python
    原文地址: https://www.jianshu.com/p/9082df8c0d87
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞