小白教程

 找回密码
 立即注册
查看: 5552|回复: 0

小白教程:Python 函数的高级用法

[复制链接]

176

主题

185

帖子

663

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
663
发表于 2021-4-10 06:46:23 | 显示全部楼层 |阅读模式
简述
在 Python 中,函数是一个一等公民(first-class citizen)。这意味着,函数与任何其他对象(例如:整数、字符串、列表)一致,既可以动态地创建或销毁,也可以传递给其他函数,或作为值进行返回。

将函数绑定到不同的名称
Python 中的一切皆对象,我们定义的名称仅仅是与这些对象绑定的标识符。函数也不例外,它们也是对象,同样可以被绑定到不同的名称。
  1. >>> def greet(msg):
  2. ...     print(msg)
  3. ...
  4. >>> greet  # 输出 greet 的内存地址
  5. <function greet at 0x7f38327abae8>
  6. >>>
  7. >>> f = greet  # 将 greet 的内存地址当做值赋值给变量 f
  8. >>> f  # 输出 f,其实就是输出 greet 的内存地址
  9. <function greet at 0x7f38327abae8>
  10. >>>
  11. >>> f('Hello')  # 等同于 greet('Hello')
  12. Hello
复制代码
可以看出,greet 和 f 指的是同一个函数对象。

注意: 函数名在不带小括号(())时,表示的是函数的内存地址。

将函数作为参数
在 Python 中,将其他函数作为参数的函数称为高阶函数。如果使用过 map()、filter() 和 reduce() 之类的函数,那么肯定知道这一点。

下面,我们定义三个函数:add() - 求和,subtract() - 求差,operate() - 作为高阶函数。
  1. >>> def add(x, y):  # 求和
  2. ...     return x + y
  3. ...
  4. >>>
  5. >>> def subtract(x, y):  # 求差
  6. ...     return x - y
  7. ...
  8. >>>
  9. >>> def operate(func, x, y):  # 高阶函数 - 将函数作为参数
  10. ...     result = func(x, y)
  11. ...     return result
  12. ...
  13. >>>
复制代码
函数调用很简单:
  1. >>> operate(add, 5, 3)
  2. 8
  3. >>>
  4. >>> operate(subtract, 5, 3)
  5. 2
复制代码
这样,就可以将函数对象 add 和 subtract 当做 operate() 的参数进行传递了,使用起来非常方便。

将函数作为返回值
函数是一个对象,所以可以作为某个函数的返回值。

这里涉及到一个概念 - Python 嵌套函数

来看一个简单的求和函数,对数字 1- n 相加:
  1. >>> def outer():  # 封闭函数
  2. ...     def inner(n):  # 嵌套函数
  3. ...         sum = 0
  4. ...         for i in range(1, n):
  5. ...             sum += i
  6. ...         return sum
  7. ...     return inner  # 返回一个函数对象
  8. ...
  9. >>>
复制代码
当每次调用封闭函数时,都会创建一个嵌套函数的新实例:
  1. >>> f = outer()
  2. >>> f
  3. <function outer.<locals>.inner at 0x7f38327ab9d8>
  4. >>>
  5. >>> f2 = outer()
  6. >>> f2
  7. <function outer.<locals>.inner at 0x7f38327ab950>
复制代码

显然,f 和 f2 不同,这是因为 inner() 是在执行 outer() 期间被定义的,所以第二次的创建对第一次没有影响。

当调用 f(n) 时,才会真正地计算求和结果:

  1. >>> f(5)
  2. 10
  3. >>>
  4. >>> f2(10)
  5. 45
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|小白教程 ( 粤ICP备20019910号 )

GMT+8, 2024-11-24 15:56 , Processed in 0.024536 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表