questions about functions inside a function

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • fdu.xiaojf@gmail.com

    questions about functions inside a function

    I want to create a list of function.

    Here is my code:
    In [9]: a = []

    In [10]: for i in range(4):
    ....: b = lambda : i**2
    ....: a.append(b)
    ....:
    ....:

    In [11]: for f in a:
    ....: f()
    ....:
    ....:
    9
    9
    9
    9

    What I want is, the value of i should be bounded to the anonymous function.
    And the output should like this:

    for f in a:
    print f()
    0
    1
    4
    9

    How to achieve this?

    Thanks a lot!


  • Duncan Booth

    #2
    Re: questions about functions inside a function

    "fdu.xiaojf@gma il.com" <fdu.xiaojf@gma il.comwrote:
    What I want is, the value of i should be bounded to the anonymous
    function. And the output should like this:
    >
    for f in a:
    print f()
    0
    1
    4
    9
    >
    How to achieve this?
    Use default arguments when defining your function: default arguments are
    evaluated when the function is defined, bound arguments get the current
    value of the variable at the point when it is referenced during the call.

    Also, since you give your function a name anyway ('b') you might as well
    use a named function as being clearer than using lambda:
    >>a = []
    >>for i in range(4):
    def b(i=i):
    return i**2
    a.append(b)

    >>for f in a:
    f()


    0
    1
    4
    9
    >>>

    Comment

    • Bruno Desthuilliers

      #3
      Re: questions about functions inside a function

      fdu.xiaojf@gmai l.com a écrit :
      I want to create a list of function.
      >
      Here is my code:
      In [9]: a = []
      >
      In [10]: for i in range(4):
      ....: b = lambda : i**2
      ....: a.append(b)
      ....:
      ....:
      >
      In [11]: for f in a:
      ....: f()
      ....:
      ....:
      9
      9
      9
      9
      >
      What I want is, the value of i should be bounded to the anonymous
      function. And the output should like this:
      >
      for f in a:
      print f()
      0
      1
      4
      9
      >
      How to achieve this?
      >
      >>a = [lambda i=i:i**2 for i in range(4)]
      >>for f in a:
      .... print f()
      ....
      0
      1
      4
      9
      >>>
      HTH

      Comment

      • attn.steven.kuo@gmail.com

        #4
        Re: questions about functions inside a function

        On Jul 16, 4:49 am, "fdu.xia...@gma il.com" <fdu.xia...@gma il.com>
        wrote:

        (snipped)
        >
        What I want is, the value of i should be bounded to the anonymous function.
        And the output should like this:
        >
        for f in a:
        print f()
        0
        1
        4
        9
        >
        How to achieve this?
        >
        Thanks a lot!


        The functools module, in Python 2.5 allows:
        >>import functools
        >>square = lambda i: i ** 2
        >>anon = [functools.parti al(square, i) for i in range(4)]
        >>for f in anon:
        .... print f()
        ....

        --
        Hope this helps,
        Steven

        Comment

        • Jeremy Sanders

          #5
          Re: questions about functions inside a function

          fdu.xiaojf@gmai l.com wrote:
          What I want is, the value of i should be bounded to the anonymous
          function. And the output should like this:
          ....
          How to achieve this?
          This doesn't answer your question (others have), but another (perhaps
          clearer) way to do such things is something like

          class MyFunc(object):
          """A function object."""
          def __init__(self, val):
          self.val = val

          def __call__(self):
          """Return value squared"""
          return self.val**2

          a = []
          for i in range(4):
          a.append(MyFunc (i))

          for f in a:
          f()


          Jeremy

          --
          Jeremy Sanders

          Comment

          • Bruno Desthuilliers

            #6
            Re: questions about functions inside a function

            Jeremy Sanders a écrit :
            fdu.xiaojf@gmai l.com wrote:
            >
            >
            >>What I want is, the value of i should be bounded to the anonymous
            >>function. And the output should like this:
            >
            ...
            >
            >>How to achieve this?
            >
            >
            This doesn't answer your question (others have), but another (perhaps
            clearer) way to do such things is something like
            >
            class MyFunc(object):
            """A function object."""
            def __init__(self, val):
            self.val = val
            >
            def __call__(self):
            """Return value squared"""
            return self.val**2
            >
            a = []
            for i in range(4):
            a.append(MyFunc (i))
            >
            for f in a:
            f()
            >
            I wouldn't say it's "clearer" - at least in this concrete use case. And
            it takes more than just defining the __call__ method to have a fully
            function-like object (hint: try using a MyFunc instance as a method).

            Comment

            Working...