Python:如何将3个函数合并为一个(用于生成数字计数器)

Python:如何将3个函数合并为一个(用于生成数字计数器),python,Python,我有以下3个单独的函数,我根据它们的类别在代码的不同位置使用它们。。基本上我想生成不同的序列号。调用我的函数“AppleNum”从002开始,如下所示,函数“BananaNum”的不同序列号(从005开始)依此类推 我的问题是,如何将这3个单独的函数放在一个函数或类中,这样当我调用“Apple”时,我的数字从002递增,如果调用“Orange”,我的数字从009递增。。(也可以设置计数器的最大值,使其从最小值开始。) 预期输出: Imagine a single function that ha

我有以下3个单独的函数,我根据它们的类别在代码的不同位置使用它们。。基本上我想生成不同的序列号。调用我的函数“AppleNum”从002开始,如下所示,函数“BananaNum”的不同序列号(从005开始)依此类推

我的问题是,如何将这3个单独的函数放在一个函数或类中,这样当我调用“Apple”时,我的数字从002递增,如果调用“Orange”,我的数字从009递增。。(也可以设置计数器的最大值,使其从最小值开始。)

预期输出:

Imagine a single function that have all above, and if call `function(Apple)` --> gives 003, and increments starts from there.

at same time if i call `function(Orange)` ---> gives 010 and increment starts from there.
这只是一个示例代码,我的原始代码中有12-15个类别。。因此,我不想写12个单独的函数

请帮帮我

(如果有可能设置最大值,请感谢您的帮助,这意味着如果计数器达到9999,计数器将再次从其最小值开始。)


提前谢谢。

这真的很简单。以下是最简单的方法:

Apple=2
香蕉=5
橙色=9
def fn(案例):
全球苹果、香蕉、橘子
如果案例==“苹果”:
苹果+=1
返回str(苹果)。zfill(3)
elif案例==“香蕉”:
香蕉+=1
返回str(香蕉)。zfill(3)
elif case==“橙色”:
橙色+=1
返回str(橙色)。zfill(3)
回来

对于最大值,只需包含一些常量“原始值”变量,然后在递增时检查任何值是否大于最大值,如果大于,则重置

您可以使用dict存储您的函数:

my_f = {'Apple': AppleNum, 'Orange': OrangeNum, 'Banana' :OrangeNum}

def fruits(fruit):
    return my_f[fruit]()

以下是如何将计数器设置为最大999的更好方法:

from itertools import cycle
from collections import defaultdict

count = defaultdict(lambda : cycle(range(1000)))

def fruits(f):
    return f'{next(count[f])}'.zfill(3)
水果
功能一起使用的任何水果将自动注册,最大计数器为999,一旦达到最大值,计数器将再次循环至0

如果要设置最小值,可以使用:

from itertools import cycle

count = {'Apple': cycle(range(2,1000)),  'Banana': cycle(range(5,1000)), 'Orange': cycle(range(9,1000))}
def fruits(f):
    return f'{next(count[f])}'.zfill(3)

根据你所说的,这似乎能奏效

Apple=2
橙色=9
香蕉=5
def水果公司(水果):
全球苹果、橘子、香蕉
如果水果=“苹果”:
苹果+=1
返回str(苹果)。zfill(3)
elif水果==“橙色”:
橙色+=1
返回str(橙色)。zfill(3)
elif水果==“香蕉”:
香蕉+=1
返回str(香蕉)。zfill(3)
其他:
打印(“水果无效”)

您可以定义一个名为Fruit的类(例如),然后实例化不同的水果:

class Fruit():
    amount = 0
    index = ''
    def increment(self):
        self.amount += 1
        self.index = str(self.amount).zfill(3)

banana = Fruit()
banana.increment()

apple = Fruit()
apple.increment()
apple.increment()
apple.increment()

print (banana.index, 'bananas') # prints 001 bananas
print (apple.index, 'apples')   # prints 003 apples

使用具有名称和默认最小值和最大值的类

class FruitCounter():
  def __init__(self, name, begin = 0, max_count = 9999):
    self.name = name
    self.count = begin
    self.max_count = max_count

  def incr(self):
    if self.count <= self.max_count:
      self.count += 1
    return str(self.count).zfill(3)

  def __str__(self):
    return self.name
输出

# Instantiate fruit in loop and increment
for fruit in [FruitCounter('Apple', 2, 4), FruitCounter('Banana', 5, 7), FruitCounter('Orange', 9)]:
  for i in range(10):
    print(f'Incrementing {fruit} {fruit.incr()}')
Incrementing Apple 003
Incrementing Apple 004
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Banana 006
Incrementing Banana 007
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Orange 010
Incrementing Orange 011
Incrementing Orange 012
Incrementing Orange 013
Incrementing Orange 014
Incrementing Orange 015
Incrementing Orange 016
Incrementing Orange 017
Incrementing Orange 018
Incrementing Orange 019

嗨,DarrylG,谢谢你的回复。。我不明白max_count=-1。我尝试将其更改为2,但我发现输出没有任何差异。@Maria--
max\u count=-1
导致它在这种情况下忽略它。我修改了代码,使max_count在默认情况下成为一个大数字(即9999),从而变得更简单。感谢Kederrac的响应。在上一个解决方案中(使用最小值),如果使用“fruit_min_value={'Apple':1,‘香蕉’:5,‘橙色’:9}”,我不需要定义全局变量。对吗?@Maria yes,使用全局变量不是最好的practice@Maria我已经更新了我的上一个答案,变量
fruit\u min\u value
未使用,最小值在
count
中设置,将自动循环最小-最大间隔
Incrementing Apple 003
Incrementing Apple 004
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Apple 005
Incrementing Banana 006
Incrementing Banana 007
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Banana 008
Incrementing Orange 010
Incrementing Orange 011
Incrementing Orange 012
Incrementing Orange 013
Incrementing Orange 014
Incrementing Orange 015
Incrementing Orange 016
Incrementing Orange 017
Incrementing Orange 018
Incrementing Orange 019