Python 是否有更好的方法定义此生成器?

Python 是否有更好的方法定义此生成器?,python,functional-programming,generator,Python,Functional Programming,Generator,假设我想制作一个生成器,从列表中返回固定数量的用户,如果我想要的用户数量大于列表的长度,它只会重复最后一个用户。我在下面编写了一个生成器: def gen_users(users, total): num_users = len(users) cur_user = 0 while cur_user < total: if cur_user >= num_users: yield users[-1] els

假设我想制作一个生成器,从列表中返回固定数量的用户,如果我想要的用户数量大于列表的长度,它只会重复最后一个用户。我在下面编写了一个生成器:

def gen_users(users, total):
    num_users = len(users)
    cur_user = 0
    while cur_user < total:
        if cur_user >= num_users:
            yield users[-1]
        else:
            yield users[cur_user]
        cur_user += 1
def gen_用户(用户总数):
num_users=len(用户)
cur_user=0
当前用户<总计:
如果cur\u user>=num\u用户:
产量用户[-1]
其他:
产生用户[当前用户]
cur_user+=1
因此,如果我有一个用户列表
users=['one','two','three']
我调用
gen_用户(users,5)
我会返回
one,two,three,three

有没有更像蟒蛇的方法?使用发电机是解决此问题的有效方法吗?

使用:

或者,您可以使用
用户[:total]
,但它将创建临时序列

更新

略加修改的Hans Zauber代码版本:

>>> from itertools import islice, chain, repeat
>>> 
>>> def gen_users(users, total):
...     return islice(chain(users, repeat(users[-1])), total)
... 
>>> list(gen_users([1,2,3], 5))
[1, 2, 3, 3, 3]
>>> list(gen_users([1,2,3], 3))
[1, 2, 3]
>>> list(gen_users([1,2,3], 2))
[1, 2]
使用:

或者,您可以使用
用户[:total]
,但它将创建临时序列

更新

略加修改的Hans Zauber代码版本:

>>> from itertools import islice, chain, repeat
>>> 
>>> def gen_users(users, total):
...     return islice(chain(users, repeat(users[-1])), total)
... 
>>> list(gen_users([1,2,3], 5))
[1, 2, 3, 3, 3]
>>> list(gen_users([1,2,3], 3))
[1, 2, 3]
>>> list(gen_users([1,2,3], 2))
[1, 2]
试试这一行:

import itertools
gen_users = lambda users, total: itertools.chain(itertools.islice(users, total), itertools.repeat(users[-1], total-len(users)))
试试这一行:

import itertools
gen_users = lambda users, total: itertools.chain(itertools.islice(users, total), itertools.repeat(users[-1], total-len(users)))

正是我想要的,我知道必须有更好的方法来做到这一点!谢谢。如果
total
很大,那么使用
xrange
可能会有所改进。@HansZauber,我使用
range
来确保这段代码在Python 2.x和3.x中都能运行。这正是我想要的,我知道必须有更好的方法来做到这一点!谢谢。如果
total
很大,那么使用
xrange
可能是一种改进。@HansZauber,我使用
range
来确保这段代码在Python 2.x和3.x中都能运行。试试
列表(gen_用户([1,2,3],2))
。修复了,我忘了这个问题。这个答案也很棒,同样有效。谢谢。请尝试
列表(gen_用户([1,2,3],2))
。修复了,我忘了这个问题。这个答案也很棒,同样有效。谢谢