我在这里瞎扯。我想从用户群中获取所有用户,但是只能循环访问其中的10个用户(我要省略代码,这些代码可以解释为什么我不会首先从数据库中获取10个用户)。
users = User.objects.all()
i = 0
while i < 10:
for user in users:
if user.is_active:
# do something
i += 1
这创造了一个无限循环...我错过了什么愚蠢的细节?
答案 0 :(得分:8)
如果您想要寻找10个活跃的用户,您需要更加聪明一点。
for user in itertools.islice((x for x in users if x.is_active), 10):
# do something
答案 1 :(得分:2)
实际上,它并非无穷无尽,它只会在所有用户中运行10次。
如果您想要前10位用户(无论他们是否处于活动状态):
while i < 10:
user = users[i]
if user.is_active:
# do something
i += 1
如果您想要前10位活跃用户:
for user in users:
if user.is_active:
#do something
i += 1
if i >= 10:
break
答案 2 :(得分:1)
在您通过所有用户之前,不评估while循环条件。您可以删除while,然后在for循环的末尾添加if i >= 10: break
。
答案 3 :(得分:0)
尝试在纸上关注您的代码,看看它的作用。您会注意到您没有抓住前十个用户,但是您正在迭代所有用户十次。 for循环迭代user
中的所有users
,而while循环重复for循环十次。
答案 4 :(得分:0)
Mabybe你的i
永远不会达到10.可能甚至没有10个用户活跃。
可能i > 10
并且在此之前未检查条件。
filter(lambda u:u.is_active, users)[:10]
答案 5 :(得分:0)
您的代码似乎等同于
users = User.objects.filter(is_active=True)[:10]
for user in users:
#do something
为您提供十个用户。
答案 6 :(得分:0)
除了使用特殊的迭代器(有时你导入几行代码来编写你的一个,你可以称之为聪明的^^,而你可以用5行而没有导入)我想这个是在break
循环
for
的典型案例
users = User.objects.all()
i = 0
for user in users:
if user.is_active:
#do something
i += 1
if i == 10:
break
else:
#do something if less than 10 active users (if necessary)
答案 7 :(得分:0)
使用列表理解:
[user for user in User.objects.all() if user.is_active][:10]
如果您需要对此类用户执行任何操作,您可以再次使用列表理解:
[action(usr) for usr in [user for user in User.objects.all() if user.is_active][:10]]
或地图:
map(action, [user for user in User.objects.all() if user.is_active][:10])