函数中打印和返回有什么区别?

时间:2014-05-15 02:31:20

标签: python function

我有这个功能:

def sbo_extra_dwn(link, name):
    sbo_url_dwn = link + name + ".info"
    sbo_url_dwn = sbo_url_dwn.replace("repository", "slackbuilds")

    f = urllib2.urlopen(sbo_url_dwn)
    read_page = f.read()
    for line in read_page.splitlines():
            if line.startswith(' '):
                    line = line[10:-1]
            if line.startswith('http'):
                    print line 

这会打印两个链接:http://downloads.sourceforge.net/project/unvanquished/Assets/unvanquished_0.26.0.pk3 http://sourceforge.net/projects/unvanquished/files/Assets/unvanquished_0.25.0.pk3

但如果退回一行,请不要使用2个链接.....这样:

def sbo_extra_dwn(link, name):
    sbo_url_dwn = link + name + ".info"
    sbo_url_dwn = sbo_url_dwn.replace("repository", "slackbuilds")

    f = urllib2.urlopen(sbo_url_dwn)
    read_page = f.read()
    for line in read_page.splitlines():
            if line.startswith(' '):
                    line = line[10:-1]
            if line.startswith('http'):
                    return line

结果只有一个链接:

如果有必要,如何再回来两次?

3 个答案:

答案 0 :(得分:1)

将结果附加到列表中,然后返回该列表。

def sbo_extra_dwn(link, name):
    results = []
    sbo_url_dwn = link + name + ".info"
    sbo_url_dwn = sbo_url_dwn.replace("repository", "slackbuilds")

    f = urllib2.urlopen(sbo_url_dwn)
    read_page = f.read()
    for line in read_page.splitlines():
            if line.startswith(' '):
                    line = line[10:-1]
            if line.startswith('http'):
                    results.append(line)
    return results

但是,您可能希望返回一个元组,因为它们具有不变性(由@Moe建议):

def sbo_extra_dwn(link, name):
    results = ()
    sbo_url_dwn = link + name + ".info"
    sbo_url_dwn = sbo_url_dwn.replace("repository", "slackbuilds")

    f = urllib2.urlopen(sbo_url_dwn)
    read_page = f.read()
    for line in read_page.splitlines():
            if line.startswith(' '):
                    line = line[10:-1]
            if line.startswith('http'):
                    results = results+(line,)
    return results

在您的1 st 示例中,您print了结果。在2 nd 中,你是returnreturn语句非常类似于break,只是它返回一个值。因此,当您返回第一个值时,它会从函数中断。

答案 1 :(得分:1)

您可以将它们附加到列表中并返回它们,例如@ aj8uppal的答案。您还可以使用yield关键字。

def sbo_extra_dwn(link, name):
    sbo_url_dwn = link + name + ".info"
    sbo_url_dwn = sbo_url_dwn.replace("repository", "slackbuilds")

    f = urllib2.urlopen(sbo_url_dwn)
    read_page = f.read()
    for line in read_page.splitlines():
            if line.startswith(' '):
                    line = line[10:-1]
            if line.startswith('http'):
                    yield line

然后,您可以像这样使用它:

lines = sbo_extra_dwn(my_link, my_name)
for l in lines:
    ....

希望这有帮助!

答案 2 :(得分:-1)

您的两个代码示例有两种截然不同的行为:

  1. print在标准输出上显示某些内容并允许for line循环继续并打印其他匹配但在执行从None <结束时返回sbo_extra_dwn < / LI>
  2. 一个几乎相同的函数,它在第一次成功时执行return line,从而终止整个sho_extra_dwn函数。 确实会返回一个值,但只会找到符合条件的第一个值。
  3. 这里的其他答案&#34;给了你一条鱼&#34;而不是向你展示你在捕鱼技术中犯的错误。您需要了解printreturn之间的重要区别,然后修复才有意义。


    比较这两位最小代码以及它们的行为如何不同:

    def printer():
        for c in 'user3634982':
            print c
    

    打印多少行? printer()的返回值是什么?

    def returner():
        for c in 'user3634982':
            return c
    

    打印多少行? returner()的返回值是什么?