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!"
回调函数作为参数传给按钮的构造器
每当按钮被点击时,回调函数就会被调用
![](https://img.haomeiwen.com/i11103252/ca06412107dfdfe1.jpg)
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对该函数的调用失败
网友评论