python运行一次函数中的代码

时间:2015-01-20 01:14:56

标签: python scope

我试图在Python中创建一个变量,但是在函数内部。我正在使用的是这样的:

def func1():
   def set1():
      x=5
      y=10
   ##lots of code
   x+=1
   y+=1

def func2():
   while True:
      func1()
set1()
func2()

我想知道是否有更好的方法来做到这一点?

5 个答案:

答案 0 :(得分:3)

可能最好的方法是将x和y的定义放入函数2,并将它们作为函数1的输入和输出。

def func1(x, y):
    ##lots of code
    x+=1
    y+=1
    return x, y

def func2():
    x = 5
    y = 10
    while True:
        x, y = func1(x, y)

其他替代方法包括全局定义x和y并使用global xglobal y或使用可变的默认参数来使函数保持状态,但通常最好不要求助于这些选项t必须。

答案 1 :(得分:1)

x = None
y = None

def set1():
    global x, y
    x=5
    y=10

def func1():
    global x, y
    x+=1
    y+=1

def func2():
    while True:
        func1()
set1()
func2()

答案 2 :(得分:1)

一些代码审查和建议:

def func1():
   def set1():
      x=5
      y=10
   ##lots of code
   x+=1
   y+=1

def func2():
   while True:
      func1()

set1() # This won't work because set1 is in the local scope of func1
       # and hidden from the global scope
func2()

看起来您希望每次调用函数时都会计算该函数。我可以建议这样的事情吗?:

x=5
y=10

def func1():
    global x, y
    x+=1
    y+=1
    print x, y

def func2():
    while True:
        func1()

func2()

比使用全局变量更好,将它们粘贴在嵌套范围内的可变对象中:

Counts = dict(x=5, y=10)

def func1():
    Counts['x'] += 1
    Counts['y'] += 1
    print Counts['x'], Counts['y']

def func2():
    while True:
        func1()

func2()

答案 3 :(得分:0)

**只是看到编辑上升而不是修改代码以适应**

很难从你的问题中判断出你的实际用例是什么,但我认为Python生成器可能是适合你的解决方案。

def generator(x, y):
    yield x,y
    x += 1
    y += 1

然后使用:

if __name__ == "__main__":
    my_gen = generator(10,5)

    for x,y in my_gen:
        print x,y
        if x+y > 666:
            break

对于刚接触Python的人来说,这可能稍微高级一些。您可以在此处阅读生成器:http://anandology.com/python-practice-book/iterators.html

答案 4 :(得分:0)

首先,set1功能似乎没有做太多,所以你可以把它带走。

如果你想要保持呼叫次数的计数或者在呼叫之间保持状态,最好的,更可读的方法是将它保存在一个对象中:

class State(object):
    def __init__(self):
        self._call_count = 0
        self.x = 5

    def func1(self):
        self._call_count += 1
        self.x =  ... Whatever

def func2():
    state = State()
    while True:
        state.func1()