更多的pythonic实现,用于在lis中连续循环

2024-05-23 19:29:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用于访问API的令牌列表。我希望始终能够选择列表中的下一个令牌以供使用,当到达列表末尾时,重新开始

我现在有了这个,可以用了,但是我发现它很乱,不可读

class tokenz:
    def __init__(self):
        self.tokens = ['a', 'b', 'c', 'd', 'e']
        self.num_tokens = len(tokens)
        self.last_token_used = 0

    def select_token(self):
        if self.last_token_used == 0:
            self.last_token_used += 1
            return self.tokens[0]
        elif self.last_token_used < (self.num_tokens - 1):
            self.last_token_used += 1
            return self.tokens[self.last_token_used - 1]
        elif self.last_token_used == (self.num_tokens -1):
            self.last_token_used = 0
            return self.tokens[self.num_tokens - 1]

有没有想过让这个更像Python


Tags: selftokenapi列表returninitdefnum
1条回答
网友
1楼 · 发布于 2024-05-23 19:29:50

使用itertools.cycle()获得一个生成器,该生成器无限重复项目列表

In [13]: tokens = ['a', 'b', 'c', 'd', 'e']

In [14]: import itertools

In [15]: infinite_tokens = itertools.cycle(tokens)

In [16]: [next(infinite_tokens) for _ in range(13)]
Out[16]: ['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c']    

如果你真的想让你发布的代码更简单,可以使用模运算

self.last_token_used = (self.last_token_used + 1) % len(self.tokens)

另外,可以在Python列表中使用负索引,因此if语句是不必要的:

In [26]: for n in range(len(tokens)):
    ...:     print('{}: tokens[{}] = {}'.format(n, n-1, tokens[n-1]))
    ...:
0: tokens[-1] = e
1: tokens[0] = a
2: tokens[1] = b
3: tokens[2] = c
4: tokens[3] = d

然后你的代码变成:

class tokenz:
    def __init__(self):
        self.tokens = ['a', 'b', 'c', 'd', 'e']
        self.num_tokens = len(self.tokens)
        self.last_token_used = 0

    def select_token(self):
        self.last_token_used = (self.last_token_used + 1) % self.num_tokens
        return self.tokens[self.last_token_used - 1]

相关问题 更多 >