python中的内部函数不';不要在正确的地方回来

python中的内部函数不';不要在正确的地方回来,python,return,control-flow,Python,Return,Control Flow,在下面来自我的一个内部函数的代码中,无论分数如何,返回的唯一值都是(0,None)。我可以看到,当团队达到胜利或仁慈阈值时,for循环终止,但这并不是整个函数的返回值。我不记得返回语句是这样工作的,所以有人能解释一下为什么会发生这种情况吗 def victory_check()->元组[可选[int],可选[Team]]: 得分都很差:bool=True 对于tea_lst团队: 打印(团队得分)#调试 如果team.score>=胜利\u阈值: 返回1,团队 如果team.scorebad\u

在下面来自我的一个内部函数的代码中,无论分数如何,返回的唯一值都是
(0,None)
。我可以看到,当团队达到胜利或仁慈阈值时,
for
循环终止,但这并不是整个函数的返回值。我不记得返回语句是这样工作的,所以有人能解释一下为什么会发生这种情况吗

def victory_check()->元组[可选[int],可选[Team]]:
得分都很差:bool=True
对于tea_lst团队:
打印(团队得分)#调试
如果team.score>=胜利\u阈值:
返回1,团队
如果team.scorebad\u ai\u end:
得分为“全部”\u糟糕=错误
如果得分都很差:
返回-1,无
返回0,无
团队
对象由以下内容组成。测试工具将-12到14之间的随机整数添加到每个团队的分数中,以假装玩一手牌。打印语句中正确反映了
Team.score

班级团队:
球员:名单[球员]
分数:int=0
出价:整数
定义初始(自我,玩家:列表[玩家]):
self.players=玩家

不确定您的
团队列表是什么样子的。假设它是一个字典列表,此代码按预期工作

team_lst=[{'score':40}]
def victory_check():
得分都很差:bool=True
对于团队中的团队:
打印(team.keys())
打印(team.get('score'))#调试
如果team.get('score')>=5:
返回1,团队
如果团队得分('score')<5:
返回-1,团队
如果团队得分('score')>100:
得分为“全部”\u糟糕=错误
如果得分都很差:
返回-1,无
返回0,无
根据

return将当前函数调用与表达式列表(或 无)作为返回值

因此,函数执行(而不是返回)多个返回语句的唯一方法是在finally块中使用参数运行try-except块。像下面这样。明确地说,(Python在内部执行两个返回,但实际上只返回一个)


您能更清楚地说明您的输入和输出的外观吗?“我可以看到,当一个团队达到胜利或仁慈阈值时,for循环终止”,是吗?还是在那之后它碰巧终止了?因为
return
确实从(最近的)封闭函数返回。由于select没有被破坏,所以在代码执行过程中可能缺少一些东西。因为你没有提供复制的手段,所以很难分析这个问题。无论如何,使用一些合成值,事情似乎如预期的那样起作用:假设bad_ai_end=0;胜利阈值=9;mercy_rule=-10和得分为10、5、-5和-100的单个团队的序列我得到的结果是
1、团队
0、无
-1、无
-1,团队
,这与代码应该做的是一致的。结果表明,错误出现在测试循环中,而不是我想到的函数。虽然可以在
finally
块中用另一个返回语句覆盖以前“执行”的返回语句,这绝对是一种糟糕的风格,几乎总是可以避免的。在你的例子中,从循环中选择一个位置合适的
中断
,可以达到同样的效果,而且更加清晰。我同意这一点。我的论点是,afaik触发两个返回语句的唯一方法是使用try/except块和finally,正如您所说,它显然会覆盖。因此,这个用户发布的问题不能像他说的那样工作。我的代码只是一个可能和不可能的例子。。。
def nums(list_ofvals):

    score = True
    try:
        for v in list_ofvals:
            if v == 1:
                return "one return", 1

            elif v == 3:
                return "three return", 3
    except:
        pass

    finally:
        if score == True:
            return "true score"
        else:
            pass

print(nums([1])) #function call