一、将函数作为变量去使用

在Python中函数也是一种对象,是一种名为function的对象,所以可以将函数赋值给变量,类似整数、浮点数、列表、元组、字典赋值给变量。

我们编写如下程序:

 #coding=utf-8
def power(base,exponent):
"""定义函数:计算乘方"""
result = 1
for i in range(1,exponent + 1):
result *= base
return result my_function = power
print(my_function(2,3))

运行程序之后控制台打印如下:

解释:我们先定义了一个函数名为power作用就是用来计算乘方,第一个参数为底数,第二个参数为指数,第9行,我们将power() 函数赋值给变量my_pow,所以在第10行我们就可以用my_pow调用power() 函数了,有此可见,我们可以在程序不同的时间或者位置将my_function指向其他已定义过的函数进行调用,从而使程序更加灵活的运行,所以这是使用函数变量的一大好处。

二、将函数作为一个函数的形参

有时候定义一个这样的函数:该函数大部分计算逻辑都能确定,但是有些处理逻辑无法确定,所以某些程序代码需要根据具体情况改变,此时我们可以使用函数形参来解决,这样就可以在调用函数时传入不同函数作为参数,从而动态改变这段代码。

我们编写如下的栗子:

 #coding=utf-8
def funcs(data,fn):
"""fn形参为函数类型即是function类型"""
result=[]
for x in data:
result.append(fn(x)) #在将data中的元素遍历、计算后放入新数组
return result def square(x):
"""计算一个数的平方并返回"""
return x*x def cube(x):
"""计算一个数的三次方并返回"""
return x*x*x def factorial(x):
"""计算一个数的阶乘并返回"""
result = 1
for index in range(2,x+1):
result *= index
return result data = [2,3,4,9,8,7]
print("原数据:", data)
#在传入不同的函数对象给funcs函数后会得到不同的结果
print("计算列表元素的平方:")
print(funcs(data,square))
print("计算列表元素的三次方:")
print(funcs(data,cube))
print("计算列表元素的阶乘:")
print(funcs(data,factorial))
print("funcs函数的类型:")
print(type(funcs))

在运行程序后,控制台打印如下:

从上面的例子中,可以看出函数可以作为参数,在调用函数时动态传入,这样即使数据是相同的,但实际调用的函数不同。在第34行,我们打印了funcs函数的类型,是function类型即function对象。

三、将函数作为另一个函数的返回值

将上面的代码稍作改变即可:

 #coding=utf-8
def get_funcs(func_name): def square(x):
"""计算一个数的平方并返回"""
return x*x def cube(x):
"""计算一个数的三次方并返回"""
return x*x*x def factorial(x):
"""计算一个数的阶乘并返回"""
result = 1
for index in range(2,x+1):
result *= index
return result
"""根据传入func_name返回局部函数"""
if func_name == "square":
return square
elif func_name == "cube":
return cube
else:
return factorial #在传入不同的参数名给funcs函数后会得到不同的函数对象
print("计算数字4的平方:")
my_funct = get_funcs("square")
print(my_funct(4))
print("计算数字5的三次方:")
my_funct = get_funcs("cube")
print(my_funct(5))
print("计算数字6的阶乘:")
my_funct = get_funcs("other_function")
print(my_funct(6))

运行程序,控制台打印如下:

解释:在定义了返回函数的函数get_funcs() 后,在调用该函数时直接传入你需要调用的函数名即可返回你需要的函数,用变量接收即可使用,如上面的代码。

  

最新文章

  1. Apache Sqoop - Overview——Sqoop 概述
  2. 千万别把WIFI玩坏了!关于WIFI的新鲜玩法和商业模式探讨
  3. i7 4790 z97-ar ssd 固态硬盘 装机的一些经历
  4. Linux网络编程系列-TCP传输控制
  5. expect结合ssh遍历线上机器
  6. 一个用php写的人民币数字转人民币大写的函数
  7. 【读书笔记】读《JavaScript模式》 - JavaScript函数常用模式
  8. C#事务相关
  9. stdlib 头文件
  10. 网络统计学与web前端开发基础技术
  11. mysql导出csv/excel文件的几种方法,mysql的load导入csv数据
  12. Linux下用来获取各种系统信息的C++类
  13. 13_FCITX输入法安装及问题排查解决
  14. CKfinder中文乱码的解决.
  15. codeforces 6A. Triangle
  16. 标签(改变样式style)
  17. MySQL系列(一)--基础知识大总结
  18. Openstack_O版(otaka)部署_准备环境和依赖软件
  19. EntityFramework安装失败
  20. python if,for,while

热门文章

  1. Linux内核调试的方式以及工具集锦【转】
  2. Ubuntu 18.04上安装 phpMyAdmin
  3. Highways POJ - 1751
  4. windows10下Bad owner or permissions on .ssh/config的解决办法
  5. luoguP4393Sequence
  6. Android开发环境搭建(个人环境非通用)
  7. hdu1247-Hat’s Words-(字典树)
  8. 知识点总结 REACT
  9. 【灵魂拷问】你为什么要来学习Node.js呢?
  10. [LeetCode] 98. Validate Binary Search Tree 验证二叉搜索树