具有两个内部函数python的闭包

时间:2018-03-03 14:19:39

标签: python closures

我正在尝试用两个内部函数编写一个闭包,但是我收到了以下错误

def factory(n=0):
#n=0

    def current():
       return n
    return current
    def counter():
        n=n+1
        return n
    return counter


  f_current,f_counter = int(input())

  print(f_counter())
  print(f_current())

我有以下错误:

   >>4
   Traceback (most recent call last):
   File "C:/Users/lokesh/Desktop/python/closure3.py", 
    line 13, in <module>
   f_current,f_counter = int(input())
   TypeError: 'int' object is not iterable

我的要求是在输入4后,它应显示:

  4
  5

我是python的新手,有人可以帮助我吗...提前感谢

4 个答案:

答案 0 :(得分:1)

看起来更像你想要的东西:

def factory(n=0):

    def current():
        return n

    def counter():
        nonlocal n
        n += 1
        return n

    return current, counter

f_current, f_counter = factory()

print(f_current())
print(f_counter())
print(f_current())
print(f_counter())

输出:

0
1
1
2

4作为输入:

f_current, f_counter = factory(4)
print(f_current())
print(f_counter())

4
5

factory()返回两个内部函数。您需要使用nonlocal来增加封闭函数的n。如果没有nonlocal,您将无法修改n,但会获得:

UnboundLocalError: local variable 'n' referenced before assignment

因为n只是一个局部变量。 nonlocal n使得n来自内部函数内部可修改的封闭函数。在n中评估current很好,因为Python的范围规则允许对外部作用域的变量进行读取访问,这里是从封闭函数的范围。

答案 1 :(得分:0)

嗨,迈克,我认为非本地没有任何意义,我给 适用于我的情况的解决方案。

def factory(n):

    def current():

        return n

    def counter():

        n=int(current())
        n=n+1
        return n

    return current, counter
n=0
f_current, f_counter = factory((input()))

print(f_current())
print(f_counter())

答案 2 :(得分:0)

def factory(n=0):

    def current():
        return n

    def counter():
        return n+1

    return current, counter

f_current, f_counter = factory(int(input()))

print(f_current())
print(f_counter())

答案 3 :(得分:0)

Mike的Nonlocal用法非常好,但是我们也可以通过Counter内部函数内部的新变量m从封闭范围访问n的变量值,并在递增后返回它。这样,不需要Nonlocal。

        def factory(n=0):
            def current():
                return n

            def counter():
                 m=n
                 m=m+1
                 return m

            return current,counter

         f_current,f_counter=factory(int(input()))

         print(f_current())
         print(f_counter())

`