本站消息

站长简介/公众号


站长简介:逗比程序员,理工宅男,前每日优鲜python全栈开发工程师,利用周末时间开发出本站,欢迎关注我的微信公众号:幽默盒子,一个专注于搞笑,分享快乐的公众号

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

我如何从 Python 函数返回多个变量

发布于2021-07-23 03:12     阅读(427)     评论(0)     点赞(26)     收藏(0)



我有一个从网站中提取字符串的函数,函数如下:

def get_maps_info(url):
page = get_parsed_page(url)
# extract match infos 
maps = page.find('div', {'class' : 'padding preformatted-text'})
return maps.text

上面的代码将返回如下内容:

'Best of 1\n\n* Group B elimination match'

所以我有另一个函数来检查,如果找到 'Best of 3' 从第一个 'if' 开始,我是 python 的新手,但我认为这没问题,如果你有一些提示或最佳实践,请告诉我。

问题是我需要返回所有这些变量,我该怎么做?

def get_results_maps(url):
page = get_parsed_page(url)

if 'Best of 3' in get_maps_info(url):
    ## verify team winners for each map for Best of 3
    ## first team is the winner and second is the loser and so on
    if int(page.findAll('div', {'class' : 'results-team-score'})[0].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[1].text):
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)   
    else:
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 

    if int(page.findAll('div', {'class' : 'results-team-score'})[2].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[3].text):
        team_winner_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)
        team_loser_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
    else:
        team_winner_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map2 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)

    if int(page.findAll('div', {'class' : 'results-team-score'})[4].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[5].text):
        team_winner_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)
        team_loser_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text) 
    else:
        team_winner_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map3 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text)

    # end verify team winners for each map for Best of 3

    ## verify team winners for each map for Best of 1
elif 'Best of 1' in get_maps_info(url):
    if int(page.findAll('div', {'class' : 'results-team-score'})[0].text)>=int(page.findAll('div', {'class' : 'results-team-score'})[1].text):
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)   
    else:
        team_winner_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[1].text)
        team_loser_map1 = (page.findAll('div', {'class' : 'results-teamname text-ellipsis'})[0].text) 
    # end verify team winners for each map for Best of 1    

return (team_winner_map1, team_loser_map1, team_winner_map2, team_loser_map2, team_winner_map3, team_loser_map3)

运行上面的函数后出错:

错误

我不知道我是否足够清楚,否则随时向我询问任何事情。


解决方案


您遇到的问题是,并非您在return语句中使用的所有变量都是在上面的代码中创建的。有几种可能发生的方式。

首先,如果既不出现Best of 1也不Best of 3出现,您将不会定义任何变量。这显然很糟糕,并且可能表明您的数据并不完全符合您期望的格式。您可以通过向else现有if/elif分支添加一个部分来诊断这种情况即使它不应该发生,通常也值得检查每一种可能性,至少以一种好的方式报告错误。

另一个问题是您的ifelif选项定义了不同的变量集。您当前的代码需要所有三对输赢分数,但在这种Best of 1情况下,它只会找到第一对。要解决此问题,您要么需要return为每个分支自定义语句(因此最好的 1 种情况可以返回 2 元组而不是 6 元组),或者您需要为从未发生过的游戏定义虚拟值。(我也不确定你是否总是能在三局两胜的情况下获得三局比赛的结果,但这是一个不同的问题。)

一个小问题(这可能是也可能不是什么大问题,取决于您未显示的代码是如何实现的)是您get_maps_info在不同的测试中重复调用该函数if/elif如果需要,这可能效率低下每次从网络上获取 URL。更好的方法可能是保存一次调用的结果并在必要时重用它(正如您已经在使用page)。

将所有这些放在一起,我会更像构建代码:

page = get_parsed_page(url)
maps_info = get_maps_info(url)

if 'Best of 3' in maps_info:
    ...     # code to find winner/loser stuff omitted for brevity

    return (team_winner_map1, team_loser_map1,
            team_winner_map2, team_loser_map2,
            team_winner_map3, team_loser_map3) # move the current return statement here!

elif 'Best of 1' in maps_info:
    ...

    return (team_winner_map1, team_loser_map1) # return a 2-tuple in this case

else:  # report error if we don't get any of the strings we expect
    raise ValueError("Expected Best of 3 or Best of 1, got map-info: {!r}".format(map_info))





所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/1003958/0f99987f1d705e18aae9/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

26 0
收藏该文
已收藏

评论内容:(最多支持255个字符)