为了账号安全,请及时绑定邮箱和手机立即绑定

如何在python中编程以在每次函数调用时自动递增一个数字

如何在python中编程以在每次函数调用时自动递增一个数字

RISEBY 2021-08-05 15:41:29
我定义了一个函数,其中有一个变量num赋值为 1000,increment变量用于将 num 增加 1。当它第一次被调用时,它会增加一并显示值 1001,但是当它再次被调用时,它会显示相同的值 1001,但它应该在每次调用时显示 1002、1003def number():    num = 1000    increment = num +1    return incrementprint(number())
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

除了已经发布的优秀答案外,您还可以使用闭包来做到这一点:


def incrementor():

    info = {"count": 999}

    def number():

        info["count"] += 1

        return info["count"]

    return number


number = incrementor()


>>> number()

1000

>>> number()

1001

>>> number()

1002

(字典有点笨拙,但你不能用一个简单的变量名来做,至少不使用 Python 3 的nonlocal关键字,这对我来说更笨拙。我想这个特定的例子不会被认为是非常 Pythonic 的 -但这是一个选项,您将在其他 Python 代码中看到类似模式的真正用途。)


查看完整回答
反对 回复 2021-08-05
?
弑天下

TA贡献1818条经验 获得超8个赞

Python 允许将属性附加到函数(毕竟它是 class 的对象function)。


因此,您可以通过这种方式避免全局(或非局部)变量:


def number():

    if hasattr(number, "num"):

        number.num += 1           # increment if not first call

    else:

        number.num = 1000         # initialize on first call

    return number.num

演示:


>>> for i in range(10):

        print(number())

按预期显示:


1000

1001

1002

1003

1004

1005

1006

1007

1008

1009

并且没有与全局变量的另一种使用发生冲突的风险......


但要小心。一个晚上后,我意识到虽然这是你要求的,但这是一种反模式。这是 OOP 语言中的一个有状态函数,yerk ...


状态应该保存在对象中,函数应该是无状态的。你可以打破这个规则,但它可能会混淆该代码的未来读者(甚至你......)。所以请不要。



查看完整回答
反对 回复 2021-08-05
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

您应该num在number函数外部定义,并将其声明为函数内部的全局变量,以便您可以引用它并在递增后更新其值:


num = 1000

def number():

    global num

    num += 1

    return num


print(number())

print(number())

print(number())

这输出:


1001

1002

1003

或者,您可以定义一个具有保存当前值的实例变量和一个递增它的方法的类:


class Number:

    def __init__(self, value):

        self.value = value

    def increment(self):

        self.value += 1

        return self.value

以便:


number = Number(1000)

print(number.increment())

print(number.increment())

print(number.increment())

也会输出:


1001

1002

1003

然而,这使得用法有些冗长。一个更简单的方法是创建value一个类变量并覆盖该类的__new__方法:


class number:

    value = 1000

    def __new__(cls):

        cls.value += 1

        return cls.value

以便:


print(number())

print(number())

print(number())

会输出:


1001

1002

1003


查看完整回答
反对 回复 2021-08-05
  • 3 回答
  • 0 关注
  • 746 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信