Discord.py Rewrite/Python,if未运行

Discord.py Rewrite/Python,if未运行,python,discord.py,discord.py-rewrite,Python,Discord.py,Discord.py Rewrite,我有以下代码: @bot.command() async def allBots(ctx): bots = [] for x in range(len(ctx.guild.members)): if ctx.guild.members[x].bot: print('Found a bot! its name is ' + ctx.guild.members[x].display_name) bots.append(c

我有以下代码:

@bot.command()
async def allBots(ctx):
    bots = []
    for x in range(len(ctx.guild.members)):
        if ctx.guild.members[x].bot:
            print('Found a bot! its name is ' + ctx.guild.members[x].display_name)
            bots.append(ctx.guild.members[x].display_name)
        if x == len(ctx.guild.members):
            print('Found every bot in a server!')
            a = print(*bots, split=', ')
            await ctx.send(str(a))

它应该通过服务器中的每个成员运行,如果它所查看的成员是bot。它将被添加到一个列表中,在所有这些操作结束时,它将打印列表中的每个元素以进行聊天,但底部的if没有运行。我做错了什么?

老实说,你的代码过于复杂和复杂,它让我难以理解你想要实现的目标

下面是一个非常简单的重写:

bots = []
for member in ctx.guild.members:
    if member.bot:
        bots.append(member.display_name)

print(', '.join(bots))

如果成员数量-1(
x
)与服务器中的成员数量相同(
len(ctx.guild.members)
),则最后一个if语句将仅打印服务器中的每个bot用户。从本质上讲,这种情况永远不会成功。我假设您希望您的机器人在for循环的末尾发送消息。如果是这样,那很简单:删除条件并取消插入要运行的代码,使其位于for循环之外:

@bot.command()
async def allBots(ctx):
    bots = []

    for x in range(len(ctx.guild.members)):
        if ctx.guild.members[x].bot:
            print('Found a bot! its name is ' + ctx.guild.members[x].display_name)
            bots.append(ctx.guild.members[x].display_name)

    print('Found every bot in a server!')
    a = ', '.join(bots)  # Don't use print() to store a string; it returns None
    await ctx.send(a)
正如@derw所说,只需直接遍历
ctx.guild.members
,您就可以更高效地运行服务器中的成员:

@bot.command()
async def allBots(ctx):
    bots = []

    for member in ctx.guild.members:
        if member.bot:
            print('Found a bot! its name is', member.display_name)
            bots.append(member.display_name)

    print('Found every bot in a server!')
    a = ', '.join(bots)
    await ctx.send(a)
你可以让我们简化你的代码,你也不需要检查你的循环是否从循环内部结束,你可以把你的代码放在循环外部,这样一旦循环结束它就会被执行。以下是实现您所需的一种方法:

@bot.command() 
async def allBots(ctx): 
    bots = map(lambda member: member.display_name, filter(lambda member: member.bot, ctx.guild.members)) # Filter members that are bots then get their display names 
    
    # Loop through every bot's display name
    for bot in bots: 
        print("Found a bot! Its name is", bot)

    print("Found every bot in the server")
    a = ', '.join(bots)
    print(a)
    await ctx.send(a)

哦,谢谢你告诉我。。。几个月前我才开始做discord.py和python,您希望
x
每次循环都有哪些值?您希望
x
的最大值是多少?这与您的上一个条件如何匹配?无论如何,如果您希望某件事情发生一次,在循环中进行所有处理之后。。。只要把它放在循环后面,没有牵连。@KarlKnechtel是的,我现在知道了。。。当我编写原始代码时,我认为它仍然会在循环开始时编写代码。但是我错了。我已经用@derw所说的话修复了它,但是谢谢你的帮助,我可以做些什么来修复我原来效率低下的代码。