#f5,f2,f3,f4=count() 执行这一句将报 cannot unpack non-iterable int object 错误
f5=count()
f2=count()
print('f5=',f5)
print('f2()=',f2())
print('count()=',count())
#结果如下:
'''f5= <function count.<locals>.f at 0x000001F3D8C29840>#返回一个函数
f2()= 16#返回函数的具体数据
count()= <function count.<locals>.f at 0x000001F3D8C29950>#跟f5一样,返回了一个函数,但由于是第二次调用,后面的0x是不同的,表示是不同的函数。'''
#如果将后面这个fs也改成0,fs是一'int'返回的也是最后的一个数值:
def count():
def f(j):
def g():
return j*j
return g
fs = 0
for i in range(1, 4):
fs=f(i) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
m1=count()
m2=count()
print('m1()=',m1())
print('m2()=',m2())
#结果如下:
m1()= 9
m2()= 9
#为了能更好的理解,我尝试在原函数基础上输出每次循环的fs 看会发生什么。
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))
print(fs)
return fs
h1,h2,h3=count()
#g1,g2,g3,g4=count() 执行这一句也将保存,相当于4个变量=3个列表元素。
print('h1=',h1)
print('h2=',h2)
print('h3=',h3)
print('h1()=',h1())
print('h2()=',h2())
print('h3()=',h3())
#结果如下:
'''[<function count.<locals>.f.<locals>.g at 0x0000017747339A60>] #第一次循环输出fs,fs为一个函数,下面两个以此类推,注意函数的十六进制的编码
[<function count.<locals>.f.<locals>.g at 0x0000017747339A60>, <function count.<locals>.f.<locals>.g at 0x0000017747339AE8>]
[<function count.<locals>.f.<locals>.g at 0x0000017747339A60>, <function count.<locals>.f.<locals>.g at 0x0000017747339AE8>, <function count.<locals>.f.<locals>.g at 0x0000017747339B70>]
居士先生
#可能我比较愚钝,这一节感觉不太能理解。不知道有没有像我一样不理解count()函数中,为什么返回fs 必须是列表的。我尝试做了如下操作:
def count():
fs=0
for i in range(1,5):
def f():
return i*i
fs=f
return fs
#f5,f2,f3,f4=count() 执行这一句将报 cannot unpack non-iterable int object 错误
f5=count()
f2=count()
print('f5=',f5)
print('f2()=',f2())
print('count()=',count())
#结果如下:
'''f5= <function count.<locals>.f at 0x000001F3D8C29840>#返回一个函数
f2()= 16#返回函数的具体数据
count()= <function count.<locals>.f at 0x000001F3D8C29950>#跟f5一样,返回了一个函数,但由于是第二次调用,后面的0x是不同的,表示是不同的函数。'''
#如果将后面这个fs也改成0,fs是一'int'返回的也是最后的一个数值:
def count():
def f(j):
def g():
return j*j
return g
fs = 0
for i in range(1, 4):
fs=f(i) # f(i)立刻被执行,因此i的当前值被传入f()
return fs
m1=count()
m2=count()
print('m1()=',m1())
print('m2()=',m2())
#结果如下:
m1()= 9
m2()= 9
#为了能更好的理解,我尝试在原函数基础上输出每次循环的fs 看会发生什么。
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i))
print(fs)
return fs
h1,h2,h3=count()
#g1,g2,g3,g4=count() 执行这一句也将保存,相当于4个变量=3个列表元素。
print('h1=',h1)
print('h2=',h2)
print('h3=',h3)
print('h1()=',h1())
print('h2()=',h2())
print('h3()=',h3())
#结果如下:
'''[<function count.<locals>.f.<locals>.g at 0x0000017747339A60>] #第一次循环输出fs,fs为一个函数,下面两个以此类推,注意函数的十六进制的编码
[<function count.<locals>.f.<locals>.g at 0x0000017747339A60>, <function count.<locals>.f.<locals>.g at 0x0000017747339AE8>]
[<function count.<locals>.f.<locals>.g at 0x0000017747339A60>, <function count.<locals>.f.<locals>.g at 0x0000017747339AE8>, <function count.<locals>.f.<locals>.g at 0x0000017747339B70>]
#h1,h2,h3=count()相当 h1,h2,h3=[f(i=1),f(i=2),f(i=3)]
h1= <function count.<locals>.f.<locals>.g at 0x0000017747339A60>
h2= <function count.<locals>.f.<locals>.g at 0x0000017747339AE8>
h3= <function count.<locals>.f.<locals>.g at 0x0000017747339B70>
h1()= 1
h2()= 4
h3()= 9'''
#结论总结:通过列表将形成一个函数列表,并赋值给不同的变量,如果直接输出变量返回的是一个函数,所以叫《返回函数》。如果变量名+()则变成了一个函数,返回的是则是函数里的具体返回值。