一篇文章带你搞定Python返回函数

开发 后端
返回函数,简单的说就是返回值是一个函数。返回的是函数,调用返回的函数的时候才会返回结果。

 [[385647]]

一、什么是返回函数?

返回函数,简单的说就是返回值是一个函数。

返回的是函数,调用返回的函数的时候才会返回结果。

二、闭包 (以返回函数的形式实现)

相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”。

  1. def returnre(a, b): 
  2.     def re(): 
  3.         return a + b 
  4.  
  5.     return re 
  6.  
  7. test01 = returnre(1, 2) 
  8. test02 = returnre(1, 2) 
  9. print(test01 == test02)  # 每次调用都会返回新生成的函数 

比如上面例子的re函数闭包的特性,嵌套定义在非全局作用域里面的函数,能够记住它在被定义的时候它所处的封闭命名空间。

来看一个例子:

  1. def closur(a): 
  2.     def myprint(): 
  3.         print(a) 
  4.  
  5.     return myprint 
  6.  
  7. test = closur(1) 
  8. test() 

代码解析:

变量a是函数closur的一个本地变量,只应该存在于函数运行时,但正因为闭包的特性,将a的值封装进了返回函数。

  1. def closuretest02(*args): 
  2.     f = [] 
  3.     for i in args: 
  4.         def test(): 
  5.             return i**2 
  6.         f.append(test) 
  7.     return f 
  8. test = closuretest02(1,2,3,4) 
  9. for i in test: 
  10.     print(i()) 

返回闭包时牢记的一点就是:

返回函数不要引用任何循环变量,或者后续会发生变化的变量。

如果一定要引用循环变量怎么办?

方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:

  1. def count(): 
  2.     def f(j): 
  3.         def g(): 
  4.             return j*j 
  5.         return g 
  6.     fs = [] 
  7.     for i in range(1, 4): 
  8.         fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() 
  9.     return fs 

再看看结果:

  1. f1, f2, f3 = count() 
  2. print(f1()) 
  3.  
  4. print(f2()) 
  5. print(f3()) 

注:

缺点是代码较长,可利用lambda函数缩短代码。

一个函数可以返回一个计算结果,也可以返回一个函数。返回一个函数时,牢记该函数并未执行,返回函数中不要引用任何可能会变化的变量。

三、拓展

nonlocal

nonlocal适用于嵌套函数中内部函数修改外部变量的值。

  1. def outside(): 
  2.     a = 1 
  3.     print('outside' + str(id(a))) 
  4.     def inside(): 
  5.         nonlocal a 
  6.         print('inside ' + str(id(a))) 
  7.     inside() 
  8. outside() 

因为使用nonlocal后,返回了闭包中有父函数的变量,所以父函数那里不会被回收。

四、总结

本文基于Python基础,介绍了返回函数。常见的返回函数的应用。函数作为返回值,闭包在实际应用中需要的点,遇到的难点,提供有效的解决方案。使用Python语言,能够更好的理解。

欢迎大家积极尝试,有时候看到别人实现起来很简单,但是到自己动手实现的时候,总会有各种各样的问题,切勿眼高手低,勤动手,才可以理解的更加深刻。

代码很简单,希望对你学习有帮助。

本文转载自微信公众号「Go语言进阶学习」,可以通过以下二维码关注。转载本文请联系Go语言进阶学习公众号。

 

责任编辑:武晓燕 来源: Go语言进阶学习
相关推荐

2021-05-15 10:16:14

Python匿名函数

2024-04-17 13:21:02

Python匿名函数

2020-02-28 11:29:00

ElasticSear概念类比

2021-11-17 10:11:08

PythonLogging模块

2021-11-10 09:19:41

PythonShutil模块

2022-05-28 15:59:55

PythonPandas数据可视化

2021-04-24 10:19:41

Python函数指向

2021-03-24 10:00:32

Python递归函数Python基础

2021-01-29 18:41:16

JavaScript函数语法

2022-03-30 10:51:40

JavaScript性能调优

2021-11-13 10:11:45

Pythonurllib库Python基础

2023-06-15 10:11:08

JavaScript函数表达式

2021-05-15 09:18:04

Python进程

2021-03-15 08:38:42

StringBuffeJava基础Java开发

2021-06-30 00:20:12

Hangfire.NET平台

2022-02-21 09:44:45

Git开源分布式

2023-05-12 08:19:12

Netty程序框架

2021-05-21 09:01:29

JavaScript 前端函数闭包

2021-05-31 08:59:57

Java数据库访问JDBC

2021-01-13 08:40:04

Go语言文件操作
点赞
收藏

51CTO技术栈公众号