为了账号安全,请及时绑定邮箱和手机立即绑定

学习到了全局局部变量

sum=1

def calc_prod(lst):

    def _prod():

        global sum

        for i in lst:

            sum=sum*i

        return sum

    return _prod

f = calc_prod([1, 2, 3, 4])

print f()

代码如上,我的思路应该很清晰了,再内部函数中,对传进来的lst做遍历,返回 一个列表的乘积。

f = calc_prod([1, 2, 3, 4])调用了函数calc_prod,得到一个返回函数_prod,相当于变量名f指向了_prod函数名的地址,可以理解为“f=_prod”。所以最后print f()相当于是print _prod(),之所以不需要写成print f([1, 2, 3, 4])我想是应为我们已经调用了函数calc_prod并且传了参数,所以_prod函数里面操作的参数就是lst ,这里我有一个疑问“对于calc_prod来说,lst参数是一个局部的参数;但是对于_prod来说,lst参数是一个全局的参数”。希望有好心人帮我解答?

然后就是关于 global sum这段代码,我查阅资料(https://blog.csdn.net/my2010sam/article/details/17735159),发现如果不这么写,那么sum就会变成 _prod函数的变量(内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量)即对于全局来说,sum变成一个局部变量,导致最后print f()时,“外层”因为无法调用一个局部变量(内层的变量),导致报错。所以在函数内部,我们用global sum这段代码来申明sum是一个全局变量

好开心又学到了一些自己不懂的知识,写了这么多,也不知道对不对,欢迎大伙指出我说不对的地方

有些懊恼因为当我需要对一个list的内部元素逐个操作的时候没有第一时间想到reduce函数?

正在回答

2 回答

新学不懂,完后我是这么写的,提交后提示成功?

def calc_prod(lst):

    def prod():

        sum=1

        for i in lst:

            sum=sum*i

        return sum

    return prod

f = calc_prod([1, 2, 3, 4])

print f()


0 回复 有任何疑惑可以回复我~
def calc_prod(lst):
    def lazy_prod():
        def f(x, y):
            return x * y
        return reduce(f, lst, 1)
    return lazy_prod
f = calc_prod([1, 2, 3, 4])
print f()


0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

学习到了全局局部变量

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信