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

枫铃3年前 (2021-09-30)Python241

一、什么是返回函数?

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

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

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

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

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

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

来看一个例子:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def closur(a): 
	def myprint(): 
		print(a) 
     
	return myprint 
     
test = closur(1) 
test() 

在这里插入图片描述
代码解析:

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

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

在这里插入图片描述
返回闭包时牢记的一点就是:

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

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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def count(): 
    def f(j): 
        def g(): 
            return j*j 
        return g 
    fs = [] 
    for i in range(1, 4): 
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() 
    return fs 

再看看结果:

f1, f2, f3 = count() 
print(f1()) 
 
print(f2()) 
print(f3()) 

在这里插入图片描述
注:

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

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

三、拓展

nonlocal

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

def outside(): 
    a = 1 
    print('outside' + str(id(a))) 
    def inside(): 
        nonlocal a 
        print('inside ' + str(id(a))) 
    inside() 
outside() 

因为使用nonlocal后,返回了闭包中有父函数的变量,所以父函数那里不会被回收。
在这里插入图片描述
四、总结

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

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

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

相关文章

python中将函数赋值给变量时需要注意的一些问题

变量赋值是我们在日常开发中经常会遇到的一个问题,本文主要给大家介绍的是关于python将函数赋值给变量时需要注意的一些问题,分享出...

Python教程:import 、from import 及from import *

一、模块: Python(moudle)------Python文件,以.py 结尾 二、impo...

python字符串/列表/字典互相转换

字符串与列表 字符串转列表 1.整体转换 str1 = 'hello world' print(str1.split('...

python isinstance函数

isinstance是Python的一个内建函数 语法: isinstance(object,classinfo) 如果参数object...

Python教程:文件路径/目录获取教程

一、获取文件路径实现...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。