Discuss / Python / 恕我愚钝,我个人的一点浅薄理解

恕我愚钝,我个人的一点浅薄理解

Topic source

居士先生

#1 Created at ... [Delete] [Delete and Lock User]

#可能我比较愚钝,这一节感觉不太能理解。不知道有没有像我一样不理解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'''

#结论总结:通过列表将形成一个函数列表,并赋值给不同的变量,如果直接输出变量返回的是一个函数,所以叫《返回函数》。如果变量名+()则变成了一个函数,返回的是则是函数里的具体返回值。


  • 1

Reply