【问题标题】:Confused as to where to use return statement in Python对在 Python 中在哪里使用 return 语句感到困惑
【发布时间】:2017-02-03 18:00:07
【问题描述】:

有时我对 where 使用 return 语句感到困惑。我已经在 codecademy 上完成了 Python 课程,并且我正在通过在线 CS 课程介绍进行到一半,仍然我有时会出错。我明白它的作用,只是我没有正确“得到”它的位置:/

这是相同代码的简短示例。

正确方法:

def product_list(list_of_numbers):
    c = 1
    for e in list_of_numbers:
        c = c * e
    return c

错误的方式(我最初做的):

def product_list(list_of_numbers):
    c = 1
    for e in list_of_numbers:
        c = c * e
        return c

这对你们大多数人来说可能听起来很傻,但在更大和更复杂的情况下,我会很困惑。如果有人能一劳永逸地向我澄清,我将不胜感激。

【问题讨论】:

  • 由于return 返回到达的那一刻,您认为第二个版本中for 循环迭代的其余部分可能会发生什么?
  • 这归结为理解 Python 中的块是什么;您了解缩进如何确定 for 循环或 product_list 函数的一部分吗?
  • 值得注意的是“正确方式”中的相反情况。虽然您确实按照其他人的解释完成了 for 循环中的所有迭代,但您仅在 return 的最后一次计算中使用了 c 的值。在这种情况下,您可能希望将 c 的所有值存储在一个列表中,然后返回该列表。
  • @Vayl:不,因为函数在到达return 时结束。所以for 循环仍处于第一次迭代中,您的return 结束了函数。循环迭代的其余部分现在不会运行,忽略 list_of_numbers 中的其他值。
  • @MartijnPieters,啊,我明白了!所以 return 语句实际上结束一个循环。当它在循环外部时,它只会在循环完全完成时结束它。听起来对吗?

标签: python


【解决方案1】:

return 在函数中意味着您将立即离开该函数并返回到您调用它的地方。 因此,当您 100% 确定要立即退出该功能时,您应该使用 return

在您的示例中,我认为您不想在获得 c 的最终值之前退出函数,因此您应该将 return 放在循环之外。

【讨论】:

  • 好的,所以基本上一个 for 循环会在没有return 语句的情况下无限运行。所以在某种程度上return 有点像break 但它返回一个值?
  • @Vayl 不,它不会无休止地运行。当它遍历list_of_numbers 中的所有内容时,它仍然会完成。但是如果你在循环中放一个return,它会提前结束(在第一次迭代中)。
  • @Vayl 不,它不会无休止地运行。它将运行您要求它执行的确切迭代次数(在这种情况下,list_of_numbers 中的项目数)。在for 循环范围内的return 恰好终止了函数,在第一次迭代时将你踢出for 循环,这更像是停止函数的副产品。
  • 不,在 list_of_numbers 中的所有元素都被访问后,循环会自动结束。
【解决方案2】:

您过分强调return 对控制for 循环行为的影响。相反,return 应用于函数,并且恰好通过主要结束函数来提前终止 for 循环。

相反,您可以使用break 独立于函数本身来控制for 循环的行为。此外,您可以在一个函数中包含多个return 语句,具体取决于响应特定条件应采取的操作(如my_func1)。考虑以下几点:

import random

def my_func1(my_list, entry):
    ''' 
    Search a list for a specific entry. When found, terminate search 
    and return the list index immediately

    Return False if not found
    '''

    print "\n Starting func1"
    index = 0

    for item in my_list:
        if item != entry:
            print "Not found yet at index: {}".format(index)
            index += 1
        else:
            print "found item, at index {}".format(index)
            print "Terminating function AND loop at same time"
            return index

    print "########### ENTRY NOT IN LIST. RETURN FAlSE #############"
    return False


a = my_func1(['my', 'name', 'is', 'john'], 'is')
b = my_func1(['my', 'name', 'is', 'john'], 'harry')


def my_func2(my_list):
    ''' Iterate through a list
    For first 4 items in list, double them and save result to a list that will
    be returned, otherwise terminate the loop
    Also, return another list of random numbers
    '''
    print '\n starting func2'

    return_list = []
    for i in range(len(my_list)):
        if i < 4:
            print 'Value of i is {}'.format(i)
            return_list.append(my_list[i] * 2)
        else:
            print 'terminating for loop, but ** keep the function going **'
            break

    other_list = [random.randint(1, 10) for x in range(10)]

    print 'Returning both lists'
    return return_list, other_list

c = my_func2([x for x in range(10)])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多