zoukankan      html  css  js  c++  java
  • 返回函数

    #返回函数
    def lazy_sum(*args):
        def sum():
            sum = 0
            for i in args:
                sum += i
            return sum
        return sum
    #当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
    t = lazy_sum(1, 4, 5, 6)
    #调用函数f时,才真正计算求和的结果:
    print(t())
    
    #注意:
    f1 = lazy_sum(1, 4, 5, 6)
    f2 = lazy_sum(1, 4, 5, 6)
    print(f1 == f2) #注意这个输出结果为False,所以说这是两个函数,调用结果互不影响
    
    def count():
        L = []
        for i in range(1, 4):
            def f():
                return i*i
            L.append(f)
        return L
    f1, f2, f3 = count()
    print(f1()) #9
    print(f2()) #9
    print(f3()) #9
    #注意三个函数的输出结果都为9,而不是1, 4, 9
    #我们分析一下原因,三个函数都引用了变量i,但是函数并没有立即执行,当我们调用的时候函数才开始执行,
    #但是这个时候里面用到的变量已经改变了,所以输出结果是根据最后的变量i来计算的
    
    #!!!因此我们一定要注意,当一个函数的返回值是另一个函数的时候,传入的参数不能使循环变量或者后续执行过程中会变化的量
    #如果一定要使用循环变量可以重新定义一个函数,用该函数的参数绑定此时循环变量的数值,这样无论循环变量如何改变,
    #已经绑定到函数参数的值并不会改变
    
    def count():
        def f(j):
            def f2():
                return j * j
            return f2
        L = []
        for i in range(1, 4):
            L.append(f(i))
        return L
    t = count()
    t1, t2, t3 = count()
    print(t1()) #1
    print(t2()) #4
    print(t3()) #9
    
    #匿名函数
    t = list(map(lambda x:x*x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
    print(t)
    
    def build(x, y):
        return lambda x, y: x*10+y
    t = build(5, 6)
    print(t)
    print(t(6, 7)) #这一行输出结果为67
  • 相关阅读:
    ligerui做分页显示数据
    js判断input为空校验
    js操作table倒叙显示序号的问题
    js获取div中的文本框数据
    js数组到后台转 list数组
    table 操作
    js操作table
    父页面调用子页面的方法
    laravel修改密码及与原密码Hash::check比较 阿星小栈
    php获取中文字符拼音首字母 阿星小栈
  • 原文地址:https://www.cnblogs.com/rain-1/p/5556928.html
Copyright © 2011-2022 走看看