Python While循环问题

时间:2011-07-13 06:35:00

标签: python django

我在这里瞎扯。我想从用户群中获取所有用户,但是只能循环访问其中的10个用户(我要省略代码,这些代码可以解释为什么我不会首先从数据库中获取10个用户)。

users = User.objects.all()
i = 0
while i < 10:
    for user in users:
        if user.is_active:
            # do something
            i += 1

这创造了一个无限循环...我错过了什么愚蠢的细节?

8 个答案:

答案 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])