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

作者: 人生苦短_我用Python | 来源:发表于2018-03-28 23:29 被阅读10次

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对该函数的调用失败

相关文章

  • 2018-03-14鲁大师源码分析flow

    flow接收多个函数作为参数,将第N个函数的返回值作为参数传给第N+1个函数。 前8行判断是否为函数。11行三目运...

  • 高阶函数

    高阶函数 函数作为参数 函数作为返回值的时候 作为参数 回调函数 回调函数就是一个参数,将这个函数作为参数传到另一...

  • python 函数进阶

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的...

  • python 函数进阶

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的...

  • Python函数高阶

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的...

  • 17 函数进阶

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的...

  • 06.1.Python函数续

    目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数...

  • 11.Python函数续

    目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数...

  • 10.Python函数续

    目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数...

  • [Python基础]D10 函数进阶

    目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数...

网友评论

    本文标题:【第十六天】函数作为参数和返回值

    本文链接:https://www.haomeiwen.com/subject/odjpcftx.html