Python声明变量只在我第一次请求一个函数

Python declare variables only the first time I call a function

本问题已经有最佳答案,请猛点这里访问。

我在python中有一个函数,我只想在第一次调用这个函数时声明两个变量,然后更改它们的值,如下所示:

1
2
3
4
5
6
7
def function():
  x=0
  z=2
  if(x>z):
    other_function()
  else:
    x+=1

这样,每次我调用function()时,x变为0,z变为2。

我试图使它们在函数()之外成为全局的,但它给了我错误:

UnboundLocalError: local variable 'x' referenced before assignment

我如何在第一次调用函数()时声明这些值?


我不同意其他的答案,那只是试着直接回答你的问题。

状态(变量)与使用该状态的函数/函数的组合。这就是课堂的目的。

1
2
3
4
5
6
7
8
9
10
11
class myclass:
    def __init__(self):
        self.x = 0
        self.z = 2

    def myfunction(self):
        if self.x > self.z:
            other_function()  # Possibly self.other_function()
                              # if that one also uses x or z
        else:
            self.x += 1

用作:

1
2
3
instance = myclass()
instance.myfunction()
instance.myfunction()  # Etc


欢迎结束

你应该这样写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <wyn>
def f(x):
    def g(y):
        return x + y
    return g
</p>

<p>
def h(x):
    return lambda y: x + y
</p>

<p>
a = f(1)
b = h(1)
f(1)(5)
h(1)(5)

代码>


您可以在python中使用词汇范围和全局:

1
2
3
4
5
6
7
8
9
x = 0
z = 2
def foo():
    global x
    if (x > z):
        bar()
    else:
        x += 1
foo()

为了提高可读性,我会把它们放在字典里:

1
2
3
4
5
6
_VALS = {'x': 0, 'z': 2}
def function():
  if _VALS['x'] > _VALS['z']:
    other_function()
  else:
     _VALS['x'] += 1

您可以谨慎地滥用强大的可变默认值。

1
2
3
4
5
6
7
8
9
10
def func(vals = {'x': 0, 'z': 2}):
    print vals['x']
    vals['x'] += 1

func()
>> 0
func()
>> 1
func()
>> 2

尽管我想正确的方法是使用装饰:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def default_value_decorator(func):
    def inner(*args, **kwargs):
        returned_val = func(*args, **kwargs)
        inner.x += 1
        return returned_val
    inner.x = 0
    inner.z = 2
    return inner

@default_value_decorator
def func():
    print func.x

func()
>> 0
func()
>> 1

以及更可重用的版本,其中可以将xz的起始值传递给装饰器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def default_value_decorator(x, z):
    def a(func):
        def inner(*args, **kwargs):
            returned_val = func(*args, **kwargs)
            inner.x += 1
            return returned_val
        inner.x = x
        inner.z = z
        return inner
    return a

@default_value_decorator(0, 2)
def func():
    print func.x

func()
>> 0
func()
>> 1

可以使用默认函数参数

即)

1
2
3
4
5
def function(x = None, z = None):
   if x is None:
        x=0
   if z is None:
        z=2

如果你通过了EDOCX1[1]的值


如果您想从函数之外的某个地方获取x和z,那么必须将它们作为参数传递给function。例如:

1
2
3
4
5
6
7
def function(a,b):
    if(a>b):
        other_function()
    else:
        a+=1

    return a, b

然后可以用

1
x, z = function(0,2)