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

hse*_*kol 2 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())
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

   >>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
Run Code Online (Sandbox Code Playgroud)

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

  4
  5
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ler 5

这看起来更像你想要的:

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())
Run Code Online (Sandbox Code Playgroud)

输出:

0
1
1
2
Run Code Online (Sandbox Code Playgroud)

作为4输入:

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

4
5
Run Code Online (Sandbox Code Playgroud)

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

UnboundLocalError: local variable 'n' referenced before assignment
Run Code Online (Sandbox Code Playgroud)

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

  • “非本地”名称是周围函数的本地名称。需要该声明来重新绑定周围函数作用域中的名称。`current` 函数不需要声明,因为它只读取 `n` 而不会赋值给 `n`。(这个关键字可能看起来很奇怪,但这是经过几个月的争论后的选择,延迟了添加选项来执行其功能。) (2认同)