这个 return 语句究竟指示程序做啥?

Posted

技术标签:

【中文标题】这个 return 语句究竟指示程序做啥?【英文标题】:What exactly does this return statement instruct the program to do?这个 return 语句究竟指示程序做什么? 【发布时间】:2013-09-29 08:01:16 【问题描述】:

这是来自 https://wiki.python.org/moin/SimplePrograms 的 8 个皇后问题的递归解决方案。我很难理解解决函数中的 return 语句如何/为什么起作用。乍一看,它似乎违反了规则(例如,解决方案尚未在 return 语句中的循环之前声明或分配值,但它出现在 return 语句中的循环之前)但我可以成功运行它,所以我很想了解它是如何工作的,以及为什么有人可能会选择这样写(混淆?简短?因为其他限制我还不明白?)

BOARD_SIZE = 8

def under_attack(col, queens):
    left = right = col

    for r, c in reversed(queens):
        left, right = left - 1, right + 1

        if c in (left, col, right):
            return True
    return False

def solve(n):
    if n == 0:
        return [[]]

    smaller_solutions = solve(n - 1)

    return [solution+[(n,i+1)]
        for i in xrange(BOARD_SIZE)
            for solution in smaller_solutions
                if not under_attack(i+1, solution)]
for answer in solve(BOARD_SIZE):
    print answer

我熟悉一些实验和我上过的课程中问题的递归解决方案,但我对 python 整体还是很陌生(我主要在课堂上和自己使用过 java 和 C)。

有没有人有一个很好的方法来解释这个语法是如何工作的,或者我可以学习其他可以帮助我理解它的例子?这真的勾起了我的好奇心……

【问题讨论】:

@DanielRoseman:这不是无效的语法。这是一个复杂的列表生成器内部 return 只是一个分成多行的列表理解,可能是为了“可读性”。 @justhalf 是的,刚刚注意到。 IMO 这是 Python wiki 上一个非常可怕的例子,而不是你在真正的 Python 编程中做过的事情。 【参考方案1】:

我猜你的困惑是这行代码:

       v---- this starts the list
return [solution+[(n,i+1)]
        for i in xrange(BOARD_SIZE)
            for solution in smaller_solutions
                if not under_attack(i+1, solution)]
                                                  ^-- this ends the list

这实际上是一个list comprehension,一种创建列表的快捷方式。

这是该循环的简写版本。

x = []
for i in xrange(BOARD_SIZE):
    for solution in smaller_solutions:
        if not under_attack(i+1, solution):
            x.append(solution+[(n, i+1)])
return x

【讨论】:

@DanielRoseman:一旦你习惯了它,它的可读性差别不大。而且理解速度更快。 啊哈!手写的很清楚,非常感谢。【参考方案2】:

您在询问列表推导。这是 Python 执行功能映射(将函数应用于列表的每个元素)和过滤器(在特定条件下过滤列表)的方式。

用一些例子来解释这一点最简单的方法。

说:

>>> l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> [2 * i for i in l]
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
>>> [i for i in l if i > 5]
[6, 7, 8, 9, 10]

现在这些可以组合起来,你可以使用任意数量的for:

>>> # squares of even numbers below 10
>>> [i * i for i in range(10) if i%2 == 0]
[0, 4, 16, 36, 64]
>>> # concatenating all lists
>>> ll = [[1, 2], [3, 4], [5, 6], [7, 8], [8, 10]]
>>> [i for l in ll for i in l]
[1, 2, 3, 4, 5, 6, 7, 8, 8, 10]

【讨论】:

以上是关于这个 return 语句究竟指示程序做啥?的主要内容,如果未能解决你的问题,请参考以下文章

SOD女子社员究竟做啥?

《javascript高级程序设计》笔记:continue / break 和 return

这段代码中的 lambda 函数在做啥? [复制]

在看了案例二中的BP神经网络训练及预测代码后,我开始不明白BP神经网络究竟能做啥了。。。 程序最后得到

惰性变量定义后括号做啥?

这个@synthesize 语句在做啥?