【问题标题】:How to update return value from function when I am not using any global variable? [duplicate]当我不使用任何全局变量时如何更新函数的返回值? [复制]
【发布时间】:2021-01-17 22:14:52
【问题描述】:
def dinner_completed():
        counter=0
        if counter==0:
            k=False
        if counter==1:
            k=True
        counter+=1
        print('counter',counter)
        return k
    
while not dinner_completed():
        print('1')

每次我在 while 循环中检查函数时,计数器都会被初始化为 0 。我不想使用全局变量,我的函数必须只返回一次 False,其余时间返回 True。

【问题讨论】:

  • 了解为什么您不想要全局变量会有所帮助。用例似乎与它完全匹配。你想避免全局变量的什么行为?您是否只想避免使用 global 关键字或类似的构造,例如可变全局变量或类属性?
  • 对于这个特定的示例,您可以使用生成器函数。
  • 我只想在控制台中打印 '1' 一次,而不是无限循环运行
  • @KenY-N 我不想把函数名改成 foo

标签: python python-3.x


【解决方案1】:

按照 cmets 中的建议,您可以使用生成器来避免使用全局变量。您需要这个,因为正如您所指出的,每次调用 dinner_completed() 时,计数器变量都会设置为 0。下面是一个使用生成器的例子:

def dinner_completed():
  yield False
  while True:
     yield True

check = dinner_completed()
while not next(check):
  print('1')

正如您所问的,dinner_completed() 函数仅在第一次返回 False,而在所有其他时间返回 True。如果要设置不同的阈值,可以使用以下代码:

def dinner_completed():
  n = 0
  threshold = 1
  while n < threshold:
      yield False
      n += 1
  while True:
      yield True

check = dinner_completed()
while not next(check):
    print('1')

最后一个解决方案,如重复答案中所述,您可以声明一个静态变量。我已经使用if __name__ == '__main__ 来证明这不是全局变量:

def dinner_completed():
    if dinner_completed.counter==0:
        k=False
    if dinner_completed.counter==1:
        k=True
    dinner_completed.counter+=1
    print('counter',dinner_completed.counter)
    return k
if __name__ == '__main__':
    dinner_completed.counter = 0 
    while not dinner_completed():
        print('1')

【讨论】:

  • 但是 U 将函数放在 next() 函数的括号中。我不想在我的 while 条件下编辑任何东西。我只希望在函数中进行更改。
  • @AnudeepKosuri 这是您在创建生成器并将其放入检查变量后调用生成器的方式
  • @AnudeepKosuri 我已经更新了答案以显示第三种可能的解决方案,如重复答案中所述
  • 我不想改变我的 while 条件。那么在这种情况下最好不要使用生成器概念。在您的情况下,我只想在不使用 next() 的情况下将函数称为 'while not Dinner_completed():'。您编写的代码正在将 finction 作为参数发送给 next,但我不想这样做。
  • @AnudeepKosuri 在第三个代码示例中,有一个使用该 while 条件的解决方案
【解决方案2】:

我不确定你想要什么,但我想你可以看看这个?

def dinner_completed(counter):
        return False if counter == 0 else True
       

【讨论】:

  • 我不想让 counter 作为参数传递给函数。
【解决方案3】:

因为这个:

def dinner_completed():
        counter=0
        ...

每次输入函数时,都会将计数器初始化为 0。 如果不想创建全局变量,可以将计数器作为函数的参数发送

def dinner_completed(counter):

但全局变量并不是你想象的真正的大敌,它们可能非常有用

【讨论】:

  • 是的,这就是我在解释中所说的,但我不希望 counter 也作为参数传递。
猜你喜欢
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
相关资源
最近更新 更多