美文网首页程序员《做与学系列》
疯狂的Python-09(没脑子的函数)

疯狂的Python-09(没脑子的函数)

作者: 景行1023 | 来源:发表于2018-09-08 11:59 被阅读2次

    一些有趣的鲜为人知的Python特性集合

    无论你是Python新手还是Python老手,我相信,这个系列的文章都会让你获益良多!

    阅读此系列任何文章前请务必观看:疯狂的Python-目录大纲


    ▶ 没脑子的函数

    funcs = []
    results = []
    for x in range(7):
        def some_func():
            return x
        funcs.append(some_func)
        results.append(some_func())
    
    funcs_results = [func() for func in funcs]
    

    Output:

    >>> results
    [0, 1, 2, 3, 4, 5, 6]
    >>> funcs_results
    [6, 6, 6, 6, 6, 6, 6]
    

    虽然我们每次把some_func函数加入到funcs列表里的时候x都不一样,但是funcs列表里的所有函数都返回了6.

    //下面这段代码也是这样

    >>> powers_of_x = [lambda x: x**i for i in range(10)]
    >>> [f(2) for f in powers_of_x]
    [512, 512, 512, 512, 512, 512, 512, 512, 512, 512]
    

    :bulb: 解释

    • 当我们在一个循环中定义一个函数,并且在函数体中用了循环中的变量时,这个函数只会绑定这个变量本身,并不会绑定当前变量循环到的值。所以最终所有在循环中定义的函数都会使用循环变量最后的值做计算。

    • 如果你想实现心中想的那种效果,可以把循环变量当做一个参数传递进函数体。为什么这样可以呢?因为这样在函数作用域内会重新定义一个变量,不是循环里面的那个变量了。

      funcs = []
      for x in range(7):
          def some_func(x=x):
              return x
          funcs.append(some_func)
      

      Output:

      >>> funcs_results = [func() for func in funcs]
      >>> funcs_results
      [0, 1, 2, 3, 4, 5, 6]
      

    相关文章

      网友评论

        本文标题:疯狂的Python-09(没脑子的函数)

        本文链接:https://www.haomeiwen.com/subject/jzogwftx.html