Discord.py Rewrite/Python,如果不是 运行
Discord.py Rewrite/Python, an if is not running
我有这个代码:
@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))
它应该 运行 通过服务器中的每个成员,如果它查看的成员是机器人。它将被添加到一个列表中,在所有这些结束时,它将打印列表中的每个元素以进行聊天,但底部的 if 不是 运行ning。我做错了什么?
老实说,您的代码过于复杂和令人费解,这让我无法理解您要完成的任务。
这是对您所拥有内容的非常简单的重写:
bots = []
for member in ctx.guild.members:
if member.bot:
bots.append(member.display_name)
print(', '.join(bots))
如果 members-1 (x
) 的数量与服务器中的成员数量相同 (len(ctx.guild.members)
).从本质上讲,这种情况永远不会成功。我假设您希望您的机器人在 for-loop 结束时发送一条消息。如果是这样,那很简单:删除条件并取消缩进你想要的代码 运行 所以它在 for-loop:
之外
@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)
你可以让我们使用 filter()
and map()
来简化你的代码,你也不需要检查你的循环是否从循环内部结束你可以把你的代码放在循环之外所以它会循环结束后执行。这是实现您想要的目标的一种方法:
@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)
我有这个代码:
@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))
它应该 运行 通过服务器中的每个成员,如果它查看的成员是机器人。它将被添加到一个列表中,在所有这些结束时,它将打印列表中的每个元素以进行聊天,但底部的 if 不是 运行ning。我做错了什么?
老实说,您的代码过于复杂和令人费解,这让我无法理解您要完成的任务。
这是对您所拥有内容的非常简单的重写:
bots = []
for member in ctx.guild.members:
if member.bot:
bots.append(member.display_name)
print(', '.join(bots))
如果 members-1 (x
) 的数量与服务器中的成员数量相同 (len(ctx.guild.members)
).从本质上讲,这种情况永远不会成功。我假设您希望您的机器人在 for-loop 结束时发送一条消息。如果是这样,那很简单:删除条件并取消缩进你想要的代码 运行 所以它在 for-loop:
@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)
你可以让我们使用 filter()
and map()
来简化你的代码,你也不需要检查你的循环是否从循环内部结束你可以把你的代码放在循环之外所以它会循环结束后执行。这是实现您想要的目标的一种方法:
@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)