Python While循环问题

Python While循环问题,python,django,Python,Django,我在这里空白。我想从用户库中获取所有用户,但只循环10个用户(我省略了一些代码,这些代码将解释为什么我不首先从数据库中获取10个用户) users=User.objects.all() i=0 当我=10:break,则可以删除while并在for循环的末尾添加一个。在通过所有用户之前,不会计算while循环条件。如果i>=10:break,您可以删除while并在for循环的末尾放置一个。实际上,它不是无止境的,它只是在所有用户中运行10次 如果您想要前10个用户(无论他们是否处于活动状态):

我在这里空白。我想从用户库中获取所有用户,但只循环10个用户(我省略了一些代码,这些代码将解释为什么我不首先从数据库中获取10个用户)

users=User.objects.all()
i=0
当我<10时:
对于用户中的用户:
如果user.u处于活动状态:
#做点什么
i+=1

这是在创造一个无止境的循环。。。我遗漏了什么愚蠢的细节?

在通过所有用户之前,不会计算while循环条件。如果i>=10:break,则可以删除while并在for循环的末尾添加一个

在通过所有用户之前,不会计算while循环条件。如果i>=10:break,您可以删除while并在for循环的末尾放置一个

实际上,它不是无止境的,它只是在所有用户中运行10次

如果您想要前10个用户(无论他们是否处于活动状态):


事实上,它不是无止境的,它只是在所有用户中运行了10次

如果您想要前10个用户(无论他们是否处于活动状态):


试着在纸上遵循你的代码,看看它能做什么。您会注意到,您并没有捕获前十个用户,而是对所有用户进行了十次迭代。for循环在
用户
中的所有
用户
上迭代,while循环将for循环重复十次。

试着在纸上跟踪你的代码,看看它做了什么。您会注意到,您并没有捕获前十个用户,而是对所有用户进行了十次迭代。for循环在
users
中迭代所有
user
,而while循环将for循环重复十次。

如果您想查找10个活动用户,您需要更聪明一点

for user in itertools.islice((x for x in users if x.is_active), 10):
  # do something

如果你想寻找10个活跃用户,你需要更聪明一点

for user in itertools.islice((x for x in users if x.is_active), 10):
  # do something

也许你的
i
永远不会达到10。也许你的10个用户都不活跃

可能是
i>10
,在这之前没有检查过情况

filter(lambda u:u.is_active, users)[:10]

也许你的
i
永远不会达到10。也许你的10个用户都不活跃

可能是
i>10
,在这之前没有检查过情况

filter(lambda u:u.is_active, users)[:10]

您的代码似乎与

users = User.objects.filter(is_active=True)[:10]
for user in users:
    #do something

假设您有十个用户。

您的代码似乎与

users = User.objects.filter(is_active=True)[:10]
for user in users:
    #do something

如果你有十个用户。

除了使用特殊的迭代器(有时你导入几十行代码在一个迭代器中编写你的代码,你可以称之为聪明^^^,而你可以用五行代码做同样的事情,不导入)我认为这是在
for
循环中使用
break
的典型情况

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)

除了使用特殊的迭代器(有时你导入几十行代码在一个迭代器中编写代码,你可以称之为聪明^^^,而你也可以使用5行代码而不导入)之外,我认为这是在
for
循环中使用
break
的典型情况

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)

使用列表理解:

[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]]
如果您需要对这些用户执行任何操作,您可以再次使用列表理解:

[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])

使用列表理解:

[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]]
如果您需要对这些用户执行任何操作,您可以再次使用列表理解:

[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])


user.is_活动状态10次或以上不为真。当我在数据库中有10个以上的活动用户时,你需要i+=1?请注意,你正在对所有活动用户进行迭代和操作,因为操作在
for user in users
循环(即全部)中,而
i
检查出该循环…user.is\u active条件在10次或更长时间内不为真。当iDo中有10个以上的活动用户时,您需要在下面输入i+=1?请注意,您正在对所有活动用户进行迭代和操作,因为操作位于用户中用户的
循环中(即全部)当
i
检查该循环时……只有当只有一个用户处于活动状态时才是如此。@蒂姆,我不明白你的意思。如果有十个用户处于活动状态,那么
i
for
循环的末尾是
10
,因此,
while
循环运行一次后,
while
条件变为
False
。如果有2个活动用户,则循环将执行5次。3个用户4次,等等@Tim&@Ignacio:哦,我没有注意到
I+=1
:|只有当只有一个用户处于活动状态时才会出现这种情况。@Tim我不明白你的意思。如果有十个用户处于活动状态,那么
I
for
循环的末尾是
10
,因此,
while
循环运行一次后,
while
条件变为
False
。如果有2个活动用户,则循环将执行5次。3个用户4次,等等@Tim&@Ignacio:哦,我没有注意到
I+=1
:|您的第一条语句是错误的,您的代码示例将无法工作。如果
用户[:10]
中的一个处于非活动状态,它将创建一个无休止的循环。您确定这会按预期工作吗?我的意思是,我只在用户处于活动状态时增加,但如果有活动用户和非活动用户混合在一起,那会怎么样?您的第一条语句是错误的,您的代码示例将无法工作。如果
用户[:10]
中的一个处于非活动状态,它将创建一个无休止的循环。您确定这会按预期工作吗?我的意思是,只有当用户处于活动状态时,I才会增加,但如果有活动用户和非活动用户混合在一起,那会怎样呢?